diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index ef658d87dff..a29e3f0f05b 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -401,6 +401,14 @@ "ImportPath": "github.com/clusterhq/flocker-go", "Rev": "2b8b7259d3139c96c4a6871031355808ab3fd3b3" }, + { + "ImportPath": "github.com/codedellemc/goscaleio", + "Rev": "8ed64a07d23f79bab973f1630651841ccc656887" + }, + { + "ImportPath": "github.com/codedellemc/goscaleio/types/v1", + "Rev": "8ed64a07d23f79bab973f1630651841ccc656887" + }, { "ImportPath": "github.com/codegangsta/negroni", "Comment": "v0.1.0-62-g8d75e11", diff --git a/Godeps/LICENSES b/Godeps/LICENSES index 5c7ca6626c0..cc6d45c7a2b 100644 --- a/Godeps/LICENSES +++ b/Godeps/LICENSES @@ -11475,6 +11475,426 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================================================ +================================================================================ += vendor/github.com/codedellemc/goscaleio licensed under: = + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + += vendor/github.com/codedellemc/goscaleio/LICENSE d2794c0df5b907fdace235a619d80314 - +================================================================================ + + +================================================================================ += vendor/github.com/codedellemc/goscaleio/types/v1 licensed under: = + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + += vendor/github.com/codedellemc/goscaleio/LICENSE d2794c0df5b907fdace235a619d80314 - +================================================================================ + + ================================================================================ = vendor/github.com/codegangsta/negroni licensed under: = diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 59325e8f27b..3374de81d99 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -40590,6 +40590,10 @@ "description": "RBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: http://releases.k8s.io/HEAD/examples/volumes/rbd/README.md", "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.RBDVolumeSource" }, + "scaleIO": { + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ScaleIOVolumeSource" + }, "storageClassName": { "description": "Name of StorageClass to which this persistent volume belongs. Empty value means that this volume does not belong to any StorageClass.", "type": "string" @@ -41567,6 +41571,56 @@ } } }, + "io.k8s.kubernetes.pkg.api.v1.ScaleIOVolumeSource": { + "description": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "required": [ + "gateway", + "system", + "secretRef" + ], + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "type": "string" + }, + "gateway": { + "description": "The host address of the ScaleIO API Gateway.", + "type": "string" + }, + "protectionDomain": { + "description": "The name of the Protection Domain for the configured storage (defaults to \"default\").", + "type": "string" + }, + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretRef": { + "description": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.LocalObjectReference" + }, + "sslEnabled": { + "description": "Flag to enable/disable SSL communication with Gateway, default false", + "type": "boolean" + }, + "storageMode": { + "description": "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\").", + "type": "string" + }, + "storagePool": { + "description": "The Storage Pool associated with the protection domain (defaults to \"default\").", + "type": "string" + }, + "system": { + "description": "The name of the storage system as configured in ScaleIO.", + "type": "string" + }, + "volumeName": { + "description": "The name of a volume already created in the ScaleIO system that is associated with this volume source.", + "type": "string" + } + } + }, "io.k8s.kubernetes.pkg.api.v1.Secret": { "description": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", "properties": { @@ -42158,6 +42212,10 @@ "description": "RBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: http://releases.k8s.io/HEAD/examples/volumes/rbd/README.md", "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.RBDVolumeSource" }, + "scaleIO": { + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ScaleIOVolumeSource" + }, "secret": { "description": "Secret represents a secret that should populate this volume. More info: http://kubernetes.io/docs/user-guide/volumes#secrets", "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.SecretVolumeSource" diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 92043cafe95..9bc04dfeeb2 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -2722,6 +2722,10 @@ "portworxVolume": { "$ref": "v1.PortworxVolumeSource", "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine" + }, + "scaleIO": { + "$ref": "v1.ScaleIOVolumeSource", + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes." } } }, @@ -3502,6 +3506,57 @@ } } }, + "v1.ScaleIOVolumeSource": { + "id": "v1.ScaleIOVolumeSource", + "description": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "required": [ + "gateway", + "system", + "secretRef" + ], + "properties": { + "gateway": { + "type": "string", + "description": "The host address of the ScaleIO API Gateway." + }, + "system": { + "type": "string", + "description": "The name of the storage system as configured in ScaleIO." + }, + "secretRef": { + "$ref": "v1.LocalObjectReference", + "description": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail." + }, + "sslEnabled": { + "type": "boolean", + "description": "Flag to enable/disable SSL communication with Gateway, default false" + }, + "protectionDomain": { + "type": "string", + "description": "The name of the Protection Domain for the configured storage (defaults to \"default\")." + }, + "storagePool": { + "type": "string", + "description": "The Storage Pool associated with the protection domain (defaults to \"default\")." + }, + "storageMode": { + "type": "string", + "description": "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\")." + }, + "volumeName": { + "type": "string", + "description": "The name of a volume already created in the ScaleIO system that is associated with this volume source." + }, + "fsType": { + "type": "string", + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "readOnly": { + "type": "boolean", + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + } + } + }, "v1.Container": { "id": "v1.Container", "description": "A single application container that you want to run within a pod.", diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json index 32434755d40..ed805e1f308 100644 --- a/api/swagger-spec/batch_v1.json +++ b/api/swagger-spec/batch_v1.json @@ -1505,6 +1505,10 @@ "portworxVolume": { "$ref": "v1.PortworxVolumeSource", "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine" + }, + "scaleIO": { + "$ref": "v1.ScaleIOVolumeSource", + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes." } } }, @@ -2285,6 +2289,57 @@ } } }, + "v1.ScaleIOVolumeSource": { + "id": "v1.ScaleIOVolumeSource", + "description": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "required": [ + "gateway", + "system", + "secretRef" + ], + "properties": { + "gateway": { + "type": "string", + "description": "The host address of the ScaleIO API Gateway." + }, + "system": { + "type": "string", + "description": "The name of the storage system as configured in ScaleIO." + }, + "secretRef": { + "$ref": "v1.LocalObjectReference", + "description": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail." + }, + "sslEnabled": { + "type": "boolean", + "description": "Flag to enable/disable SSL communication with Gateway, default false" + }, + "protectionDomain": { + "type": "string", + "description": "The name of the Protection Domain for the configured storage (defaults to \"default\")." + }, + "storagePool": { + "type": "string", + "description": "The Storage Pool associated with the protection domain (defaults to \"default\")." + }, + "storageMode": { + "type": "string", + "description": "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\")." + }, + "volumeName": { + "type": "string", + "description": "The name of a volume already created in the ScaleIO system that is associated with this volume source." + }, + "fsType": { + "type": "string", + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "readOnly": { + "type": "boolean", + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + } + } + }, "v1.Container": { "id": "v1.Container", "description": "A single application container that you want to run within a pod.", diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index 129c718f6d2..975234f4436 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -6969,6 +6969,10 @@ "portworxVolume": { "$ref": "v1.PortworxVolumeSource", "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine" + }, + "scaleIO": { + "$ref": "v1.ScaleIOVolumeSource", + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes." } } }, @@ -7749,6 +7753,57 @@ } } }, + "v1.ScaleIOVolumeSource": { + "id": "v1.ScaleIOVolumeSource", + "description": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "required": [ + "gateway", + "system", + "secretRef" + ], + "properties": { + "gateway": { + "type": "string", + "description": "The host address of the ScaleIO API Gateway." + }, + "system": { + "type": "string", + "description": "The name of the storage system as configured in ScaleIO." + }, + "secretRef": { + "$ref": "v1.LocalObjectReference", + "description": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail." + }, + "sslEnabled": { + "type": "boolean", + "description": "Flag to enable/disable SSL communication with Gateway, default false" + }, + "protectionDomain": { + "type": "string", + "description": "The name of the Protection Domain for the configured storage (defaults to \"default\")." + }, + "storagePool": { + "type": "string", + "description": "The Storage Pool associated with the protection domain (defaults to \"default\")." + }, + "storageMode": { + "type": "string", + "description": "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\")." + }, + "volumeName": { + "type": "string", + "description": "The name of a volume already created in the ScaleIO system that is associated with this volume source." + }, + "fsType": { + "type": "string", + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "readOnly": { + "type": "boolean", + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + } + } + }, "v1.Container": { "id": "v1.Container", "description": "A single application container that you want to run within a pod.", diff --git a/api/swagger-spec/settings.k8s.io_v1alpha1.json b/api/swagger-spec/settings.k8s.io_v1alpha1.json index c0b660bfdcc..ed8d9142da5 100644 --- a/api/swagger-spec/settings.k8s.io_v1alpha1.json +++ b/api/swagger-spec/settings.k8s.io_v1alpha1.json @@ -1377,6 +1377,10 @@ "portworxVolume": { "$ref": "v1.PortworxVolumeSource", "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine" + }, + "scaleIO": { + "$ref": "v1.ScaleIOVolumeSource", + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes." } } }, @@ -2119,6 +2123,57 @@ } } }, + "v1.ScaleIOVolumeSource": { + "id": "v1.ScaleIOVolumeSource", + "description": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "required": [ + "gateway", + "system", + "secretRef" + ], + "properties": { + "gateway": { + "type": "string", + "description": "The host address of the ScaleIO API Gateway." + }, + "system": { + "type": "string", + "description": "The name of the storage system as configured in ScaleIO." + }, + "secretRef": { + "$ref": "v1.LocalObjectReference", + "description": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail." + }, + "sslEnabled": { + "type": "boolean", + "description": "Flag to enable/disable SSL communication with Gateway, default false" + }, + "protectionDomain": { + "type": "string", + "description": "The name of the Protection Domain for the configured storage (defaults to \"default\")." + }, + "storagePool": { + "type": "string", + "description": "The Storage Pool associated with the protection domain (defaults to \"default\")." + }, + "storageMode": { + "type": "string", + "description": "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\")." + }, + "volumeName": { + "type": "string", + "description": "The name of a volume already created in the ScaleIO system that is associated with this volume source." + }, + "fsType": { + "type": "string", + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "readOnly": { + "type": "boolean", + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + } + } + }, "v1.VolumeMount": { "id": "v1.VolumeMount", "description": "VolumeMount describes a mounting of a Volume within a container.", diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 596a25328ca..02a6eb1bdc3 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -18013,6 +18013,10 @@ "$ref": "v1.PortworxVolumeSource", "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine" }, + "scaleIO": { + "$ref": "v1.ScaleIOVolumeSource", + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes." + }, "accessModes": { "type": "array", "items": { @@ -18512,6 +18516,57 @@ } } }, + "v1.ScaleIOVolumeSource": { + "id": "v1.ScaleIOVolumeSource", + "description": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "required": [ + "gateway", + "system", + "secretRef" + ], + "properties": { + "gateway": { + "type": "string", + "description": "The host address of the ScaleIO API Gateway." + }, + "system": { + "type": "string", + "description": "The name of the storage system as configured in ScaleIO." + }, + "secretRef": { + "$ref": "v1.LocalObjectReference", + "description": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail." + }, + "sslEnabled": { + "type": "boolean", + "description": "Flag to enable/disable SSL communication with Gateway, default false" + }, + "protectionDomain": { + "type": "string", + "description": "The name of the Protection Domain for the configured storage (defaults to \"default\")." + }, + "storagePool": { + "type": "string", + "description": "The Storage Pool associated with the protection domain (defaults to \"default\")." + }, + "storageMode": { + "type": "string", + "description": "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\")." + }, + "volumeName": { + "type": "string", + "description": "The name of a volume already created in the ScaleIO system that is associated with this volume source." + }, + "fsType": { + "type": "string", + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "readOnly": { + "type": "boolean", + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + } + } + }, "v1.PersistentVolumeStatus": { "id": "v1.PersistentVolumeStatus", "description": "PersistentVolumeStatus is the current status of a persistent volume.", @@ -18808,6 +18863,10 @@ "portworxVolume": { "$ref": "v1.PortworxVolumeSource", "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine" + }, + "scaleIO": { + "$ref": "v1.ScaleIOVolumeSource", + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes." } } }, diff --git a/cmd/kube-controller-manager/app/BUILD b/cmd/kube-controller-manager/app/BUILD index 7e910f6fb0f..e41a72915c8 100644 --- a/cmd/kube-controller-manager/app/BUILD +++ b/cmd/kube-controller-manager/app/BUILD @@ -87,6 +87,7 @@ go_library( "//pkg/volume/portworx:go_default_library", "//pkg/volume/quobyte:go_default_library", "//pkg/volume/rbd:go_default_library", + "//pkg/volume/scaleio:go_default_library", "//pkg/volume/vsphere_volume:go_default_library", "//vendor:github.com/golang/glog", "//vendor:github.com/prometheus/client_golang/prometheus", diff --git a/cmd/kube-controller-manager/app/plugins.go b/cmd/kube-controller-manager/app/plugins.go index d924071709c..d9dd42a755b 100644 --- a/cmd/kube-controller-manager/app/plugins.go +++ b/cmd/kube-controller-manager/app/plugins.go @@ -53,6 +53,7 @@ import ( "k8s.io/kubernetes/pkg/volume/portworx" "k8s.io/kubernetes/pkg/volume/quobyte" "k8s.io/kubernetes/pkg/volume/rbd" + "k8s.io/kubernetes/pkg/volume/scaleio" "k8s.io/kubernetes/pkg/volume/vsphere_volume" ) @@ -73,6 +74,7 @@ func ProbeAttachableVolumePlugins(config componentconfig.VolumeConfiguration) [] allPlugins = append(allPlugins, vsphere_volume.ProbeVolumePlugins()...) allPlugins = append(allPlugins, azure_dd.ProbeVolumePlugins()...) allPlugins = append(allPlugins, photon_pd.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...) return allPlugins } @@ -118,6 +120,7 @@ func ProbeControllerVolumePlugins(cloud cloudprovider.Interface, config componen allPlugins = append(allPlugins, flocker.ProbeVolumePlugins()...) allPlugins = append(allPlugins, portworx.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...) if cloud != nil { switch { diff --git a/cmd/kubelet/app/BUILD b/cmd/kubelet/app/BUILD index 41fd433115f..c68f6115a52 100644 --- a/cmd/kubelet/app/BUILD +++ b/cmd/kubelet/app/BUILD @@ -94,6 +94,7 @@ go_library( "//pkg/volume/projected:go_default_library", "//pkg/volume/quobyte:go_default_library", "//pkg/volume/rbd:go_default_library", + "//pkg/volume/scaleio:go_default_library", "//pkg/volume/secret:go_default_library", "//pkg/volume/vsphere_volume:go_default_library", "//vendor:github.com/golang/glog", diff --git a/cmd/kubelet/app/plugins.go b/cmd/kubelet/app/plugins.go index a6213c8b2e9..a9aea2c365f 100644 --- a/cmd/kubelet/app/plugins.go +++ b/cmd/kubelet/app/plugins.go @@ -50,6 +50,7 @@ import ( "k8s.io/kubernetes/pkg/volume/projected" "k8s.io/kubernetes/pkg/volume/quobyte" "k8s.io/kubernetes/pkg/volume/rbd" + "k8s.io/kubernetes/pkg/volume/scaleio" "k8s.io/kubernetes/pkg/volume/secret" "k8s.io/kubernetes/pkg/volume/vsphere_volume" // Cloud providers @@ -92,6 +93,7 @@ func ProbeVolumePlugins(pluginDir string) []volume.VolumePlugin { allPlugins = append(allPlugins, photon_pd.ProbeVolumePlugins()...) allPlugins = append(allPlugins, projected.ProbeVolumePlugins()...) allPlugins = append(allPlugins, portworx.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...) return allPlugins } diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index 3430f7e8cf3..69802e20ca8 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -3018,6 +3018,13 @@ The StatefulSet guarantees that a given network identity will always map to the

v1.PortworxVolumeSource

+ +

scaleIO

+

ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.

+

false

+

v1.ScaleIOVolumeSource

+ + @@ -3438,68 +3445,6 @@ The StatefulSet guarantees that a given network identity will always map to the - -
-

v1.ContainerPort

-
-

ContainerPort represents a network port in a single container.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

name

If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.

false

string

hostPort

Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.

false

integer (int32)

containerPort

Number of port to expose on the pod’s IP address. This must be a valid port number, 0 < x < 65536.

true

integer (int32)

protocol

Protocol for port. Must be UDP or TCP. Defaults to "TCP".

false

string

hostIP

What host IP to bind the external port to.

false

string

-

v1.PodSpec

@@ -3681,6 +3626,68 @@ The StatefulSet guarantees that a given network identity will always map to the +
+
+

v1.ContainerPort

+
+

ContainerPort represents a network port in a single container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.

false

string

hostPort

Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.

false

integer (int32)

containerPort

Number of port to expose on the pod’s IP address. This must be a valid port number, 0 < x < 65536.

true

integer (int32)

protocol

Protocol for port. Must be UDP or TCP. Defaults to "TCP".

false

string

hostIP

What host IP to bind the external port to.

false

string

+

v1.Lifecycle

@@ -4183,6 +4190,103 @@ Examples:
+
+
+

v1.ScaleIOVolumeSource

+
+

ScaleIOVolumeSource represents a persistent ScaleIO volume

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

gateway

The host address of the ScaleIO API Gateway.

true

string

system

The name of the storage system as configured in ScaleIO.

true

string

secretRef

SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.

true

v1.LocalObjectReference

sslEnabled

Flag to enable/disable SSL communication with Gateway, default false

false

boolean

false

protectionDomain

The name of the Protection Domain for the configured storage (defaults to "default").

false

string

storagePool

The Storage Pool associated with the protection domain (defaults to "default").

false

string

storageMode

Indicates whether the storage for a volume should be thick or thin (defaults to "thin").

false

string

volumeName

The name of a volume already created in the ScaleIO system that is associated with this volume source.

false

string

fsType

Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.

false

string

readOnly

Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.

false

boolean

false

+

v1.PhotonPersistentDiskVolumeSource

@@ -6152,7 +6256,7 @@ Examples:
diff --git a/docs/api-reference/batch/v1/definitions.html b/docs/api-reference/batch/v1/definitions.html index fe6f075ce46..f1679bfc5d8 100755 --- a/docs/api-reference/batch/v1/definitions.html +++ b/docs/api-reference/batch/v1/definitions.html @@ -576,6 +576,103 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } + +
+

v1.ScaleIOVolumeSource

+
+

ScaleIOVolumeSource represents a persistent ScaleIO volume

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

gateway

The host address of the ScaleIO API Gateway.

true

string

system

The name of the storage system as configured in ScaleIO.

true

string

secretRef

SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.

true

v1.LocalObjectReference

sslEnabled

Flag to enable/disable SSL communication with Gateway, default false

false

boolean

false

protectionDomain

The name of the Protection Domain for the configured storage (defaults to "default").

false

string

storagePool

The Storage Pool associated with the protection domain (defaults to "default").

false

string

storageMode

Indicates whether the storage for a volume should be thick or thin (defaults to "thin").

false

string

volumeName

The name of a volume already created in the ScaleIO system that is associated with this volume source.

false

string

fsType

Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.

false

string

readOnly

Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.

false

boolean

false

+

v1.NodeSelectorTerm

@@ -4297,6 +4394,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

v1.PortworxVolumeSource

+ +

scaleIO

+

ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.

+

false

+

v1.ScaleIOVolumeSource

+ + @@ -4753,6 +4857,68 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.ContainerPort

+
+

ContainerPort represents a network port in a single container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.

false

string

hostPort

Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.

false

integer (int32)

containerPort

Number of port to expose on the pod’s IP address. This must be a valid port number, 0 < x < 65536.

true

integer (int32)

protocol

Protocol for port. Must be UDP or TCP. Defaults to "TCP".

false

string

hostIP

What host IP to bind the external port to.

false

string

+

v1.PodSpec

@@ -4934,68 +5100,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1.ContainerPort

-
-

ContainerPort represents a network port in a single container.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

name

If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.

false

string

hostPort

Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.

false

integer (int32)

containerPort

Number of port to expose on the pod’s IP address. This must be a valid port number, 0 < x < 65536.

true

integer (int32)

protocol

Protocol for port. Must be UDP or TCP. Defaults to "TCP".

false

string

hostIP

What host IP to bind the external port to.

false

string

-

v1.Lifecycle

@@ -5394,7 +5498,7 @@ Examples:
diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index 928a9ffd248..98d1ebbf0d5 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -3699,6 +3699,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

v1.PortworxVolumeSource

+ +

scaleIO

+

ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.

+

false

+

v1.ScaleIOVolumeSource

+ + @@ -4229,68 +4236,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i - -
-

v1.ContainerPort

-
-

ContainerPort represents a network port in a single container.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

name

If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.

false

string

hostPort

Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.

false

integer (int32)

containerPort

Number of port to expose on the pod’s IP address. This must be a valid port number, 0 < x < 65536.

true

integer (int32)

protocol

Protocol for port. Must be UDP or TCP. Defaults to "TCP".

false

string

hostIP

What host IP to bind the external port to.

false

string

-

v1.PodSpec

@@ -4472,6 +4417,68 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.ContainerPort

+
+

ContainerPort represents a network port in a single container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.

false

string

hostPort

Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.

false

integer (int32)

containerPort

Number of port to expose on the pod’s IP address. This must be a valid port number, 0 < x < 65536.

true

integer (int32)

protocol

Protocol for port. Must be UDP or TCP. Defaults to "TCP".

false

string

hostIP

What host IP to bind the external port to.

false

string

+

v1.Lifecycle

@@ -4960,6 +4967,103 @@ Examples:
+
+
+

v1.ScaleIOVolumeSource

+
+

ScaleIOVolumeSource represents a persistent ScaleIO volume

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

gateway

The host address of the ScaleIO API Gateway.

true

string

system

The name of the storage system as configured in ScaleIO.

true

string

secretRef

SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.

true

v1.LocalObjectReference

sslEnabled

Flag to enable/disable SSL communication with Gateway, default false

false

boolean

false

protectionDomain

The name of the Protection Domain for the configured storage (defaults to "default").

false

string

storagePool

The Storage Pool associated with the protection domain (defaults to "default").

false

string

storageMode

Indicates whether the storage for a volume should be thick or thin (defaults to "thin").

false

string

volumeName

The name of a volume already created in the ScaleIO system that is associated with this volume source.

false

string

fsType

Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.

false

string

readOnly

Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.

false

boolean

false

+

v1.PhotonPersistentDiskVolumeSource

@@ -5594,40 +5698,6 @@ Examples:

v1.DeletionPropagation

-
-
-

v1.TCPSocketAction

-
-

TCPSocketAction describes an action based on opening a socket

-
- ------- - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

port

Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.

true

string

-

v1beta1.DeploymentStrategy

@@ -5669,6 +5739,40 @@ Examples:
+
+
+

v1.TCPSocketAction

+
+

TCPSocketAction describes an action based on opening a socket

+
+ +++++++ + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

port

Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.

true

string

+

v1beta1.IngressRule

@@ -7799,7 +7903,7 @@ Both these may change in the future. Incoming requests are matched against the h
diff --git a/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html b/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html index 344aa3e3a30..71e33a0d071 100755 --- a/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html +++ b/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html @@ -487,6 +487,103 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +
+
+

v1.ScaleIOVolumeSource

+
+

ScaleIOVolumeSource represents a persistent ScaleIO volume

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

gateway

The host address of the ScaleIO API Gateway.

true

string

system

The name of the storage system as configured in ScaleIO.

true

string

secretRef

SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.

true

v1.LocalObjectReference

sslEnabled

Flag to enable/disable SSL communication with Gateway, default false

false

boolean

false

protectionDomain

The name of the Protection Domain for the configured storage (defaults to "default").

false

string

storagePool

The Storage Pool associated with the protection domain (defaults to "default").

false

string

storageMode

Indicates whether the storage for a volume should be thick or thin (defaults to "thin").

false

string

volumeName

The name of a volume already created in the ScaleIO system that is associated with this volume source.

false

string

fsType

Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.

false

string

readOnly

Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.

false

boolean

false

+

v1.PhotonPersistentDiskVolumeSource

@@ -3202,6 +3299,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

v1.PortworxVolumeSource

+ +

scaleIO

+

ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.

+

false

+

v1.ScaleIOVolumeSource

+ + @@ -3695,7 +3799,7 @@ Examples:
diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index e70a1498078..64e2d522a80 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -4412,6 +4412,13 @@ The resulting set of endpoints can be viewed as:

v1.PortworxVolumeSource

+ +

scaleIO

+

ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.

+

false

+

v1.ScaleIOVolumeSource

+ + @@ -6045,6 +6052,103 @@ Examples:
+ +
+

v1.ScaleIOVolumeSource

+
+

ScaleIOVolumeSource represents a persistent ScaleIO volume

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

gateway

The host address of the ScaleIO API Gateway.

true

string

system

The name of the storage system as configured in ScaleIO.

true

string

secretRef

SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.

true

v1.LocalObjectReference

sslEnabled

Flag to enable/disable SSL communication with Gateway, default false

false

boolean

false

protectionDomain

The name of the Protection Domain for the configured storage (defaults to "default").

false

string

storagePool

The Storage Pool associated with the protection domain (defaults to "default").

false

string

storageMode

Indicates whether the storage for a volume should be thick or thin (defaults to "thin").

false

string

volumeName

The name of a volume already created in the ScaleIO system that is associated with this volume source.

false

string

fsType

Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.

false

string

readOnly

Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.

false

boolean

false

+

v1.Status

@@ -7090,6 +7194,13 @@ Examples:
+

scaleIO

+

ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.

+

false

+

v1.ScaleIOVolumeSource

+ + +

accessModes

AccessModes contains all ways the volume can be mounted. More info: http://kubernetes.io/docs/user-guide/persistent-volumes#access-modes

false

@@ -9732,7 +9843,7 @@ Examples:
diff --git a/examples/volumes/scaleio/README.md b/examples/volumes/scaleio/README.md new file mode 100644 index 00000000000..f6905efef12 --- /dev/null +++ b/examples/volumes/scaleio/README.md @@ -0,0 +1,278 @@ + + + + +WARNING +WARNING +WARNING +WARNING +WARNING + +

PLEASE NOTE: This document applies to the HEAD of the source tree

+ +If you are using a released version of Kubernetes, you should +refer to the docs that go with that version. + +Documentation for other releases can be found at +[releases.k8s.io](http://releases.k8s.io). + +-- + + + + + +# Dell EMC ScaleIO Volume Plugin for Kubernetes + +This document shows how to configure Kubernetes resources to consume storage from volumes hosted on ScaleIO cluster. + +## Pre-Requisites + +* Kubernetes ver 1.6 or later +* ScaleIO ver 2.0 or later +* A ScaleIO cluster with an API gateway +* ScaleIO SDC binary installed/configured on each Kubernetes node that will consume storage + +## ScaleIO Setup + +This document assumes you are familiar with ScaleIO and have a cluster ready to go. If you are *not familiar* with ScaleIO, please review *Learn how to setup a 3-node* [ScaleIO cluster on Vagrant](https://github.com/codedellemc/labs/tree/master/setup-scaleio-vagrant) and see *General instructions on* [setting up ScaleIO](https://www.emc.com/products-solutions/trial-software-download/scaleio.htm) + +For this demonstration, ensure the followings: + + - the ScaleIO `SDC` component is installed and properly configured on all Kubernetes nodes where deployed pods will consume ScaleIO-backed volumes. + - You have a configured ScaleIO gateway that is accessible from the Kubernetes nodes. + +## Deploy Kubernetes Secret for ScaleIO + +The ScaleIO plugin uses Kubernetes Secret object to store the `username` and `password` credentials used to connect to the ScaleIO gateway API server. In this step, let us create a secret object to save the data. To avoid storing secrets in as clear text, let us encode the ScaleIO credentials as `base64` using the following steps. + +``` +$> echo -n "siouser" | base64 +c2lvdXNlcg== +$> echo -n "sc@l3I0" | base64 +c2NAbDNJMA== +``` +The previous will generate `base64-encoded` values for the username and password. Remember to generate the credentials for your own environment (not the username/password shown above) . Next, create a secret file, with the encoded values from above, as shown in the following. + +File: [secret.yaml](secret.yaml) + +``` +apiVersion: v1 +kind: Secret +metadata: + name: sio-secret +type: kubernetes.io/scaleio +data: + username: c2lvdXNlcg== + password: c2NAbDNJMA== +``` + +Notice the name of the secret specified above as `sio-secret`. It will be referred in other YAML files. Next, deploy the secret. + +``` +$ kubectl create -f ./examples/volumes/scaleio/secret.yaml +``` + +## Deploying Pods with Persistent Volumes + +The following example shows how the ScaleIO volume plugin for Kubernetes automatically attach, format, and mount a volume for a deployed pod. This approach requires an existing ScaleIO volume. + +### Create Volume + +Static persistent volumes require that the volume, to be consumed by the pod, be already created in ScaleIO. You can use your ScaleIO tooling to create a new volume or use the name of a volume that already exists in ScaleIO. For this demo, we assume there's a volume named `vol-0`. If you want to use an existing volume, ensure its name is reflected properly in the `volumeName` attribute below. + +### Deploy Pod YAML + +Create a pod YAML file that declares the volume (above) to be used. + +File: [pod.yaml](pod.yaml) + +``` +apiVersion: v1 +kind: Pod +metadata: + name: pod-0 +spec: + containers: + - image: gcr.io/google_containers/test-webserver + name: pod-0 + volumeMounts: + - mountPath: /test-pd + name: vol-0 + volumes: + - name: vol-0 + scaleIO: + gateway: https://localhost:443/api + system: scaleio + volumeName: vol-0 + secretRef: + name: sio-secret + fsType: xfs +``` + +Notice the followings in the previous YAML: + +- Update the `gatewway` to point to your ScaleIO gateway endpoint. +- The `volumeName` attribute refers to the name of an existing volume in ScaleIO. +- The `secretRef` attribute references the name of the secret object deployed earlier. + +Next, deploy the pod. + +``` +$> kubectl create -f examples/volumes/scaleio/pod.yaml +``` +You can verify the pod: +``` +$> kubectl get pod +NAME READY STATUS RESTARTS AGE +pod-0 1/1 Running 0 33s +``` +Or for more detail, use +``` +kubectl describe pod pod-0 +``` +You can see the attached/mapped volume on the node: +``` +$> lsblk +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +... +scinia 252:0 0 8G 0 disk /var/lib/kubelet/pods/135986c7-dcb7-11e6-9fbf-080027c990a7/volumes/kubernetes.io~scaleio/vol-0 +``` + +## StorageClass and Dynamic Provisioning + +In this example, we will see how the ScaleIO volume plugin can automatically provision a new volume as described in a `StorageClass`. + +### StorageClass + +Define a new `StorageClass` as shown in the following YAML. + +File [sc.yaml](sc.yaml) + +``` +kind: StorageClass +apiVersion: storage.k8s.io/v1beta1 +metadata: + name: sio-small +provisioner: kubernetes.io/scaleio +parameters: + gateway: https://localhost:443/api + system: scaleio + protectionDomain: default + secretRef: sio-secret + fsType: xfs +``` + +Note the followings: + +- The `name` attribute is set to `sio-small` . It will be referenced later. +- The `provisioner` attribute is set to `kubernetes.io/scaleio` to trigger the ScaleIO plugin. +- The use of the `parameters:` section in the yaml for configurations. +- The `secretRef` attribute matches the name of the Secret object created earlier. + +Next, deploy the storage class file. + +``` +$> kubectl create -f examples/volumes/scaleio/sc.yaml + +$> kubectl get sc +NAME TYPE +sio-small kubernetes.io/scaleio +``` + +### PVC for the StorageClass + +The next step is to define/deploy a `PeristentVolumeClaim` that will use the StorageClass. + +File [sc-pvc.yaml](sc-pvc.yaml) + +``` +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: pvc-sio-small + annotations: + volume.beta.kubernetes.io/storage-class: sio-small +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi +``` + +Note the `annotations:` entry which specifies annotation `volume.beta.kubernetes.io/storage-class: sio-small` which references the name of the storage class defined earlier. + +Next, we deploy PVC file for the storage class. This step will cause the Kubernetes ScaleIO plugin to create the volume in the storage system. +``` +$> kubectl create -f examples/volumes/scaleio/sc-pvc.yaml +``` +You verify that a new volume created in the ScaleIO dashboard. You can also verify the newly created volume as follows. +``` + kubectl get pvc +NAME STATUS VOLUME CAPACITY ACCESSMODES AGE +pvc-sio-small Bound pvc-5fc78518-dcae-11e6-a263-080027c990a7 10Gi RWO 1h +``` + +###Pod for PVC and SC +At this point, the volume is created (by the claim) in the storage system. To use it, we must define a pod that references the volume as done in this YAML. + +File [pod-sc-pvc.yaml](pod-sc-pvc.yaml) + +``` +kind: Pod +apiVersion: v1 +metadata: + name: pod-sio-small +spec: + containers: + - name: pod-sio-small-container + image: gcr.io/google_containers/test-webserver + volumeMounts: + - mountPath: /test + name: test-data + volumes: + - name: test-data + persistentVolumeClaim: + claimName: pvc-sio-small +``` + +Notice that the `claimName:` attribute refers to the name of the PVC defined and deployed earlier. Next, let us deploy the file. + +``` +$> kubectl create -f examples/volumes/scaleio/pod-sc-pvc.yaml +``` +We can now verify that the new pod is deployed OK. +``` +kubectl get pod +NAME READY STATUS RESTARTS AGE +pod-0 1/1 Running 0 23m +pod-sio-small 1/1 Running 0 5s +``` +You can use the ScaleIO dashboard to verify that the new volume has one attachment. You can verify the volume information for the pod: +``` +$> kubectl describe pod pod-sio-small +... +Volumes: + test-data: + Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) + ClaimName: pvc-sio-small + ReadOnly: false +... +``` +Lastly, you can see the volume's attachment on the Kubernetes node: +``` +$> lsblk +... +scinia 252:0 0 8G 0 disk /var/lib/kubelet/pods/135986c7-dcb7-11e6-9fbf-080027c990a7/volumes/kubernetes.io~scaleio/vol-0 +scinib 252:16 0 16G 0 disk /var/lib/kubelet/pods/62db442e-dcba-11e6-9fbf-080027c990a7/volumes/kubernetes.io~scaleio/sio-5fc9154ddcae11e68db708002 + +``` + +[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/examples/volumes/scaleio/README.md?pixel)]() + diff --git a/examples/volumes/scaleio/pod-sc-pvc.yaml b/examples/volumes/scaleio/pod-sc-pvc.yaml new file mode 100644 index 00000000000..ceed7b567e8 --- /dev/null +++ b/examples/volumes/scaleio/pod-sc-pvc.yaml @@ -0,0 +1,15 @@ +kind: Pod +apiVersion: v1 +metadata: + name: pod-sio-small +spec: + containers: + - name: pod-sio-small-container + image: gcr.io/google_containers/test-webserver + volumeMounts: + - mountPath: /test + name: test-data + volumes: + - name: test-data + persistentVolumeClaim: + claimName: pvc-sio-small diff --git a/examples/volumes/scaleio/pod.yaml b/examples/volumes/scaleio/pod.yaml new file mode 100644 index 00000000000..4b53b2b53cc --- /dev/null +++ b/examples/volumes/scaleio/pod.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Pod +metadata: + name: pod-0 +spec: + containers: + - image: gcr.io/google_containers/test-webserver + name: pod-0 + volumeMounts: + - mountPath: /test-pd + name: vol-0 + volumes: + - name: vol-0 + scaleIO: + gateway: https://localhost:443/api + system: scaleio + volumeName: vol-0 + secretRef: + name: sio-secret + fsType: xfs diff --git a/examples/volumes/scaleio/sc-pvc.yaml b/examples/volumes/scaleio/sc-pvc.yaml new file mode 100644 index 00000000000..3937a1e8254 --- /dev/null +++ b/examples/volumes/scaleio/sc-pvc.yaml @@ -0,0 +1,12 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: pvc-sio-small + annotations: + volume.beta.kubernetes.io/storage-class: sio-small +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi diff --git a/examples/volumes/scaleio/sc.yaml b/examples/volumes/scaleio/sc.yaml new file mode 100644 index 00000000000..85de382bf1b --- /dev/null +++ b/examples/volumes/scaleio/sc.yaml @@ -0,0 +1,11 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1beta1 +metadata: + name: sio-small +provisioner: kubernetes.io/scaleio +parameters: + gateway: https://localhost:443/api + system: scaleio + protectionDomain: default + secretRef: sio-secret + fsType: xfs diff --git a/examples/volumes/scaleio/secret.yaml b/examples/volumes/scaleio/secret.yaml new file mode 100644 index 00000000000..b2fad68afab --- /dev/null +++ b/examples/volumes/scaleio/secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: sio-secret +type: kubernetes.io/scaleio +data: + username: YWRtaW4= + password: c0NhbGVpbzEyMw== diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index 49d56657d91..86b385f8929 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -12961,6 +12961,56 @@ } } }, + "io.k8s.kubernetes.pkg.api.v1.ScaleIOVolumeSource": { + "description": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "required": [ + "gateway", + "system", + "secretRef" + ], + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "type": "string" + }, + "gateway": { + "description": "The host address of the ScaleIO API Gateway.", + "type": "string" + }, + "protectionDomain": { + "description": "The name of the Protection Domain for the configured storage (defaults to \"default\").", + "type": "string" + }, + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretRef": { + "description": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.LocalObjectReference" + }, + "sslEnabled": { + "description": "Flag to enable/disable SSL communication with Gateway, default false", + "type": "boolean" + }, + "storageMode": { + "description": "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\").", + "type": "string" + }, + "storagePool": { + "description": "The Storage Pool associated with the protection domain (defaults to \"default\").", + "type": "string" + }, + "system": { + "description": "The name of the storage system as configured in ScaleIO.", + "type": "string" + }, + "volumeName": { + "description": "The name of a volume already created in the ScaleIO system that is associated with this volume source.", + "type": "string" + } + } + }, "io.k8s.kubernetes.pkg.api.v1.Secret": { "description": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", "properties": { @@ -13451,6 +13501,10 @@ "description": "RBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: http://releases.k8s.io/HEAD/examples/volumes/rbd/README.md", "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.RBDVolumeSource" }, + "scaleIO": { + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ScaleIOVolumeSource" + }, "secret": { "description": "Secret represents a secret that should populate this volume. More info: http://kubernetes.io/docs/user-guide/volumes#secrets", "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.SecretVolumeSource" diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index d2005a29bac..50e6b2cd816 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -84,6 +84,10 @@ func VisitPodSecretNames(pod *api.Pod, visitor func(string) bool) bool { if !visitor(source.Secret.SecretName) { return false } + case source.ScaleIO != nil: + if source.ScaleIO.SecretRef != nil && !visitor(source.ScaleIO.SecretRef.Name) { + return false + } } } return true diff --git a/pkg/api/pod/util_test.go b/pkg/api/pod/util_test.go index e947b03dab6..dc850372c65 100644 --- a/pkg/api/pod/util_test.go +++ b/pkg/api/pod/util_test.go @@ -81,7 +81,11 @@ func TestPodSecrets(t *testing.T) { SecretName: "Spec.Volumes[*].VolumeSource.Secret.SecretName"}}}, { VolumeSource: api.VolumeSource{ Secret: &api.SecretVolumeSource{ - SecretName: "Spec.Volumes[*].VolumeSource.Secret"}}}}, + SecretName: "Spec.Volumes[*].VolumeSource.Secret"}}}, { + VolumeSource: api.VolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{ + SecretRef: &api.LocalObjectReference{ + Name: "Spec.Volumes[*].VolumeSource.ScaleIO.SecretRef"}}}}}, }, } extractedNames := sets.NewString() @@ -109,6 +113,7 @@ func TestPodSecrets(t *testing.T) { "Spec.Volumes[*].VolumeSource.RBD.SecretRef", "Spec.Volumes[*].VolumeSource.Secret", "Spec.Volumes[*].VolumeSource.Secret.SecretName", + "Spec.Volumes[*].VolumeSource.ScaleIO.SecretRef", ) secretPaths := collectSecretPaths(t, nil, "", reflect.TypeOf(&api.Pod{})) secretPaths = secretPaths.Difference(excludedSecretPaths) diff --git a/pkg/api/testing/fuzzer.go b/pkg/api/testing/fuzzer.go index a259a5eb6e6..539e034b858 100644 --- a/pkg/api/testing/fuzzer.go +++ b/pkg/api/testing/fuzzer.go @@ -434,6 +434,24 @@ func coreFuncs(t apitesting.TestingCommon) []interface{} { *obj.ReadOnly = false } }, + func(sio *api.ScaleIOVolumeSource, c fuzz.Continue) { + sio.ProtectionDomain = c.RandString() + if sio.ProtectionDomain == "" { + sio.ProtectionDomain = "default" + } + sio.StoragePool = c.RandString() + if sio.StoragePool == "" { + sio.StoragePool = "default" + } + sio.StorageMode = c.RandString() + if sio.StorageMode == "" { + sio.StorageMode = "ThinProvisioned" + } + sio.FSType = c.RandString() + if sio.FSType == "" { + sio.FSType = "xfs" + } + }, func(s *api.NamespaceSpec, c fuzz.Continue) { s.Finalizers = []api.FinalizerName{api.FinalizerKubernetes} }, diff --git a/pkg/api/types.go b/pkg/api/types.go index 1b910e3e4ac..f95c5337f0c 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -299,6 +299,9 @@ type VolumeSource struct { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional PortworxVolume *PortworxVolumeSource + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + ScaleIO *ScaleIOVolumeSource } // Similar to VolumeSource but meant for the administrator who creates PVs. @@ -364,6 +367,9 @@ type PersistentVolumeSource struct { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional PortworxVolume *PortworxVolumeSource + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + ScaleIO *ScaleIOVolumeSource } type PersistentVolumeClaimVolumeSource struct { @@ -1056,6 +1062,41 @@ type AzureDiskVolumeSource struct { ReadOnly *bool } +// ScaleIOVolumeSource represents a persistent ScaleIO volume +type ScaleIOVolumeSource struct { + // The host address of the ScaleIO API Gateway. + Gateway string + // The name of the storage system as configured in ScaleIO. + System string + // SecretRef references to the secret for ScaleIO user and other + // sensitive information. If this is not provided, Login operation will fail. + SecretRef *LocalObjectReference + // Flag to enable/disable SSL communication with Gateway, default false + // +optional + SSLEnabled bool + // The name of the Protection Domain for the configured storage (defaults to "default"). + // +optional + ProtectionDomain string + // The Storage Pool associated with the protection domain (defaults to "default"). + // +optional + StoragePool string + // Indicates whether the storage for a volume should be thick or thin (defaults to "thin"). + // +optional + StorageMode string + // The name of a volume already created in the ScaleIO system + // that is associated with this volume source. + VolumeName string + // Filesystem type to mount. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // +optional + FSType string + // Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + ReadOnly bool +} + // Adapts a ConfigMap into a volume. // // The contents of the target ConfigMap's Data field will be presented in a diff --git a/pkg/api/v1/defaults.go b/pkg/api/v1/defaults.go index 632430fcd7e..32b1ade08ee 100644 --- a/pkg/api/v1/defaults.go +++ b/pkg/api/v1/defaults.go @@ -359,3 +359,18 @@ func SetDefaults_RBDVolumeSource(obj *RBDVolumeSource) { obj.Keyring = "/etc/ceph/keyring" } } + +func SetDefaults_ScaleIOVolumeSource(obj *ScaleIOVolumeSource) { + if obj.ProtectionDomain == "" { + obj.ProtectionDomain = "default" + } + if obj.StoragePool == "" { + obj.StoragePool = "default" + } + if obj.StorageMode == "" { + obj.StorageMode = "ThinProvisioned" + } + if obj.FSType == "" { + obj.FSType = "xfs" + } +} diff --git a/pkg/api/v1/generated.pb.go b/pkg/api/v1/generated.pb.go index 68628ec026c..d9638bd1b76 100644 --- a/pkg/api/v1/generated.pb.go +++ b/pkg/api/v1/generated.pb.go @@ -165,6 +165,7 @@ limitations under the License. ResourceQuotaStatus ResourceRequirements SELinuxOptions + ScaleIOVolumeSource Secret SecretEnvSource SecretKeySelector @@ -809,112 +810,116 @@ func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } +func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } +func (*ScaleIOVolumeSource) ProtoMessage() {} +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } + func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{164} + return fileDescriptorGenerated, []int{165} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{165} + return fileDescriptorGenerated, []int{166} } func init() { @@ -1058,6 +1063,7 @@ func init() { proto.RegisterType((*ResourceQuotaStatus)(nil), "k8s.io.kubernetes.pkg.api.v1.ResourceQuotaStatus") proto.RegisterType((*ResourceRequirements)(nil), "k8s.io.kubernetes.pkg.api.v1.ResourceRequirements") proto.RegisterType((*SELinuxOptions)(nil), "k8s.io.kubernetes.pkg.api.v1.SELinuxOptions") + proto.RegisterType((*ScaleIOVolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.ScaleIOVolumeSource") proto.RegisterType((*Secret)(nil), "k8s.io.kubernetes.pkg.api.v1.Secret") proto.RegisterType((*SecretEnvSource)(nil), "k8s.io.kubernetes.pkg.api.v1.SecretEnvSource") proto.RegisterType((*SecretKeySelector)(nil), "k8s.io.kubernetes.pkg.api.v1.SecretKeySelector") @@ -5482,6 +5488,18 @@ func (m *PersistentVolumeSource) MarshalTo(data []byte) (int, error) { } i += n110 } + if m.ScaleIO != nil { + data[i] = 0x9a + i++ + data[i] = 0x1 + i++ + i = encodeVarintGenerated(data, i, uint64(m.ScaleIO.Size())) + n111, err := m.ScaleIO.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n111 + } return i, nil } @@ -5515,21 +5533,21 @@ func (m *PersistentVolumeSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n111, err := (&v).MarshalTo(data[i:]) + n112, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n111 + i += n112 } } data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PersistentVolumeSource.Size())) - n112, err := m.PersistentVolumeSource.MarshalTo(data[i:]) + n113, err := m.PersistentVolumeSource.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n112 + i += n113 if len(m.AccessModes) > 0 { for _, s := range m.AccessModes { data[i] = 0x1a @@ -5549,11 +5567,11 @@ func (m *PersistentVolumeSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.ClaimRef.Size())) - n113, err := m.ClaimRef.MarshalTo(data[i:]) + n114, err := m.ClaimRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n113 + i += n114 } data[i] = 0x2a i++ @@ -5640,27 +5658,27 @@ func (m *Pod) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n114, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n114 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n115, err := m.Spec.MarshalTo(data[i:]) + n115, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n115 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n116, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n116, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n116 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n117, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n117 return i, nil } @@ -5725,11 +5743,11 @@ func (m *PodAffinityTerm) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LabelSelector.Size())) - n117, err := m.LabelSelector.MarshalTo(data[i:]) + n118, err := m.LabelSelector.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n117 + i += n118 } if len(m.Namespaces) > 0 { for _, s := range m.Namespaces { @@ -5875,19 +5893,19 @@ func (m *PodCondition) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.LastProbeTime.Size())) - n118, err := m.LastProbeTime.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n118 - data[i] = 0x22 - i++ - i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) - n119, err := m.LastTransitionTime.MarshalTo(data[i:]) + n119, err := m.LastProbeTime.MarshalTo(data[i:]) if err != nil { return 0, err } i += n119 + data[i] = 0x22 + i++ + i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) + n120, err := m.LastTransitionTime.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n120 data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -5986,11 +6004,11 @@ func (m *PodList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n120, err := m.ListMeta.MarshalTo(data[i:]) + n121, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n120 + i += n121 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -6050,11 +6068,11 @@ func (m *PodLogOptions) MarshalTo(data []byte) (int, error) { data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(m.SinceTime.Size())) - n121, err := m.SinceTime.MarshalTo(data[i:]) + n122, err := m.SinceTime.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n121 + i += n122 } data[i] = 0x30 i++ @@ -6143,11 +6161,11 @@ func (m *PodSecurityContext) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.SELinuxOptions.Size())) - n122, err := m.SELinuxOptions.MarshalTo(data[i:]) + n123, err := m.SELinuxOptions.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n122 + i += n123 } if m.RunAsUser != nil { data[i] = 0x10 @@ -6198,11 +6216,11 @@ func (m *PodSignature) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.PodController.Size())) - n123, err := m.PodController.MarshalTo(data[i:]) + n124, err := m.PodController.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n123 + i += n124 } return i, nil } @@ -6321,11 +6339,11 @@ func (m *PodSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x72 i++ i = encodeVarintGenerated(data, i, uint64(m.SecurityContext.Size())) - n124, err := m.SecurityContext.MarshalTo(data[i:]) + n125, err := m.SecurityContext.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n124 + i += n125 } if len(m.ImagePullSecrets) > 0 { for _, msg := range m.ImagePullSecrets { @@ -6357,11 +6375,11 @@ func (m *PodSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.Affinity.Size())) - n125, err := m.Affinity.MarshalTo(data[i:]) + n126, err := m.Affinity.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n125 + i += n126 } data[i] = 0x9a i++ @@ -6463,11 +6481,11 @@ func (m *PodStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x3a i++ i = encodeVarintGenerated(data, i, uint64(m.StartTime.Size())) - n126, err := m.StartTime.MarshalTo(data[i:]) + n127, err := m.StartTime.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n126 + i += n127 } if len(m.ContainerStatuses) > 0 { for _, msg := range m.ContainerStatuses { @@ -6518,19 +6536,19 @@ func (m *PodStatusResult) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n127, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n127 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n128, err := m.Status.MarshalTo(data[i:]) + n128, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n128 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n129, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n129 return i, nil } @@ -6552,19 +6570,19 @@ func (m *PodTemplate) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n129, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n129 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Template.Size())) - n130, err := m.Template.MarshalTo(data[i:]) + n130, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n130 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Template.Size())) + n131, err := m.Template.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n131 return i, nil } @@ -6586,11 +6604,11 @@ func (m *PodTemplateList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n131, err := m.ListMeta.MarshalTo(data[i:]) + n132, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n131 + i += n132 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -6624,19 +6642,19 @@ func (m *PodTemplateSpec) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n132, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n132 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n133, err := m.Spec.MarshalTo(data[i:]) + n133, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n133 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n134, err := m.Spec.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n134 return i, nil } @@ -6716,19 +6734,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.PodSignature.Size())) - n134, err := m.PodSignature.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n134 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.EvictionTime.Size())) - n135, err := m.EvictionTime.MarshalTo(data[i:]) + n135, err := m.PodSignature.MarshalTo(data[i:]) if err != nil { return 0, err } i += n135 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.EvictionTime.Size())) + n136, err := m.EvictionTime.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n136 data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -6761,11 +6779,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Preference.Size())) - n136, err := m.Preference.MarshalTo(data[i:]) + n137, err := m.Preference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n136 + i += n137 return i, nil } @@ -6787,11 +6805,11 @@ func (m *Probe) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Handler.Size())) - n137, err := m.Handler.MarshalTo(data[i:]) + n138, err := m.Handler.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n137 + i += n138 data[i] = 0x10 i++ i = encodeVarintGenerated(data, i, uint64(m.InitialDelaySeconds)) @@ -6941,11 +6959,11 @@ func (m *RBDVolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x3a i++ i = encodeVarintGenerated(data, i, uint64(m.SecretRef.Size())) - n138, err := m.SecretRef.MarshalTo(data[i:]) + n139, err := m.SecretRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n138 + i += n139 } data[i] = 0x40 i++ @@ -6976,11 +6994,11 @@ func (m *RangeAllocation) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n139, err := m.ObjectMeta.MarshalTo(data[i:]) + n140, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n139 + i += n140 data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Range))) @@ -7012,27 +7030,27 @@ func (m *ReplicationController) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n140, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n140 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n141, err := m.Spec.MarshalTo(data[i:]) + n141, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n141 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n142, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n142, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n142 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n143, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n143 return i, nil } @@ -7062,11 +7080,11 @@ func (m *ReplicationControllerCondition) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) - n143, err := m.LastTransitionTime.MarshalTo(data[i:]) + n144, err := m.LastTransitionTime.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n143 + i += n144 data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -7096,11 +7114,11 @@ func (m *ReplicationControllerList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n144, err := m.ListMeta.MarshalTo(data[i:]) + n145, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n144 + i += n145 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7157,11 +7175,11 @@ func (m *ReplicationControllerSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.Template.Size())) - n145, err := m.Template.MarshalTo(data[i:]) + n146, err := m.Template.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n145 + i += n146 } data[i] = 0x20 i++ @@ -7240,11 +7258,11 @@ func (m *ResourceFieldSelector) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.Divisor.Size())) - n146, err := m.Divisor.MarshalTo(data[i:]) + n147, err := m.Divisor.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n146 + i += n147 return i, nil } @@ -7266,27 +7284,27 @@ func (m *ResourceQuota) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n147, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n147 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n148, err := m.Spec.MarshalTo(data[i:]) + n148, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n148 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n149, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n149, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n149 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n150, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n150 return i, nil } @@ -7308,11 +7326,11 @@ func (m *ResourceQuotaList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n150, err := m.ListMeta.MarshalTo(data[i:]) + n151, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n150 + i += n151 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7358,11 +7376,11 @@ func (m *ResourceQuotaSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n151, err := (&v).MarshalTo(data[i:]) + n152, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n151 + i += n152 } } if len(m.Scopes) > 0 { @@ -7413,11 +7431,11 @@ func (m *ResourceQuotaStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n152, err := (&v).MarshalTo(data[i:]) + n153, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n152 + i += n153 } } if len(m.Used) > 0 { @@ -7435,11 +7453,11 @@ func (m *ResourceQuotaStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n153, err := (&v).MarshalTo(data[i:]) + n154, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n153 + i += n154 } } return i, nil @@ -7475,11 +7493,11 @@ func (m *ResourceRequirements) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n154, err := (&v).MarshalTo(data[i:]) + n155, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n154 + i += n155 } } if len(m.Requests) > 0 { @@ -7497,11 +7515,11 @@ func (m *ResourceRequirements) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n155, err := (&v).MarshalTo(data[i:]) + n156, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n155 + i += n156 } } return i, nil @@ -7541,6 +7559,78 @@ func (m *SELinuxOptions) MarshalTo(data []byte) (int, error) { return i, nil } +func (m *ScaleIOVolumeSource) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *ScaleIOVolumeSource) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.Gateway))) + i += copy(data[i:], m.Gateway) + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.System))) + i += copy(data[i:], m.System) + if m.SecretRef != nil { + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.SecretRef.Size())) + n157, err := m.SecretRef.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n157 + } + data[i] = 0x20 + i++ + if m.SSLEnabled { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + data[i] = 0x2a + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.ProtectionDomain))) + i += copy(data[i:], m.ProtectionDomain) + data[i] = 0x32 + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.StoragePool))) + i += copy(data[i:], m.StoragePool) + data[i] = 0x3a + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.StorageMode))) + i += copy(data[i:], m.StorageMode) + data[i] = 0x42 + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.VolumeName))) + i += copy(data[i:], m.VolumeName) + data[i] = 0x4a + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.FSType))) + i += copy(data[i:], m.FSType) + data[i] = 0x50 + i++ + if m.ReadOnly { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + return i, nil +} + func (m *Secret) Marshal() (data []byte, err error) { size := m.Size() data = make([]byte, size) @@ -7559,11 +7649,11 @@ func (m *Secret) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n156, err := m.ObjectMeta.MarshalTo(data[i:]) + n158, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n156 + i += n158 if len(m.Data) > 0 { for k := range m.Data { data[i] = 0x12 @@ -7623,11 +7713,11 @@ func (m *SecretEnvSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) - n157, err := m.LocalObjectReference.MarshalTo(data[i:]) + n159, err := m.LocalObjectReference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n157 + i += n159 if m.Optional != nil { data[i] = 0x10 i++ @@ -7659,11 +7749,11 @@ func (m *SecretKeySelector) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) - n158, err := m.LocalObjectReference.MarshalTo(data[i:]) + n160, err := m.LocalObjectReference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n158 + i += n160 data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Key))) @@ -7699,11 +7789,11 @@ func (m *SecretList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n159, err := m.ListMeta.MarshalTo(data[i:]) + n161, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n159 + i += n161 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7737,11 +7827,11 @@ func (m *SecretProjection) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) - n160, err := m.LocalObjectReference.MarshalTo(data[i:]) + n162, err := m.LocalObjectReference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n160 + i += n162 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7835,11 +7925,11 @@ func (m *SecurityContext) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Capabilities.Size())) - n161, err := m.Capabilities.MarshalTo(data[i:]) + n163, err := m.Capabilities.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n161 + i += n163 } if m.Privileged != nil { data[i] = 0x10 @@ -7855,11 +7945,11 @@ func (m *SecurityContext) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.SELinuxOptions.Size())) - n162, err := m.SELinuxOptions.MarshalTo(data[i:]) + n164, err := m.SELinuxOptions.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n162 + i += n164 } if m.RunAsUser != nil { data[i] = 0x20 @@ -7907,11 +7997,11 @@ func (m *SerializedReference) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Reference.Size())) - n163, err := m.Reference.MarshalTo(data[i:]) + n165, err := m.Reference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n163 + i += n165 return i, nil } @@ -7933,27 +8023,27 @@ func (m *Service) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n164, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n164 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n165, err := m.Spec.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n165 - data[i] = 0x1a - i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n166, err := m.Status.MarshalTo(data[i:]) + n166, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n166 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n167, err := m.Spec.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n167 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n168, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n168 return i, nil } @@ -7975,11 +8065,11 @@ func (m *ServiceAccount) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n167, err := m.ObjectMeta.MarshalTo(data[i:]) + n169, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n167 + i += n169 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { data[i] = 0x12 @@ -8035,11 +8125,11 @@ func (m *ServiceAccountList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n168, err := m.ListMeta.MarshalTo(data[i:]) + n170, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n168 + i += n170 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -8073,11 +8163,11 @@ func (m *ServiceList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n169, err := m.ListMeta.MarshalTo(data[i:]) + n171, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n169 + i += n171 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -8122,11 +8212,11 @@ func (m *ServicePort) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.TargetPort.Size())) - n170, err := m.TargetPort.MarshalTo(data[i:]) + n172, err := m.TargetPort.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n170 + i += n172 data[i] = 0x28 i++ i = encodeVarintGenerated(data, i, uint64(m.NodePort)) @@ -8285,11 +8375,11 @@ func (m *ServiceStatus) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LoadBalancer.Size())) - n171, err := m.LoadBalancer.MarshalTo(data[i:]) + n173, err := m.LoadBalancer.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n171 + i += n173 return i, nil } @@ -8337,11 +8427,11 @@ func (m *TCPSocketAction) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Port.Size())) - n172, err := m.Port.MarshalTo(data[i:]) + n174, err := m.Port.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n172 + i += n174 return i, nil } @@ -8375,11 +8465,11 @@ func (m *Taint) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.TimeAdded.Size())) - n173, err := m.TimeAdded.MarshalTo(data[i:]) + n175, err := m.TimeAdded.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n173 + i += n175 return i, nil } @@ -8444,11 +8534,11 @@ func (m *Volume) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.VolumeSource.Size())) - n174, err := m.VolumeSource.MarshalTo(data[i:]) + n176, err := m.VolumeSource.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n174 + i += n176 return i, nil } @@ -8509,31 +8599,31 @@ func (m *VolumeProjection) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) - n175, err := m.Secret.MarshalTo(data[i:]) + n177, err := m.Secret.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n175 + i += n177 } if m.DownwardAPI != nil { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.DownwardAPI.Size())) - n176, err := m.DownwardAPI.MarshalTo(data[i:]) + n178, err := m.DownwardAPI.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n176 + i += n178 } if m.ConfigMap != nil { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.ConfigMap.Size())) - n177, err := m.ConfigMap.MarshalTo(data[i:]) + n179, err := m.ConfigMap.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n177 + i += n179 } return i, nil } @@ -8557,163 +8647,163 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.HostPath.Size())) - n178, err := m.HostPath.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n178 - } - if m.EmptyDir != nil { - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.EmptyDir.Size())) - n179, err := m.EmptyDir.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n179 - } - if m.GCEPersistentDisk != nil { - data[i] = 0x1a - i++ - i = encodeVarintGenerated(data, i, uint64(m.GCEPersistentDisk.Size())) - n180, err := m.GCEPersistentDisk.MarshalTo(data[i:]) + n180, err := m.HostPath.MarshalTo(data[i:]) if err != nil { return 0, err } i += n180 } - if m.AWSElasticBlockStore != nil { - data[i] = 0x22 + if m.EmptyDir != nil { + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.AWSElasticBlockStore.Size())) - n181, err := m.AWSElasticBlockStore.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.EmptyDir.Size())) + n181, err := m.EmptyDir.MarshalTo(data[i:]) if err != nil { return 0, err } i += n181 } - if m.GitRepo != nil { - data[i] = 0x2a + if m.GCEPersistentDisk != nil { + data[i] = 0x1a i++ - i = encodeVarintGenerated(data, i, uint64(m.GitRepo.Size())) - n182, err := m.GitRepo.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.GCEPersistentDisk.Size())) + n182, err := m.GCEPersistentDisk.MarshalTo(data[i:]) if err != nil { return 0, err } i += n182 } - if m.Secret != nil { - data[i] = 0x32 + if m.AWSElasticBlockStore != nil { + data[i] = 0x22 i++ - i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) - n183, err := m.Secret.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.AWSElasticBlockStore.Size())) + n183, err := m.AWSElasticBlockStore.MarshalTo(data[i:]) if err != nil { return 0, err } i += n183 } - if m.NFS != nil { - data[i] = 0x3a + if m.GitRepo != nil { + data[i] = 0x2a i++ - i = encodeVarintGenerated(data, i, uint64(m.NFS.Size())) - n184, err := m.NFS.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.GitRepo.Size())) + n184, err := m.GitRepo.MarshalTo(data[i:]) if err != nil { return 0, err } i += n184 } - if m.ISCSI != nil { - data[i] = 0x42 + if m.Secret != nil { + data[i] = 0x32 i++ - i = encodeVarintGenerated(data, i, uint64(m.ISCSI.Size())) - n185, err := m.ISCSI.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) + n185, err := m.Secret.MarshalTo(data[i:]) if err != nil { return 0, err } i += n185 } - if m.Glusterfs != nil { - data[i] = 0x4a + if m.NFS != nil { + data[i] = 0x3a i++ - i = encodeVarintGenerated(data, i, uint64(m.Glusterfs.Size())) - n186, err := m.Glusterfs.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.NFS.Size())) + n186, err := m.NFS.MarshalTo(data[i:]) if err != nil { return 0, err } i += n186 } - if m.PersistentVolumeClaim != nil { - data[i] = 0x52 + if m.ISCSI != nil { + data[i] = 0x42 i++ - i = encodeVarintGenerated(data, i, uint64(m.PersistentVolumeClaim.Size())) - n187, err := m.PersistentVolumeClaim.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.ISCSI.Size())) + n187, err := m.ISCSI.MarshalTo(data[i:]) if err != nil { return 0, err } i += n187 } - if m.RBD != nil { - data[i] = 0x5a + if m.Glusterfs != nil { + data[i] = 0x4a i++ - i = encodeVarintGenerated(data, i, uint64(m.RBD.Size())) - n188, err := m.RBD.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Glusterfs.Size())) + n188, err := m.Glusterfs.MarshalTo(data[i:]) if err != nil { return 0, err } i += n188 } - if m.FlexVolume != nil { - data[i] = 0x62 + if m.PersistentVolumeClaim != nil { + data[i] = 0x52 i++ - i = encodeVarintGenerated(data, i, uint64(m.FlexVolume.Size())) - n189, err := m.FlexVolume.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.PersistentVolumeClaim.Size())) + n189, err := m.PersistentVolumeClaim.MarshalTo(data[i:]) if err != nil { return 0, err } i += n189 } - if m.Cinder != nil { - data[i] = 0x6a + if m.RBD != nil { + data[i] = 0x5a i++ - i = encodeVarintGenerated(data, i, uint64(m.Cinder.Size())) - n190, err := m.Cinder.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.RBD.Size())) + n190, err := m.RBD.MarshalTo(data[i:]) if err != nil { return 0, err } i += n190 } - if m.CephFS != nil { - data[i] = 0x72 + if m.FlexVolume != nil { + data[i] = 0x62 i++ - i = encodeVarintGenerated(data, i, uint64(m.CephFS.Size())) - n191, err := m.CephFS.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.FlexVolume.Size())) + n191, err := m.FlexVolume.MarshalTo(data[i:]) if err != nil { return 0, err } i += n191 } - if m.Flocker != nil { - data[i] = 0x7a + if m.Cinder != nil { + data[i] = 0x6a i++ - i = encodeVarintGenerated(data, i, uint64(m.Flocker.Size())) - n192, err := m.Flocker.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Cinder.Size())) + n192, err := m.Cinder.MarshalTo(data[i:]) if err != nil { return 0, err } i += n192 } + if m.CephFS != nil { + data[i] = 0x72 + i++ + i = encodeVarintGenerated(data, i, uint64(m.CephFS.Size())) + n193, err := m.CephFS.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n193 + } + if m.Flocker != nil { + data[i] = 0x7a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Flocker.Size())) + n194, err := m.Flocker.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n194 + } if m.DownwardAPI != nil { data[i] = 0x82 i++ data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.DownwardAPI.Size())) - n193, err := m.DownwardAPI.MarshalTo(data[i:]) + n195, err := m.DownwardAPI.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n193 + i += n195 } if m.FC != nil { data[i] = 0x8a @@ -8721,11 +8811,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.FC.Size())) - n194, err := m.FC.MarshalTo(data[i:]) + n196, err := m.FC.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n194 + i += n196 } if m.AzureFile != nil { data[i] = 0x92 @@ -8733,11 +8823,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.AzureFile.Size())) - n195, err := m.AzureFile.MarshalTo(data[i:]) + n197, err := m.AzureFile.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n195 + i += n197 } if m.ConfigMap != nil { data[i] = 0x9a @@ -8745,11 +8835,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.ConfigMap.Size())) - n196, err := m.ConfigMap.MarshalTo(data[i:]) + n198, err := m.ConfigMap.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n196 + i += n198 } if m.VsphereVolume != nil { data[i] = 0xa2 @@ -8757,11 +8847,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.VsphereVolume.Size())) - n197, err := m.VsphereVolume.MarshalTo(data[i:]) + n199, err := m.VsphereVolume.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n197 + i += n199 } if m.Quobyte != nil { data[i] = 0xaa @@ -8769,11 +8859,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.Quobyte.Size())) - n198, err := m.Quobyte.MarshalTo(data[i:]) + n200, err := m.Quobyte.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n198 + i += n200 } if m.AzureDisk != nil { data[i] = 0xb2 @@ -8781,11 +8871,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.AzureDisk.Size())) - n199, err := m.AzureDisk.MarshalTo(data[i:]) + n201, err := m.AzureDisk.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n199 + i += n201 } if m.PhotonPersistentDisk != nil { data[i] = 0xba @@ -8793,11 +8883,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.PhotonPersistentDisk.Size())) - n200, err := m.PhotonPersistentDisk.MarshalTo(data[i:]) + n202, err := m.PhotonPersistentDisk.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n200 + i += n202 } if m.PortworxVolume != nil { data[i] = 0xc2 @@ -8805,23 +8895,35 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.PortworxVolume.Size())) - n201, err := m.PortworxVolume.MarshalTo(data[i:]) + n203, err := m.PortworxVolume.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n201 + i += n203 } - if m.Projected != nil { + if m.ScaleIO != nil { data[i] = 0xca i++ data[i] = 0x1 i++ - i = encodeVarintGenerated(data, i, uint64(m.Projected.Size())) - n202, err := m.Projected.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.ScaleIO.Size())) + n204, err := m.ScaleIO.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n202 + i += n204 + } + if m.Projected != nil { + data[i] = 0xd2 + i++ + data[i] = 0x1 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Projected.Size())) + n205, err := m.Projected.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n205 } return i, nil } @@ -8873,11 +8975,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PodAffinityTerm.Size())) - n203, err := m.PodAffinityTerm.MarshalTo(data[i:]) + n206, err := m.PodAffinityTerm.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n203 + i += n206 return i, nil } @@ -10550,6 +10652,10 @@ func (m *PersistentVolumeSource) Size() (n int) { l = m.PortworxVolume.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.ScaleIO != nil { + l = m.ScaleIO.Size() + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -11305,6 +11411,32 @@ func (m *SELinuxOptions) Size() (n int) { return n } +func (m *ScaleIOVolumeSource) Size() (n int) { + var l int + _ = l + l = len(m.Gateway) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.System) + n += 1 + l + sovGenerated(uint64(l)) + if m.SecretRef != nil { + l = m.SecretRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + n += 2 + l = len(m.ProtectionDomain) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.StoragePool) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.StorageMode) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.VolumeName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.FSType) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + return n +} + func (m *Secret) Size() (n int) { var l int _ = l @@ -11770,6 +11902,10 @@ func (m *VolumeSource) Size() (n int) { l = m.PortworxVolume.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.ScaleIO != nil { + l = m.ScaleIO.Size() + n += 2 + l + sovGenerated(uint64(l)) + } if m.Projected != nil { l = m.Projected.Size() n += 2 + l + sovGenerated(uint64(l)) @@ -13148,6 +13284,7 @@ func (this *PersistentVolumeSource) String() string { `AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`, `PhotonPersistentDisk:` + strings.Replace(fmt.Sprintf("%v", this.PhotonPersistentDisk), "PhotonPersistentDiskVolumeSource", "PhotonPersistentDiskVolumeSource", 1) + `,`, `PortworxVolume:` + strings.Replace(fmt.Sprintf("%v", this.PortworxVolume), "PortworxVolumeSource", "PortworxVolumeSource", 1) + `,`, + `ScaleIO:` + strings.Replace(fmt.Sprintf("%v", this.ScaleIO), "ScaleIOVolumeSource", "ScaleIOVolumeSource", 1) + `,`, `}`, }, "") return s @@ -13787,6 +13924,25 @@ func (this *SELinuxOptions) String() string { }, "") return s } +func (this *ScaleIOVolumeSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ScaleIOVolumeSource{`, + `Gateway:` + fmt.Sprintf("%v", this.Gateway) + `,`, + `System:` + fmt.Sprintf("%v", this.System) + `,`, + `SecretRef:` + strings.Replace(fmt.Sprintf("%v", this.SecretRef), "LocalObjectReference", "LocalObjectReference", 1) + `,`, + `SSLEnabled:` + fmt.Sprintf("%v", this.SSLEnabled) + `,`, + `ProtectionDomain:` + fmt.Sprintf("%v", this.ProtectionDomain) + `,`, + `StoragePool:` + fmt.Sprintf("%v", this.StoragePool) + `,`, + `StorageMode:` + fmt.Sprintf("%v", this.StorageMode) + `,`, + `VolumeName:` + fmt.Sprintf("%v", this.VolumeName) + `,`, + `FSType:` + fmt.Sprintf("%v", this.FSType) + `,`, + `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, + `}`, + }, "") + return s +} func (this *Secret) String() string { if this == nil { return "nil" @@ -14127,6 +14283,7 @@ func (this *VolumeSource) String() string { `AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`, `PhotonPersistentDisk:` + strings.Replace(fmt.Sprintf("%v", this.PhotonPersistentDisk), "PhotonPersistentDiskVolumeSource", "PhotonPersistentDiskVolumeSource", 1) + `,`, `PortworxVolume:` + strings.Replace(fmt.Sprintf("%v", this.PortworxVolume), "PortworxVolumeSource", "PortworxVolumeSource", 1) + `,`, + `ScaleIO:` + strings.Replace(fmt.Sprintf("%v", this.ScaleIO), "ScaleIOVolumeSource", "ScaleIOVolumeSource", 1) + `,`, `Projected:` + strings.Replace(fmt.Sprintf("%v", this.Projected), "ProjectedVolumeSource", "ProjectedVolumeSource", 1) + `,`, `}`, }, "") @@ -29884,6 +30041,39 @@ func (m *PersistentVolumeSource) Unmarshal(data []byte) error { return err } iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScaleIO", 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 > l { + return io.ErrUnexpectedEOF + } + if m.ScaleIO == nil { + m.ScaleIO = &ScaleIOVolumeSource{} + } + if err := m.ScaleIO.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -37333,6 +37523,332 @@ func (m *SELinuxOptions) Unmarshal(data []byte) error { } return nil } +func (m *ScaleIOVolumeSource) 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: ScaleIOVolumeSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ScaleIOVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Gateway", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Gateway = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field System", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.System = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", 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 > l { + return io.ErrUnexpectedEOF + } + if m.SecretRef == nil { + m.SecretRef = &LocalObjectReference{} + } + if err := m.SecretRef.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SSLEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.SSLEnabled = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProtectionDomain", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProtectionDomain = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoragePool", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StoragePool = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StorageMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StorageMode = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VolumeName = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FSType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FSType = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadOnly = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Secret) Unmarshal(data []byte) error { l := len(data) iNdEx := 0 @@ -41631,6 +42147,39 @@ func (m *VolumeSource) Unmarshal(data []byte) error { } iNdEx = postIndex case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScaleIO", 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 > l { + return io.ErrUnexpectedEOF + } + if m.ScaleIO == nil { + m.ScaleIO = &ScaleIOVolumeSource{} + } + if err := m.ScaleIO.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 26: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Projected", wireType) } @@ -41997,681 +42546,693 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 10815 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x98, 0x66, 0x17, 0x5f, 0xfb, 0xf0, 0xdd, 0x87, 0x3b, 0x82, 0x10, 0x79, 0x38, 0x0e, 0x45, - 0xea, 0x48, 0x1e, 0x01, 0xdd, 0x91, 0x14, 0x4f, 0xa2, 0x42, 0x09, 0xc0, 0x02, 0x77, 0xd0, 0x7d, - 0x2d, 0x7b, 0x71, 0x77, 0x14, 0xc5, 0x88, 0x9c, 0xdb, 0x69, 0x00, 0xc3, 0x1b, 0xcc, 0x2c, 0x67, - 0x66, 0x71, 0x07, 0x29, 0xaa, 0xb2, 0x15, 0x95, 0x9c, 0x94, 0x95, 0x84, 0x2e, 0x47, 0x55, 0x29, - 0x27, 0x55, 0x4a, 0xb9, 0x2a, 0x8e, 0xf2, 0x1d, 0x45, 0x65, 0x49, 0xae, 0xc8, 0x49, 0xc5, 0xb1, - 0x1c, 0xb9, 0x2a, 0x71, 0x54, 0xe5, 0x72, 0xec, 0x94, 0x2b, 0xb0, 0x09, 0x55, 0xfc, 0x33, 0x3f, - 0xe2, 0x7f, 0x48, 0x2a, 0x95, 0xea, 0xcf, 0xe9, 0x9e, 0xdd, 0xc5, 0xcc, 0x82, 0x07, 0xf8, 0xa4, - 0xf2, 0xbf, 0xdd, 0xf7, 0x5e, 0xbf, 0xfe, 0x98, 0xee, 0xd7, 0xef, 0xbd, 0x7e, 0xfd, 0x1a, 0xce, - 0xdd, 0xbd, 0x18, 0xcf, 0x79, 0xe1, 0xfc, 0xdd, 0xd6, 0x1d, 0x12, 0x05, 0x24, 0x21, 0xf1, 0x7c, - 0xf3, 0xee, 0xc6, 0xbc, 0xd3, 0xf4, 0xe6, 0xb7, 0xcf, 0xcf, 0x6f, 0x90, 0x80, 0x44, 0x4e, 0x42, - 0xdc, 0xb9, 0x66, 0x14, 0x26, 0x21, 0x7a, 0x8c, 0x53, 0xcf, 0xa5, 0xd4, 0x73, 0xcd, 0xbb, 0x1b, - 0x73, 0x4e, 0xd3, 0x9b, 0xdb, 0x3e, 0x3f, 0xf3, 0xfc, 0x86, 0x97, 0x6c, 0xb6, 0xee, 0xcc, 0x35, - 0xc2, 0xad, 0xf9, 0x8d, 0x70, 0x23, 0x9c, 0x67, 0x85, 0xee, 0xb4, 0xd6, 0xd9, 0x3f, 0xf6, 0x87, - 0xfd, 0xe2, 0xcc, 0x66, 0x5e, 0x14, 0x55, 0x3b, 0x4d, 0x6f, 0xcb, 0x69, 0x6c, 0x7a, 0x01, 0x89, - 0x76, 0x54, 0xe5, 0x11, 0x89, 0xc3, 0x56, 0xd4, 0x20, 0xd9, 0x26, 0x1c, 0x58, 0x2a, 0x9e, 0xdf, - 0x22, 0x89, 0xd3, 0xa1, 0xe1, 0x33, 0xf3, 0xdd, 0x4a, 0x45, 0xad, 0x20, 0xf1, 0xb6, 0xda, 0xab, - 0xf9, 0x78, 0x5e, 0x81, 0xb8, 0xb1, 0x49, 0xb6, 0x9c, 0xb6, 0x72, 0x2f, 0x74, 0x2b, 0xd7, 0x4a, - 0x3c, 0x7f, 0xde, 0x0b, 0x92, 0x38, 0x89, 0x0e, 0xea, 0x53, 0x4c, 0xa2, 0x6d, 0x12, 0xa5, 0x1d, - 0x22, 0xf7, 0x9d, 0xad, 0xa6, 0x4f, 0x3a, 0xf4, 0xc9, 0xfe, 0x43, 0x0b, 0xce, 0x2c, 0xdc, 0xae, - 0x2f, 0xfb, 0x4e, 0x9c, 0x78, 0x8d, 0x45, 0x3f, 0x6c, 0xdc, 0xad, 0x27, 0x61, 0x44, 0x6e, 0x85, - 0x7e, 0x6b, 0x8b, 0xd4, 0xd9, 0xf0, 0xa1, 0x73, 0x30, 0xb4, 0xcd, 0xfe, 0xaf, 0x56, 0xa7, 0xad, - 0x33, 0xd6, 0xd9, 0xca, 0xe2, 0xc4, 0x8f, 0x76, 0x67, 0x3f, 0xb4, 0xb7, 0x3b, 0x3b, 0x74, 0x4b, - 0xc0, 0xb1, 0xa2, 0x40, 0x4f, 0xc3, 0xc0, 0x7a, 0xbc, 0xb6, 0xd3, 0x24, 0xd3, 0x25, 0x46, 0x3b, - 0x26, 0x68, 0x07, 0x56, 0xea, 0x14, 0x8a, 0x05, 0x16, 0xcd, 0x43, 0xa5, 0xe9, 0x44, 0x89, 0x97, - 0x78, 0x61, 0x30, 0x5d, 0x3e, 0x63, 0x9d, 0xed, 0x5f, 0x9c, 0x14, 0xa4, 0x95, 0x9a, 0x44, 0xe0, - 0x94, 0x86, 0x36, 0x23, 0x22, 0x8e, 0x7b, 0x23, 0xf0, 0x77, 0xa6, 0xfb, 0xce, 0x58, 0x67, 0x87, - 0xd2, 0x66, 0x60, 0x01, 0xc7, 0x8a, 0xc2, 0xfe, 0x7e, 0x09, 0x86, 0x16, 0xd6, 0xd7, 0xbd, 0xc0, - 0x4b, 0x76, 0xd0, 0xdb, 0x30, 0x12, 0x84, 0x2e, 0x91, 0xff, 0x59, 0x2f, 0x86, 0x2f, 0x3c, 0x3b, - 0x77, 0xd0, 0x54, 0x9c, 0xbb, 0xae, 0x95, 0x58, 0x9c, 0xd8, 0xdb, 0x9d, 0x1d, 0xd1, 0x21, 0xd8, - 0xe0, 0x88, 0xde, 0x84, 0xe1, 0x66, 0xe8, 0xaa, 0x0a, 0x4a, 0xac, 0x82, 0x67, 0x0e, 0xae, 0xa0, - 0x96, 0x16, 0x58, 0x1c, 0xdf, 0xdb, 0x9d, 0x1d, 0xd6, 0x00, 0x58, 0x67, 0x87, 0x7c, 0x18, 0xa7, - 0x7f, 0x83, 0xc4, 0x53, 0x35, 0x94, 0x59, 0x0d, 0xcf, 0xe7, 0xd7, 0xa0, 0x15, 0x5a, 0x3c, 0xb1, - 0xb7, 0x3b, 0x3b, 0x9e, 0x01, 0xe2, 0x2c, 0x6b, 0xfb, 0x8b, 0x30, 0xb6, 0x90, 0x24, 0x4e, 0x63, - 0x93, 0xb8, 0xfc, 0xfb, 0xa2, 0x17, 0xa1, 0x2f, 0x70, 0xb6, 0x88, 0xf8, 0xfa, 0x67, 0xc4, 0xb0, - 0xf7, 0x5d, 0x77, 0xb6, 0xc8, 0xfe, 0xee, 0xec, 0xc4, 0xcd, 0xc0, 0x7b, 0xb7, 0x25, 0xe6, 0x0c, - 0x85, 0x61, 0x46, 0x8d, 0x2e, 0x00, 0xb8, 0x64, 0xdb, 0x6b, 0x90, 0x9a, 0x93, 0x6c, 0x8a, 0xd9, - 0x80, 0x44, 0x59, 0xa8, 0x2a, 0x0c, 0xd6, 0xa8, 0xec, 0xaf, 0x58, 0x50, 0x59, 0xd8, 0x0e, 0x3d, - 0xb7, 0x16, 0xba, 0x31, 0x6a, 0xc1, 0x78, 0x33, 0x22, 0xeb, 0x24, 0x52, 0xa0, 0x69, 0xeb, 0x4c, - 0xf9, 0xec, 0xf0, 0x85, 0x0b, 0x39, 0xfd, 0x36, 0x0b, 0x2d, 0x07, 0x49, 0xb4, 0xb3, 0xf8, 0x88, - 0xa8, 0x7a, 0x3c, 0x83, 0xc5, 0xd9, 0x3a, 0xec, 0x5f, 0x2a, 0xc1, 0xc9, 0x85, 0x2f, 0xb6, 0x22, - 0x52, 0xf5, 0xe2, 0xbb, 0xd9, 0xa5, 0xe0, 0x7a, 0xf1, 0xdd, 0xeb, 0xe9, 0x60, 0xa8, 0x39, 0x58, - 0x15, 0x70, 0xac, 0x28, 0xd0, 0xf3, 0x30, 0x48, 0x7f, 0xdf, 0xc4, 0xab, 0xa2, 0xf7, 0x27, 0x04, - 0xf1, 0x70, 0xd5, 0x49, 0x9c, 0x2a, 0x47, 0x61, 0x49, 0x83, 0xae, 0xc1, 0x70, 0x83, 0xad, 0xf7, - 0x8d, 0x6b, 0xa1, 0x4b, 0xd8, 0x17, 0xae, 0x2c, 0x3e, 0x47, 0xc9, 0x97, 0x52, 0xf0, 0xfe, 0xee, - 0xec, 0x34, 0x6f, 0x9b, 0x60, 0xa1, 0xe1, 0xb0, 0x5e, 0x1e, 0xd9, 0x6a, 0x21, 0xf6, 0x31, 0x4e, - 0xd0, 0x61, 0x11, 0x9e, 0xd5, 0xd6, 0x54, 0x3f, 0x5b, 0x53, 0x23, 0x5d, 0xd6, 0xd3, 0x3f, 0xb5, - 0xc4, 0x98, 0xac, 0x78, 0xbe, 0x29, 0x1e, 0x2e, 0x00, 0xc4, 0xa4, 0x11, 0x91, 0x44, 0x1b, 0x15, - 0xf5, 0x99, 0xeb, 0x0a, 0x83, 0x35, 0x2a, 0xba, 0xf8, 0xe3, 0x4d, 0x27, 0x62, 0xb3, 0x45, 0x8c, - 0x8d, 0x5a, 0xfc, 0x75, 0x89, 0xc0, 0x29, 0x8d, 0xb1, 0xf8, 0xcb, 0xb9, 0x8b, 0xff, 0xb7, 0x2c, - 0x18, 0x5c, 0xf4, 0x02, 0xd7, 0x0b, 0x36, 0xd0, 0xdb, 0x30, 0x44, 0x25, 0xba, 0xeb, 0x24, 0x8e, - 0x58, 0xf7, 0x1f, 0x93, 0x93, 0x47, 0x17, 0xb0, 0x72, 0xfa, 0xc4, 0x73, 0x94, 0x9a, 0x4e, 0xa2, - 0x1b, 0x77, 0xde, 0x21, 0x8d, 0xe4, 0x1a, 0x49, 0x9c, 0xb4, 0x3b, 0x29, 0x0c, 0x2b, 0xae, 0xe8, - 0x26, 0x0c, 0x24, 0x4e, 0xb4, 0x41, 0x12, 0xb1, 0xec, 0x73, 0x16, 0x25, 0xe7, 0x81, 0xe9, 0x94, - 0x23, 0x41, 0x83, 0xa4, 0x02, 0x72, 0x8d, 0x31, 0xc1, 0x82, 0x99, 0xdd, 0x80, 0x91, 0x25, 0xa7, - 0xe9, 0xdc, 0xf1, 0x7c, 0x2f, 0xf1, 0x48, 0x8c, 0x3e, 0x0a, 0x65, 0xc7, 0x75, 0xd9, 0x02, 0xa8, - 0x2c, 0x9e, 0xdc, 0xdb, 0x9d, 0x2d, 0x2f, 0xb8, 0xee, 0xfe, 0xee, 0x2c, 0x28, 0xaa, 0x1d, 0x4c, - 0x29, 0xd0, 0xb3, 0xd0, 0xe7, 0x46, 0x61, 0x73, 0xba, 0xc4, 0x28, 0x4f, 0xd1, 0x95, 0x5a, 0x8d, - 0xc2, 0x66, 0x86, 0x94, 0xd1, 0xd8, 0x3f, 0x2c, 0x01, 0x5a, 0x22, 0xcd, 0xcd, 0x95, 0xba, 0xf1, - 0x4d, 0xcf, 0xc2, 0xd0, 0x56, 0x18, 0x78, 0x49, 0x18, 0xc5, 0xa2, 0x42, 0x36, 0x2f, 0xae, 0x09, - 0x18, 0x56, 0x58, 0x74, 0x06, 0xfa, 0x9a, 0xe9, 0xf2, 0x1e, 0x91, 0xa2, 0x81, 0x2d, 0x6c, 0x86, - 0xa1, 0x14, 0xad, 0x98, 0x44, 0x62, 0x3e, 0x2b, 0x8a, 0x9b, 0x31, 0x89, 0x30, 0xc3, 0xa4, 0x33, - 0x88, 0xce, 0x2d, 0x31, 0x5b, 0x33, 0x33, 0x88, 0x62, 0xb0, 0x46, 0x85, 0xde, 0x82, 0x0a, 0xff, - 0x87, 0xc9, 0x3a, 0x9b, 0xba, 0xb9, 0x42, 0xe1, 0x6a, 0xd8, 0x70, 0xfc, 0xec, 0xe0, 0x8f, 0xb2, - 0x19, 0x27, 0x19, 0xe1, 0x94, 0xa7, 0x31, 0xe3, 0x06, 0x72, 0x67, 0xdc, 0xdf, 0xb3, 0x00, 0x2d, - 0x79, 0x81, 0x4b, 0xa2, 0x63, 0xd8, 0x3a, 0x7b, 0x5b, 0x0c, 0x7f, 0x4c, 0x9b, 0x16, 0x6e, 0x35, - 0xc3, 0x80, 0x04, 0xc9, 0x52, 0x18, 0xb8, 0x7c, 0x3b, 0xfd, 0x24, 0xf4, 0x25, 0xb4, 0x2a, 0xde, - 0xac, 0xa7, 0xe5, 0x67, 0xa1, 0x15, 0xec, 0xef, 0xce, 0x9e, 0x6a, 0x2f, 0xc1, 0x9a, 0xc0, 0xca, - 0xa0, 0x4f, 0xc0, 0x40, 0x9c, 0x38, 0x49, 0x2b, 0x16, 0x0d, 0x7d, 0x42, 0x36, 0xb4, 0xce, 0xa0, - 0xfb, 0xbb, 0xb3, 0xe3, 0xaa, 0x18, 0x07, 0x61, 0x51, 0x00, 0x3d, 0x03, 0x83, 0x5b, 0x24, 0x8e, - 0x9d, 0x0d, 0x29, 0xe0, 0xc6, 0x45, 0xd9, 0xc1, 0x6b, 0x1c, 0x8c, 0x25, 0x1e, 0x3d, 0x09, 0xfd, - 0x24, 0x8a, 0xc2, 0x48, 0xcc, 0x88, 0x51, 0x41, 0xd8, 0xbf, 0x4c, 0x81, 0x98, 0xe3, 0xec, 0xff, - 0x6e, 0xc1, 0xb8, 0x6a, 0x2b, 0xaf, 0xeb, 0x18, 0x96, 0xbc, 0x0b, 0xd0, 0x90, 0x1d, 0x8c, 0xd9, - 0x42, 0xd3, 0xea, 0xe8, 0x3c, 0xfd, 0xda, 0x07, 0x34, 0xad, 0x43, 0x81, 0x62, 0xac, 0xf1, 0xb5, - 0xff, 0x93, 0x05, 0x27, 0x32, 0x7d, 0xbb, 0xea, 0xc5, 0x09, 0x7a, 0xb3, 0xad, 0x7f, 0x73, 0xc5, - 0xfa, 0x47, 0x4b, 0xb3, 0xde, 0xa9, 0xf9, 0x22, 0x21, 0x5a, 0xdf, 0x30, 0xf4, 0x7b, 0x09, 0xd9, - 0x92, 0xdd, 0x7a, 0xbe, 0x60, 0xb7, 0x78, 0xfb, 0xd2, 0xaf, 0xb4, 0x4a, 0x79, 0x60, 0xce, 0xca, - 0xfe, 0x3f, 0x16, 0x54, 0x96, 0xc2, 0x60, 0xdd, 0xdb, 0xb8, 0xe6, 0x34, 0x8f, 0xe1, 0xfb, 0xd4, - 0xa1, 0x8f, 0x71, 0xe7, 0x5d, 0x38, 0x9f, 0xd7, 0x05, 0xd1, 0xb0, 0x39, 0xba, 0xa7, 0x72, 0x65, - 0x41, 0x89, 0x29, 0x0a, 0xc2, 0x8c, 0xd9, 0xcc, 0xcb, 0x50, 0x51, 0x04, 0x68, 0x02, 0xca, 0x77, - 0x09, 0xd7, 0x24, 0x2b, 0x98, 0xfe, 0x44, 0x53, 0xd0, 0xbf, 0xed, 0xf8, 0x2d, 0xb1, 0x78, 0x31, - 0xff, 0xf3, 0xc9, 0xd2, 0x45, 0xcb, 0xfe, 0x21, 0x5b, 0x81, 0xa2, 0x92, 0xe5, 0x60, 0x5b, 0x08, - 0x87, 0xaf, 0x5a, 0x30, 0xe5, 0x77, 0x10, 0x4a, 0x62, 0x4c, 0x0e, 0x23, 0xce, 0x1e, 0x13, 0xcd, - 0x9e, 0xea, 0x84, 0xc5, 0x1d, 0x6b, 0xa3, 0xb2, 0x3e, 0x6c, 0xd2, 0x09, 0xe7, 0xf8, 0xac, 0xe9, - 0x42, 0x07, 0xb8, 0x21, 0x60, 0x58, 0x61, 0xed, 0x3f, 0xb3, 0x60, 0x4a, 0xf5, 0xe3, 0x0a, 0xd9, - 0xa9, 0x13, 0x9f, 0x34, 0x92, 0x30, 0x7a, 0x58, 0x7a, 0xf2, 0x38, 0xff, 0x26, 0x5c, 0x26, 0x0d, - 0x0b, 0x06, 0xe5, 0x2b, 0x64, 0x87, 0x7f, 0x20, 0xbd, 0xa3, 0xe5, 0x03, 0x3b, 0xfa, 0x6f, 0x2d, - 0x18, 0x55, 0x1d, 0x3d, 0x86, 0x25, 0x77, 0xd5, 0x5c, 0x72, 0x1f, 0x2d, 0x38, 0x5f, 0xbb, 0x2c, - 0xb6, 0xbf, 0x5b, 0xa2, 0x62, 0x43, 0xd0, 0xd4, 0xa2, 0x90, 0x0e, 0x12, 0x95, 0xf8, 0x0f, 0xc9, - 0x57, 0xea, 0xad, 0xb3, 0x57, 0xc8, 0xce, 0x5a, 0x48, 0xb5, 0x89, 0xce, 0x9d, 0x35, 0x3e, 0x6a, - 0xdf, 0x81, 0x1f, 0xf5, 0x77, 0x4b, 0x70, 0x52, 0x0d, 0x8b, 0xb1, 0x4b, 0xff, 0x4c, 0x0e, 0xcc, - 0x79, 0x18, 0x76, 0xc9, 0xba, 0xd3, 0xf2, 0x13, 0x65, 0x4d, 0xf4, 0x73, 0x33, 0xb3, 0x9a, 0x82, - 0xb1, 0x4e, 0xd3, 0xc3, 0x58, 0x7e, 0x73, 0x98, 0xc9, 0xf3, 0xc4, 0xa1, 0xb3, 0x9e, 0x6a, 0x78, - 0x9a, 0x79, 0x38, 0xa2, 0x9b, 0x87, 0xc2, 0x14, 0x7c, 0x12, 0xfa, 0xbd, 0x2d, 0xba, 0xe7, 0x97, - 0xcc, 0xad, 0x7c, 0x95, 0x02, 0x31, 0xc7, 0xa1, 0xa7, 0x60, 0xb0, 0x11, 0x6e, 0x6d, 0x39, 0x81, - 0x3b, 0x5d, 0x66, 0x3a, 0xe7, 0x30, 0x55, 0x0b, 0x96, 0x38, 0x08, 0x4b, 0x1c, 0x7a, 0x0c, 0xfa, - 0x9c, 0x68, 0x23, 0x9e, 0xee, 0x63, 0x34, 0x43, 0xb4, 0xa6, 0x85, 0x68, 0x23, 0xc6, 0x0c, 0x4a, - 0x75, 0xc9, 0x7b, 0x61, 0x74, 0xd7, 0x0b, 0x36, 0xaa, 0x5e, 0xc4, 0x14, 0x43, 0x4d, 0x97, 0xbc, - 0xad, 0x30, 0x58, 0xa3, 0x42, 0x35, 0xe8, 0x6f, 0x86, 0x51, 0x12, 0x4f, 0x0f, 0xb0, 0x81, 0x7f, - 0x2e, 0x77, 0xf9, 0xf1, 0x7e, 0xd7, 0xc2, 0x28, 0x49, 0xbb, 0x42, 0xff, 0xc5, 0x98, 0x33, 0x42, - 0x4b, 0x50, 0x26, 0xc1, 0xf6, 0xf4, 0x20, 0xe3, 0xf7, 0x91, 0x83, 0xf9, 0x2d, 0x07, 0xdb, 0xb7, - 0x9c, 0x28, 0x95, 0x57, 0xcb, 0xc1, 0x36, 0xa6, 0xa5, 0x51, 0x03, 0x2a, 0xd2, 0x85, 0x15, 0x4f, - 0x0f, 0x15, 0x99, 0x8a, 0x58, 0x90, 0x63, 0xf2, 0x6e, 0xcb, 0x8b, 0xc8, 0x16, 0x09, 0x92, 0x38, - 0x35, 0xac, 0x24, 0x36, 0xc6, 0x29, 0x5f, 0xd4, 0x80, 0x11, 0xae, 0x7f, 0x5e, 0x0b, 0x5b, 0x41, - 0x12, 0x4f, 0x57, 0x58, 0x93, 0x73, 0x3c, 0x17, 0xb7, 0xd2, 0x12, 0x8b, 0x53, 0x82, 0xfd, 0x88, - 0x06, 0x8c, 0xb1, 0xc1, 0x14, 0xbd, 0x09, 0xa3, 0xbe, 0xb7, 0x4d, 0x02, 0x12, 0xc7, 0xb5, 0x28, - 0xbc, 0x43, 0xa6, 0x81, 0xf5, 0xe6, 0xc9, 0x3c, 0x2b, 0x3e, 0xbc, 0x43, 0x16, 0x27, 0xf7, 0x76, - 0x67, 0x47, 0xaf, 0xea, 0xa5, 0xb1, 0xc9, 0x0c, 0xbd, 0x05, 0x63, 0x54, 0xd9, 0xf5, 0x52, 0xf6, - 0xc3, 0xc5, 0xd9, 0xa3, 0xbd, 0xdd, 0xd9, 0x31, 0x6c, 0x14, 0xc7, 0x19, 0x76, 0x68, 0x0d, 0x2a, - 0xbe, 0xb7, 0x4e, 0x1a, 0x3b, 0x0d, 0x9f, 0x4c, 0x8f, 0x30, 0xde, 0x39, 0x8b, 0xf3, 0xaa, 0x24, - 0xe7, 0x06, 0x86, 0xfa, 0x8b, 0x53, 0x46, 0xe8, 0x16, 0x9c, 0x4a, 0x48, 0xb4, 0xe5, 0x05, 0x0e, - 0x5d, 0x54, 0x42, 0xfb, 0x65, 0xae, 0x92, 0x51, 0x36, 0x6b, 0x4f, 0x8b, 0x81, 0x3d, 0xb5, 0xd6, - 0x91, 0x0a, 0x77, 0x29, 0x8d, 0x6e, 0xc0, 0x38, 0x5b, 0x4f, 0xb5, 0x96, 0xef, 0xd7, 0x42, 0xdf, - 0x6b, 0xec, 0x4c, 0x8f, 0x31, 0x86, 0x4f, 0x49, 0x07, 0xc8, 0xaa, 0x89, 0xa6, 0x86, 0x61, 0xfa, - 0x0f, 0x67, 0x4b, 0x23, 0x1f, 0xc6, 0x63, 0xd2, 0x68, 0x45, 0x5e, 0xb2, 0x43, 0xe7, 0x3e, 0xb9, - 0x9f, 0x4c, 0x8f, 0x17, 0x31, 0x74, 0xeb, 0x66, 0x21, 0xee, 0x7d, 0xca, 0x00, 0x71, 0x96, 0x35, - 0x15, 0x15, 0x71, 0xe2, 0x7a, 0xc1, 0xf4, 0x04, 0x93, 0x40, 0x6a, 0x7d, 0xd5, 0x29, 0x10, 0x73, - 0x1c, 0xf3, 0x1f, 0xd0, 0x1f, 0x37, 0xa8, 0x94, 0x9e, 0x64, 0x84, 0xa9, 0xff, 0x40, 0x22, 0x70, - 0x4a, 0x43, 0x55, 0x83, 0x24, 0xd9, 0x99, 0x46, 0x8c, 0x54, 0x2d, 0xb5, 0xb5, 0xb5, 0xcf, 0x61, - 0x0a, 0x47, 0xb7, 0x60, 0x90, 0x04, 0xdb, 0x2b, 0x51, 0xb8, 0x35, 0x7d, 0xa2, 0x88, 0x0c, 0x58, - 0xe6, 0xc4, 0x7c, 0xff, 0x48, 0x4d, 0x18, 0x01, 0xc6, 0x92, 0x19, 0xba, 0x0f, 0xd3, 0x1d, 0xbe, - 0x12, 0xff, 0x28, 0x53, 0xec, 0xa3, 0x7c, 0x4a, 0x94, 0x9d, 0x5e, 0xeb, 0x42, 0xb7, 0x7f, 0x00, - 0x0e, 0x77, 0xe5, 0x6e, 0xdf, 0x81, 0x31, 0x25, 0xa8, 0xd8, 0xf7, 0x46, 0xb3, 0xd0, 0x4f, 0x65, - 0xb1, 0x34, 0xe8, 0x2b, 0x74, 0x50, 0xa9, 0x88, 0x8e, 0x31, 0x87, 0xb3, 0x41, 0xf5, 0xbe, 0x48, - 0x16, 0x77, 0x12, 0xc2, 0x0d, 0xbb, 0xb2, 0x36, 0xa8, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0xff, 0x71, - 0x35, 0x29, 0x95, 0x86, 0x05, 0x76, 0x82, 0x73, 0x30, 0xb4, 0x19, 0xc6, 0x09, 0xa5, 0x66, 0x75, - 0xf4, 0xa7, 0x8a, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x02, 0xa3, 0x0d, 0xbd, 0x02, 0xb1, - 0x8d, 0x9d, 0x14, 0x45, 0xcc, 0xda, 0xb1, 0x49, 0x8b, 0x2e, 0xc2, 0x10, 0xf3, 0x72, 0x37, 0x42, - 0x5f, 0x98, 0x90, 0x72, 0x57, 0x1e, 0xaa, 0x09, 0xf8, 0xbe, 0xf6, 0x1b, 0x2b, 0x6a, 0x6a, 0x88, - 0xd3, 0x26, 0xac, 0xd6, 0xc4, 0x06, 0xa2, 0x0c, 0xf1, 0xcb, 0x0c, 0x8a, 0x05, 0xd6, 0xfe, 0xd7, - 0x25, 0x6d, 0x94, 0xa9, 0x01, 0x44, 0xd0, 0x1b, 0x30, 0x78, 0xcf, 0xf1, 0x12, 0x2f, 0xd8, 0x10, - 0xda, 0xc3, 0x0b, 0x05, 0x77, 0x13, 0x56, 0xfc, 0x36, 0x2f, 0xca, 0x77, 0x3e, 0xf1, 0x07, 0x4b, - 0x86, 0x94, 0x77, 0xd4, 0x0a, 0x02, 0xca, 0xbb, 0xd4, 0x3b, 0x6f, 0xcc, 0x8b, 0x72, 0xde, 0xe2, - 0x0f, 0x96, 0x0c, 0xd1, 0x3a, 0x80, 0x9c, 0x4b, 0xc4, 0x15, 0xde, 0xe5, 0x8f, 0xf7, 0xc2, 0x7e, - 0x4d, 0x95, 0x5e, 0x1c, 0xa3, 0x7b, 0x6d, 0xfa, 0x1f, 0x6b, 0x9c, 0xed, 0x84, 0x29, 0x61, 0xed, - 0xcd, 0x42, 0x9f, 0xa7, 0x4b, 0xda, 0x89, 0x12, 0xe2, 0x2e, 0x24, 0x59, 0x07, 0xfd, 0xc1, 0x2a, - 0xf6, 0x9a, 0xb7, 0x45, 0xf4, 0xe5, 0x2f, 0x98, 0xe0, 0x94, 0x9f, 0xfd, 0xbd, 0x32, 0x4c, 0x77, - 0x6b, 0x2e, 0x9d, 0x92, 0xe4, 0xbe, 0x97, 0x2c, 0x51, 0x35, 0xc9, 0x32, 0xa7, 0xe4, 0xb2, 0x80, - 0x63, 0x45, 0x41, 0xe7, 0x46, 0xec, 0x6d, 0x48, 0x63, 0xa9, 0x3f, 0x9d, 0x1b, 0x75, 0x06, 0xc5, - 0x02, 0x4b, 0xe9, 0x22, 0xe2, 0xc4, 0xe2, 0x70, 0x43, 0x9b, 0x43, 0x98, 0x41, 0xb1, 0xc0, 0xea, - 0x0e, 0x91, 0xbe, 0x1c, 0x87, 0x88, 0x31, 0x44, 0xfd, 0x0f, 0x76, 0x88, 0xd0, 0x17, 0x00, 0xd6, - 0xbd, 0xc0, 0x8b, 0x37, 0x19, 0xf7, 0x81, 0x9e, 0xb9, 0x2b, 0x25, 0x6b, 0x45, 0x71, 0xc1, 0x1a, - 0x47, 0xf4, 0x12, 0x0c, 0xab, 0xe5, 0xb9, 0x5a, 0x9d, 0x1e, 0x34, 0x1d, 0xe2, 0xa9, 0xac, 0xaa, - 0x62, 0x9d, 0xce, 0x7e, 0x27, 0x3b, 0x5f, 0xc4, 0xaa, 0xd0, 0xc6, 0xd7, 0x2a, 0x3a, 0xbe, 0xa5, - 0x83, 0xc7, 0xd7, 0xfe, 0x6f, 0x65, 0x18, 0x37, 0x2a, 0x6b, 0xc5, 0x05, 0x24, 0xda, 0x6b, 0x74, - 0xc3, 0x72, 0x12, 0x22, 0xd6, 0xe4, 0xb9, 0x5e, 0x16, 0x8d, 0xbe, 0xbd, 0xd1, 0xb5, 0xc0, 0x39, - 0xa1, 0x4d, 0xa8, 0xf8, 0x4e, 0xcc, 0x5c, 0x2a, 0x44, 0xac, 0xc5, 0xde, 0xd8, 0xa6, 0xe6, 0x87, - 0x13, 0x27, 0xda, 0xee, 0xc1, 0x6b, 0x49, 0x99, 0xd3, 0xdd, 0x96, 0x2a, 0x3b, 0xf2, 0x44, 0x4d, - 0x35, 0x87, 0x6a, 0x44, 0x3b, 0x98, 0xe3, 0xd0, 0x45, 0x18, 0x89, 0x08, 0x9b, 0x29, 0x4b, 0x54, - 0x9f, 0x63, 0x53, 0xaf, 0x3f, 0x55, 0xfc, 0xb0, 0x86, 0xc3, 0x06, 0x65, 0xaa, 0xf7, 0x0f, 0x1c, - 0xa0, 0xf7, 0x3f, 0x03, 0x83, 0xec, 0x87, 0x9a, 0x15, 0xea, 0x0b, 0xad, 0x72, 0x30, 0x96, 0xf8, - 0xec, 0x24, 0x1a, 0x2a, 0x38, 0x89, 0x9e, 0x85, 0xb1, 0xaa, 0x43, 0xb6, 0xc2, 0x60, 0x39, 0x70, - 0x9b, 0xa1, 0x17, 0x24, 0x68, 0x1a, 0xfa, 0xd8, 0x7e, 0xc2, 0xd7, 0x7b, 0x1f, 0xe5, 0x80, 0xfb, - 0xa8, 0xee, 0x6e, 0xff, 0x71, 0x09, 0x46, 0xab, 0xc4, 0x27, 0x09, 0xe1, 0x76, 0x4f, 0x8c, 0x56, - 0x00, 0x6d, 0x44, 0x4e, 0x83, 0xd4, 0x48, 0xe4, 0x85, 0x6e, 0x9d, 0x34, 0xc2, 0x80, 0x1d, 0x44, - 0xd1, 0x0d, 0xf2, 0xd4, 0xde, 0xee, 0x2c, 0xba, 0xd4, 0x86, 0xc5, 0x1d, 0x4a, 0x20, 0x17, 0x46, - 0x9b, 0x11, 0x31, 0xfc, 0x86, 0x56, 0xbe, 0xaa, 0x51, 0xd3, 0x8b, 0x70, 0x6d, 0xd8, 0x00, 0x61, - 0x93, 0x29, 0xfa, 0x0c, 0x4c, 0x84, 0x51, 0x73, 0xd3, 0x09, 0xaa, 0xa4, 0x49, 0x02, 0x97, 0x9a, - 0x00, 0xc2, 0xdb, 0x31, 0xb5, 0xb7, 0x3b, 0x3b, 0x71, 0x23, 0x83, 0xc3, 0x6d, 0xd4, 0xe8, 0x0d, - 0x98, 0x6c, 0x46, 0x61, 0xd3, 0xd9, 0x60, 0x53, 0x46, 0x68, 0x2b, 0x5c, 0x36, 0x9d, 0xdb, 0xdb, - 0x9d, 0x9d, 0xac, 0x65, 0x91, 0xfb, 0xbb, 0xb3, 0x27, 0xd8, 0x90, 0x51, 0x48, 0x8a, 0xc4, 0xed, - 0x6c, 0xec, 0x77, 0xe1, 0x64, 0x35, 0xbc, 0x17, 0xdc, 0x73, 0x22, 0x77, 0xa1, 0xb6, 0xaa, 0x39, - 0x27, 0x5e, 0x97, 0xc6, 0x2f, 0x3f, 0xe0, 0xcb, 0xd9, 0xd9, 0x34, 0x1e, 0xdc, 0xec, 0x58, 0xf1, - 0x7c, 0xd2, 0xc5, 0x1d, 0xf2, 0xcf, 0x4a, 0x46, 0x9d, 0x29, 0xbd, 0x3a, 0xbb, 0xb0, 0xba, 0x9e, - 0x5d, 0x7c, 0x1e, 0x86, 0xd6, 0x3d, 0xe2, 0xbb, 0x98, 0xac, 0x8b, 0xaf, 0x75, 0xbe, 0xc8, 0xe1, - 0xce, 0x0a, 0x2d, 0x23, 0xbd, 0x63, 0xdc, 0x88, 0x5e, 0x11, 0x6c, 0xb0, 0x62, 0x88, 0x5a, 0x30, - 0x21, 0xed, 0x30, 0x89, 0x15, 0x8b, 0xfd, 0x85, 0x62, 0x66, 0x9e, 0x59, 0x0d, 0xfb, 0xbc, 0x38, - 0xc3, 0x10, 0xb7, 0x55, 0x41, 0xed, 0xe7, 0x2d, 0xba, 0xd5, 0xf5, 0xb1, 0xa9, 0xcf, 0xec, 0x67, - 0xe6, 0x0a, 0x60, 0x50, 0xfb, 0xd7, 0x2c, 0x78, 0xa4, 0x6d, 0xb4, 0x84, 0x9f, 0xe4, 0xc8, 0xbe, - 0x51, 0xd6, 0x59, 0x51, 0xca, 0x77, 0x56, 0xd8, 0x37, 0x60, 0x6a, 0x79, 0xab, 0x99, 0xec, 0x54, - 0x3d, 0xf3, 0xc8, 0xe5, 0x65, 0x18, 0xd8, 0x22, 0xae, 0xd7, 0xda, 0x12, 0x9f, 0x75, 0x56, 0xee, - 0x0b, 0xd7, 0x18, 0x74, 0x7f, 0x77, 0x76, 0xb4, 0x9e, 0x84, 0x91, 0xb3, 0x41, 0x38, 0x00, 0x0b, - 0x72, 0xfb, 0x7d, 0x0b, 0xc6, 0xa5, 0x7c, 0x58, 0x70, 0xdd, 0x88, 0xc4, 0x31, 0x9a, 0x81, 0x92, - 0xd7, 0x14, 0x8c, 0x40, 0x30, 0x2a, 0xad, 0xd6, 0x70, 0xc9, 0x6b, 0xa2, 0x37, 0xa0, 0xc2, 0x4f, - 0xea, 0xd2, 0xc9, 0xd1, 0xe3, 0xc9, 0x1f, 0xb3, 0x0d, 0xd7, 0x24, 0x0f, 0x9c, 0xb2, 0x93, 0x5a, - 0x32, 0xdb, 0x79, 0xca, 0xe6, 0xb9, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0x9d, 0x85, 0xa1, 0x20, - 0x74, 0xf9, 0x61, 0x2a, 0x5f, 0xa7, 0x6c, 0xca, 0x5d, 0x17, 0x30, 0xac, 0xb0, 0xf6, 0xd7, 0x2d, - 0x18, 0x91, 0x7d, 0x2c, 0xa8, 0xb0, 0xd3, 0x45, 0x92, 0x2a, 0xeb, 0xe9, 0x22, 0xa1, 0x0a, 0x37, - 0xc3, 0x18, 0x7a, 0x76, 0xb9, 0x17, 0x3d, 0xdb, 0xfe, 0x8d, 0x12, 0x8c, 0xc9, 0xe6, 0xd4, 0x5b, - 0x77, 0x62, 0x42, 0xd5, 0x90, 0x8a, 0xc3, 0x07, 0x9f, 0xc8, 0x79, 0xf6, 0x7c, 0x9e, 0x2d, 0x66, - 0x7c, 0xb3, 0x54, 0xcd, 0x59, 0x90, 0x7c, 0x70, 0xca, 0x12, 0x6d, 0xc3, 0x64, 0x10, 0x26, 0x6c, - 0x7b, 0x53, 0xf8, 0x62, 0x27, 0x1d, 0xd9, 0x7a, 0x1e, 0x15, 0xf5, 0x4c, 0x5e, 0xcf, 0xf2, 0xc3, - 0xed, 0x55, 0xa0, 0x1b, 0xd2, 0xc7, 0x54, 0x66, 0x75, 0x3d, 0x5b, 0xac, 0xae, 0xee, 0x2e, 0x26, - 0xfb, 0x77, 0x2c, 0xa8, 0x48, 0xb2, 0xe3, 0x38, 0xf2, 0xba, 0x0d, 0x83, 0x31, 0xfb, 0x44, 0x72, - 0xb8, 0xce, 0x15, 0xeb, 0x02, 0xff, 0xae, 0xe9, 0x9e, 0xce, 0xff, 0xc7, 0x58, 0x72, 0x63, 0xce, - 0x76, 0xd5, 0x91, 0x87, 0xce, 0xd9, 0xae, 0x5a, 0xd6, 0xfd, 0x64, 0x6b, 0xd4, 0xf0, 0x06, 0x50, - 0xc5, 0xb4, 0x19, 0x91, 0x75, 0xef, 0x7e, 0x56, 0x31, 0xad, 0x31, 0x28, 0x16, 0x58, 0xb4, 0x0e, - 0x23, 0x0d, 0xe9, 0x8e, 0x4e, 0x45, 0xc8, 0xc7, 0x0a, 0xfa, 0xfe, 0xd5, 0x31, 0x12, 0x0f, 0x4d, - 0x5a, 0xd2, 0x38, 0x61, 0x83, 0x2f, 0x95, 0x53, 0xe9, 0x49, 0x79, 0xb9, 0xa0, 0xe3, 0x26, 0x22, - 0x49, 0x5a, 0x43, 0xd7, 0x43, 0x72, 0xfb, 0x5b, 0x16, 0x0c, 0x70, 0xff, 0x65, 0x31, 0x27, 0xb0, - 0x76, 0x40, 0x96, 0x8e, 0xe7, 0x2d, 0x0a, 0x14, 0xe7, 0x65, 0xe8, 0x36, 0x54, 0xd8, 0x0f, 0xe6, - 0x8b, 0x29, 0x17, 0x89, 0xd3, 0xe2, 0xf5, 0xeb, 0x4d, 0xbd, 0x25, 0x19, 0xe0, 0x94, 0x97, 0xfd, - 0x83, 0x32, 0x15, 0x7d, 0x29, 0xa9, 0xb1, 0xb7, 0x5b, 0xc7, 0xb1, 0xb7, 0x97, 0x8e, 0x7e, 0x6f, - 0x7f, 0x17, 0xc6, 0x1b, 0xda, 0x01, 0x5d, 0xfa, 0xc5, 0x2f, 0x14, 0x9c, 0x56, 0xda, 0xa9, 0x1e, - 0xf7, 0xd7, 0x2d, 0x99, 0xec, 0x70, 0x96, 0x3f, 0x22, 0x30, 0xc2, 0xe7, 0x83, 0xa8, 0xaf, 0x8f, - 0xd5, 0x37, 0x5f, 0x64, 0x86, 0xe9, 0x95, 0xb1, 0x59, 0x5c, 0xd7, 0x18, 0x61, 0x83, 0xad, 0xfd, - 0x2b, 0xfd, 0xd0, 0xbf, 0xbc, 0x4d, 0x82, 0xe4, 0x18, 0x44, 0xdd, 0x16, 0x8c, 0x79, 0xc1, 0x76, - 0xe8, 0x6f, 0x13, 0x97, 0xe3, 0x0f, 0xb7, 0xbd, 0x9f, 0x12, 0x95, 0x8c, 0xad, 0x1a, 0xcc, 0x70, - 0x86, 0xf9, 0x51, 0x78, 0x0a, 0x5e, 0x83, 0x01, 0x3e, 0x33, 0x84, 0x9b, 0x20, 0xc7, 0x9f, 0xcf, - 0x06, 0x56, 0xac, 0xa0, 0xd4, 0x9f, 0xc1, 0x8f, 0x12, 0x04, 0x23, 0xf4, 0x0e, 0x8c, 0xad, 0x7b, - 0x51, 0x9c, 0x50, 0x63, 0x3f, 0x4e, 0x9c, 0xad, 0xe6, 0x21, 0x7c, 0x04, 0x6a, 0x44, 0x56, 0x0c, - 0x4e, 0x38, 0xc3, 0x19, 0x6d, 0xc0, 0x28, 0x35, 0x51, 0xd3, 0xaa, 0x06, 0x7b, 0xae, 0x4a, 0xb9, - 0x08, 0xaf, 0xea, 0x8c, 0xb0, 0xc9, 0x97, 0x8a, 0xa4, 0x06, 0x33, 0x69, 0x87, 0x98, 0x76, 0xa3, - 0x44, 0x12, 0xb7, 0x65, 0x39, 0x8e, 0x4a, 0x36, 0x16, 0x29, 0x53, 0x31, 0x25, 0x5b, 0x1a, 0x0f, - 0x63, 0x7f, 0x87, 0xee, 0xc5, 0x74, 0x0c, 0x8f, 0x61, 0xfb, 0xba, 0x6c, 0x6e, 0x5f, 0x4f, 0x16, - 0xf8, 0xb2, 0x5d, 0xb6, 0xae, 0xb7, 0x61, 0x58, 0xfb, 0xf0, 0x68, 0x1e, 0x2a, 0x0d, 0x19, 0xcc, - 0x21, 0xa4, 0xb8, 0x52, 0xa5, 0x54, 0x94, 0x07, 0x4e, 0x69, 0xe8, 0xb8, 0x50, 0x15, 0x34, 0x1b, - 0xfa, 0x45, 0x15, 0x54, 0xcc, 0x30, 0xf6, 0x0b, 0x00, 0xcb, 0xf7, 0x49, 0x63, 0x81, 0x9b, 0x78, - 0xda, 0xf9, 0x9e, 0xd5, 0xfd, 0x7c, 0xcf, 0xfe, 0xb6, 0x05, 0x63, 0x2b, 0x4b, 0x86, 0x4e, 0x3f, - 0x07, 0xc0, 0x75, 0xe3, 0xdb, 0xb7, 0xaf, 0x4b, 0xff, 0x35, 0x77, 0x32, 0x2a, 0x28, 0xd6, 0x28, - 0xd0, 0xa3, 0x50, 0xf6, 0x5b, 0x81, 0x50, 0x59, 0x07, 0xf7, 0x76, 0x67, 0xcb, 0x57, 0x5b, 0x01, - 0xa6, 0x30, 0x2d, 0xc6, 0xaa, 0x5c, 0x38, 0xc6, 0x2a, 0x3f, 0xda, 0xf8, 0x1b, 0x65, 0x98, 0x58, - 0xf1, 0xc9, 0x7d, 0xa3, 0xd5, 0x4f, 0xc3, 0x80, 0x1b, 0x79, 0xdb, 0x24, 0xca, 0x2a, 0x02, 0x55, - 0x06, 0xc5, 0x02, 0x5b, 0x38, 0xec, 0xeb, 0xad, 0xf6, 0x8d, 0xfc, 0xe8, 0x42, 0xde, 0x72, 0xfb, - 0x8c, 0xd6, 0x61, 0x90, 0x9f, 0x07, 0xc7, 0xd3, 0xfd, 0x6c, 0x2a, 0xbe, 0x72, 0x70, 0x63, 0xb2, - 0xe3, 0x33, 0x27, 0xfc, 0x2b, 0x3c, 0xe0, 0x46, 0xc9, 0x32, 0x01, 0xc5, 0x92, 0xf9, 0xcc, 0x27, - 0x61, 0x44, 0xa7, 0xec, 0x29, 0xf2, 0xe6, 0xaf, 0x5b, 0x70, 0x62, 0xc5, 0x0f, 0x1b, 0x77, 0x33, - 0x71, 0x79, 0x2f, 0xc1, 0x30, 0x5d, 0x4c, 0xb1, 0x11, 0xb4, 0x6a, 0x44, 0xe7, 0x0a, 0x14, 0xd6, - 0xe9, 0xb4, 0x62, 0x37, 0x6f, 0xae, 0x56, 0x3b, 0x05, 0xf5, 0x0a, 0x14, 0xd6, 0xe9, 0xec, 0xdf, - 0xb3, 0xe0, 0xf1, 0x4b, 0x4b, 0xcb, 0x35, 0x12, 0xc5, 0x5e, 0x9c, 0x90, 0x20, 0x69, 0x8b, 0x2b, - 0xa6, 0x3a, 0xa3, 0xab, 0x35, 0x25, 0xd5, 0x19, 0xab, 0xac, 0x15, 0x02, 0xfb, 0xb0, 0x04, 0xd7, - 0x7f, 0xcb, 0x82, 0x13, 0x97, 0xbc, 0x04, 0x93, 0x66, 0x98, 0x0d, 0x05, 0x8e, 0x48, 0x33, 0x8c, - 0xbd, 0x24, 0x8c, 0x76, 0xb2, 0xa1, 0xc0, 0x58, 0x61, 0xb0, 0x46, 0xc5, 0x6b, 0xde, 0xf6, 0x62, - 0xda, 0xd2, 0x92, 0x69, 0xea, 0x62, 0x01, 0xc7, 0x8a, 0x82, 0x76, 0xcc, 0xf5, 0x22, 0xa6, 0x32, - 0xec, 0x88, 0x15, 0xac, 0x3a, 0x56, 0x95, 0x08, 0x9c, 0xd2, 0xd8, 0xff, 0xc0, 0x82, 0x93, 0x97, - 0xfc, 0x56, 0x9c, 0x90, 0x68, 0x3d, 0x36, 0x1a, 0xfb, 0x02, 0x54, 0x88, 0x54, 0xee, 0x45, 0x5b, - 0xd5, 0xa6, 0xa1, 0xb4, 0x7e, 0x1e, 0x87, 0xac, 0xe8, 0x0a, 0x84, 0xbb, 0xf6, 0x16, 0x9c, 0xf9, - 0x9b, 0x25, 0x18, 0xbd, 0xbc, 0xb6, 0x56, 0xbb, 0x44, 0x12, 0x21, 0x25, 0xf3, 0x9d, 0x52, 0x58, - 0xb3, 0xc8, 0x0f, 0x52, 0x7e, 0x5a, 0x89, 0xe7, 0xcf, 0xf1, 0xeb, 0x22, 0x73, 0xab, 0x41, 0x72, - 0x23, 0xaa, 0x27, 0x91, 0x17, 0x6c, 0x74, 0xb4, 0xe1, 0xa5, 0x2c, 0x2f, 0x77, 0x93, 0xe5, 0xe8, - 0x05, 0x18, 0x60, 0xf7, 0x55, 0xa4, 0xf2, 0xf1, 0x61, 0xa5, 0x27, 0x30, 0xe8, 0xfe, 0xee, 0x6c, - 0xe5, 0x26, 0x5e, 0xe5, 0x7f, 0xb0, 0x20, 0x45, 0x6f, 0xc1, 0xf0, 0x66, 0x92, 0x34, 0x2f, 0x13, - 0xc7, 0x25, 0x91, 0x94, 0x13, 0x67, 0x0f, 0x96, 0x13, 0x74, 0x38, 0x78, 0x81, 0x74, 0x69, 0xa5, - 0xb0, 0x18, 0xeb, 0x1c, 0xed, 0x3a, 0x40, 0x8a, 0x7b, 0x40, 0x36, 0x88, 0xfd, 0xf3, 0x25, 0x18, - 0xbc, 0xec, 0x04, 0xae, 0x4f, 0x22, 0xb4, 0x02, 0x7d, 0xe4, 0x3e, 0x69, 0x88, 0x8d, 0x3c, 0xa7, - 0xe9, 0xe9, 0x66, 0xc7, 0xfd, 0x6a, 0xf4, 0x3f, 0x66, 0xe5, 0x11, 0x86, 0x41, 0xda, 0xee, 0x4b, - 0x2a, 0x4a, 0xfc, 0xb9, 0xfc, 0x51, 0x50, 0x93, 0x82, 0xef, 0x94, 0x02, 0x84, 0x25, 0x23, 0xe6, - 0x81, 0x6a, 0x34, 0xeb, 0x54, 0xbc, 0x25, 0xc5, 0x2c, 0xbb, 0xb5, 0xa5, 0x1a, 0x27, 0x17, 0x7c, - 0xb9, 0x07, 0x4a, 0x02, 0x71, 0xca, 0xce, 0xbe, 0x08, 0x53, 0xec, 0x3c, 0xd6, 0x49, 0x36, 0x8d, - 0x55, 0x93, 0x3b, 0x3d, 0xed, 0x1f, 0x95, 0x60, 0x72, 0xb5, 0xbe, 0x54, 0x37, 0x7d, 0x87, 0x17, - 0x61, 0x84, 0x6f, 0xd0, 0x74, 0xd2, 0x39, 0xbe, 0x28, 0xaf, 0xce, 0x10, 0xd6, 0x34, 0x1c, 0x36, - 0x28, 0xd1, 0xe3, 0x50, 0xf6, 0xde, 0x0d, 0xb2, 0x51, 0x7d, 0xab, 0xaf, 0x5d, 0xc7, 0x14, 0x4e, - 0xd1, 0x74, 0xaf, 0xe7, 0x42, 0x4e, 0xa1, 0xd5, 0x7e, 0xff, 0x2a, 0x8c, 0x79, 0x71, 0x23, 0xf6, - 0x56, 0x03, 0x2a, 0x01, 0x9c, 0x86, 0x9c, 0xbe, 0xa9, 0x72, 0x4e, 0x9b, 0xaa, 0xb0, 0x38, 0x43, - 0xad, 0x49, 0xdc, 0xfe, 0xc2, 0xfa, 0x42, 0x6e, 0xb8, 0x38, 0x55, 0x85, 0x9a, 0xac, 0x77, 0x31, - 0x8b, 0x11, 0x12, 0xaa, 0x10, 0xef, 0x70, 0x8c, 0x25, 0xce, 0x7e, 0x07, 0x2a, 0x2a, 0xcc, 0x4b, - 0x46, 0x37, 0x5a, 0x5d, 0xa2, 0x1b, 0xf3, 0x25, 0x93, 0x74, 0xfc, 0x96, 0x3b, 0x3a, 0x7e, 0xff, - 0x85, 0x05, 0x69, 0x9c, 0x0a, 0xc2, 0x50, 0x69, 0x86, 0xec, 0x90, 0x28, 0x92, 0xa7, 0xb1, 0x4f, - 0xe5, 0x4c, 0x58, 0xbe, 0x60, 0xf8, 0x94, 0xaa, 0xc9, 0xb2, 0x38, 0x65, 0x83, 0xae, 0xc2, 0x60, - 0x33, 0x22, 0xf5, 0x84, 0x5d, 0x4d, 0xe8, 0x81, 0x23, 0x1f, 0x1b, 0x5e, 0x12, 0x4b, 0x16, 0xf6, - 0xbf, 0xb3, 0x00, 0xae, 0x7a, 0x5b, 0x5e, 0x82, 0x9d, 0x60, 0x83, 0x1c, 0x83, 0x55, 0x78, 0x1d, - 0xfa, 0xe2, 0x26, 0x69, 0x14, 0x3b, 0xe6, 0x4b, 0x5b, 0x56, 0x6f, 0x92, 0x46, 0xfa, 0x39, 0xe8, - 0x3f, 0xcc, 0xf8, 0xd8, 0xdf, 0x07, 0x18, 0x4b, 0xc9, 0xa8, 0x66, 0x8e, 0x9e, 0x37, 0x62, 0xf2, - 0x1f, 0xcd, 0xc4, 0xe4, 0x57, 0x18, 0xb5, 0x16, 0x86, 0x9f, 0x40, 0x79, 0xcb, 0xb9, 0x2f, 0x0c, - 0x81, 0x97, 0x8a, 0x36, 0x88, 0xd6, 0x34, 0x77, 0xcd, 0xb9, 0xcf, 0xf5, 0xae, 0xe7, 0xe4, 0x44, - 0xba, 0xe6, 0xdc, 0xdf, 0xe7, 0x87, 0x79, 0x6c, 0xc1, 0x52, 0xcb, 0xe3, 0x2b, 0x7f, 0x92, 0xfe, - 0x67, 0x32, 0x94, 0x56, 0xc7, 0x6a, 0xf5, 0x02, 0xe1, 0xc7, 0xec, 0xb1, 0x56, 0x2f, 0xc8, 0xd6, - 0xea, 0x05, 0x05, 0x6a, 0xf5, 0x58, 0xf0, 0xea, 0xa0, 0x70, 0xff, 0xb3, 0xc8, 0xbf, 0xe1, 0x0b, - 0x9f, 0xe8, 0xa9, 0x6a, 0x71, 0x8e, 0xc0, 0xab, 0x9f, 0x97, 0xca, 0xa6, 0x80, 0xe6, 0x36, 0x41, - 0x56, 0x8d, 0xfe, 0xa1, 0x05, 0x63, 0xe2, 0x37, 0x26, 0xef, 0xb6, 0x48, 0x9c, 0x88, 0x4d, 0xed, - 0x33, 0x87, 0x69, 0x8d, 0x60, 0xc1, 0x1b, 0xf5, 0x71, 0x29, 0x91, 0x4c, 0x64, 0x6e, 0xdb, 0x32, - 0xed, 0x41, 0xdf, 0xb7, 0x60, 0x6a, 0xcb, 0xb9, 0xcf, 0x6b, 0xe4, 0x30, 0xec, 0x24, 0x5e, 0x28, - 0xa2, 0x1b, 0x57, 0x7a, 0x9d, 0x27, 0x6d, 0x8c, 0x78, 0x73, 0x65, 0xe0, 0xd2, 0x54, 0x27, 0x92, - 0xdc, 0x46, 0x77, 0x6c, 0xe1, 0xcc, 0x3a, 0x0c, 0xc9, 0x89, 0xd9, 0x41, 0xcd, 0xaf, 0xea, 0x7b, - 0x77, 0x8e, 0x51, 0x3d, 0x27, 0x5d, 0x63, 0x73, 0xaf, 0xb5, 0x9c, 0x20, 0xf1, 0x92, 0x1d, 0xcd, - 0x2c, 0x60, 0xf5, 0x88, 0xa9, 0x78, 0xa4, 0xf5, 0xbc, 0x03, 0x23, 0xfa, 0xbc, 0x3b, 0xd2, 0xba, - 0xde, 0x85, 0x13, 0x1d, 0x66, 0xd5, 0x91, 0x56, 0x79, 0x0f, 0x1e, 0xed, 0x3a, 0x3f, 0x8e, 0xb2, - 0x62, 0xfb, 0x37, 0x2d, 0x5d, 0x74, 0x1e, 0x83, 0xd3, 0xe5, 0x9a, 0xe9, 0x74, 0x39, 0x5b, 0x74, - 0x0d, 0x75, 0xf1, 0xbc, 0xac, 0xeb, 0xcd, 0xa7, 0x5b, 0x02, 0x5a, 0x83, 0x01, 0x9f, 0x42, 0xe4, - 0x99, 0xd7, 0xb9, 0x5e, 0x56, 0x69, 0xaa, 0x94, 0x30, 0x78, 0x8c, 0x05, 0x2f, 0xfb, 0xfb, 0x16, - 0xf4, 0xfd, 0x05, 0xde, 0x18, 0x6a, 0x63, 0x2d, 0x2e, 0xbe, 0xcf, 0x61, 0xe7, 0xde, 0xf2, 0xfd, - 0x84, 0x04, 0x31, 0xd3, 0x41, 0xbb, 0x9d, 0xda, 0x0f, 0xd3, 0xaa, 0x64, 0x10, 0xc6, 0x2b, 0x30, - 0xea, 0x3b, 0x77, 0x88, 0x2f, 0x1d, 0xc6, 0x59, 0x8b, 0xed, 0xaa, 0x8e, 0xc4, 0x26, 0x2d, 0x2d, - 0xbc, 0xae, 0xfb, 0xd3, 0x85, 0x92, 0xa4, 0x0a, 0x1b, 0xce, 0x76, 0x6c, 0xd2, 0x52, 0x93, 0xe1, - 0x9e, 0x93, 0x34, 0x36, 0x85, 0x35, 0xa7, 0x9a, 0x7b, 0x9b, 0x02, 0x31, 0xc7, 0xa1, 0x05, 0x18, - 0x97, 0x33, 0xf6, 0x16, 0x35, 0xf3, 0xc3, 0x40, 0xe8, 0x99, 0xea, 0xd6, 0x31, 0x36, 0xd1, 0x38, - 0x4b, 0x8f, 0x3e, 0x09, 0x63, 0x74, 0x70, 0xc2, 0x56, 0x22, 0x43, 0x4c, 0xfa, 0x59, 0x88, 0x09, - 0x8b, 0x50, 0x5e, 0x33, 0x30, 0x38, 0x43, 0x69, 0xbf, 0x05, 0x27, 0xae, 0x86, 0x8e, 0xbb, 0xe8, - 0xf8, 0x4e, 0xd0, 0x20, 0xd1, 0x6a, 0xb0, 0x91, 0x7b, 0x7c, 0xad, 0x1f, 0x31, 0x97, 0xf2, 0x8e, - 0x98, 0xed, 0x08, 0x90, 0x5e, 0x81, 0x08, 0x8e, 0x7a, 0x13, 0x06, 0x3d, 0x5e, 0x95, 0x98, 0xb6, - 0xe7, 0xf3, 0xfc, 0x51, 0x6d, 0x6d, 0xd4, 0x82, 0x7d, 0x38, 0x00, 0x4b, 0x96, 0xd4, 0x04, 0xe9, - 0xe4, 0xc0, 0xca, 0xb7, 0xf2, 0xec, 0xbf, 0x69, 0xc1, 0xf8, 0xf5, 0xcc, 0x95, 0xd6, 0xa7, 0x61, - 0x80, 0x27, 0x46, 0xc8, 0xba, 0x58, 0xea, 0x0c, 0x8a, 0x05, 0xf6, 0x81, 0x5b, 0xf8, 0xbf, 0x5c, - 0x82, 0x0a, 0x0b, 0xb3, 0x6d, 0x52, 0x73, 0xe2, 0xe8, 0xd5, 0xd4, 0x6b, 0x86, 0x9a, 0x9a, 0x63, - 0x65, 0xaa, 0x86, 0x75, 0xd3, 0x52, 0xd1, 0x4d, 0x75, 0xd5, 0xb3, 0x90, 0x81, 0x99, 0x32, 0xe4, - 0xd7, 0x01, 0xc7, 0xcc, 0x9b, 0xa1, 0xf2, 0x1a, 0x28, 0x3b, 0xf4, 0x55, 0xb4, 0x0f, 0xdd, 0xa1, - 0xaf, 0x6a, 0x59, 0x17, 0xe1, 0x54, 0xd3, 0x1a, 0xcf, 0xc4, 0xf7, 0xa7, 0x59, 0xf0, 0xa4, 0xe3, - 0x7b, 0x5f, 0x24, 0xea, 0xc6, 0xf4, 0xac, 0x08, 0x86, 0x14, 0xd0, 0x7d, 0x26, 0x67, 0xc4, 0x3f, - 0x7e, 0x21, 0x3e, 0x2d, 0x62, 0x5f, 0x86, 0xf1, 0xcc, 0xd0, 0xa1, 0x97, 0xa0, 0xbf, 0xb9, 0xe9, - 0xc4, 0x24, 0x13, 0xc7, 0xd2, 0x5f, 0xa3, 0xc0, 0xfd, 0xdd, 0xd9, 0x31, 0x55, 0x80, 0x41, 0x30, - 0xa7, 0xb6, 0xbf, 0x5a, 0x82, 0xbe, 0xeb, 0xa1, 0x7b, 0x1c, 0x53, 0xed, 0xb2, 0x31, 0xd5, 0x9e, - 0xce, 0x4f, 0xa7, 0xd1, 0x75, 0x96, 0xd5, 0x32, 0xb3, 0xec, 0x6c, 0x01, 0x5e, 0x07, 0x4f, 0xb0, - 0x2d, 0x18, 0x66, 0xe9, 0x3a, 0x44, 0x20, 0xcf, 0x0b, 0x86, 0x65, 0x35, 0x9b, 0xb1, 0xac, 0xc6, - 0x35, 0x52, 0xcd, 0xbe, 0x7a, 0x06, 0x06, 0x45, 0xe0, 0x48, 0x36, 0x74, 0x54, 0xd0, 0x62, 0x89, - 0xb7, 0xff, 0x4d, 0x19, 0x8c, 0xf4, 0x20, 0xe8, 0x77, 0x2c, 0x98, 0x8b, 0xf8, 0x35, 0x1c, 0xb7, - 0xda, 0x8a, 0xbc, 0x60, 0xa3, 0xde, 0xd8, 0x24, 0x6e, 0xcb, 0xf7, 0x82, 0x8d, 0xd5, 0x8d, 0x20, - 0x54, 0xe0, 0xe5, 0xfb, 0xa4, 0xd1, 0x62, 0x7e, 0xda, 0xc2, 0x59, 0x49, 0xd4, 0xa1, 0xe9, 0x85, - 0xbd, 0xdd, 0xd9, 0x39, 0xdc, 0x53, 0x2d, 0xb8, 0xc7, 0x56, 0xa1, 0x3f, 0xb2, 0x60, 0x9e, 0x27, - 0xc8, 0x28, 0xde, 0x93, 0x42, 0x16, 0x69, 0x4d, 0x32, 0x4d, 0xd9, 0xad, 0x91, 0x68, 0x6b, 0xf1, - 0x65, 0x31, 0xc8, 0xf3, 0xb5, 0xde, 0x6a, 0xc5, 0xbd, 0x36, 0xd3, 0xfe, 0x0f, 0x65, 0x18, 0xa5, - 0xe3, 0x99, 0x5e, 0x8a, 0x7f, 0xc9, 0x98, 0x26, 0x4f, 0x64, 0xa6, 0xc9, 0xa4, 0x41, 0xfc, 0x60, - 0xee, 0xc3, 0xc7, 0x30, 0xe9, 0x3b, 0x71, 0x72, 0x99, 0x38, 0x51, 0x72, 0x87, 0x38, 0xec, 0x6c, - 0x32, 0x1b, 0xf7, 0x50, 0xe0, 0xb8, 0x53, 0x05, 0x23, 0x5d, 0xcd, 0x32, 0xc3, 0xed, 0xfc, 0xd1, - 0x36, 0x20, 0x76, 0x0e, 0x1a, 0x39, 0x41, 0xcc, 0xfb, 0xe2, 0x09, 0xbf, 0x6e, 0x6f, 0xb5, 0xce, - 0x88, 0x5a, 0xd1, 0xd5, 0x36, 0x6e, 0xb8, 0x43, 0x0d, 0xda, 0x49, 0x77, 0x7f, 0xd1, 0x93, 0xee, - 0x81, 0x9c, 0x98, 0xed, 0xaf, 0x59, 0x70, 0x82, 0x7e, 0x16, 0x33, 0xbe, 0x37, 0x46, 0x21, 0x8c, - 0xd3, 0x69, 0xe7, 0x93, 0x44, 0xc2, 0xc4, 0xfa, 0xca, 0xd1, 0xac, 0x4d, 0x3e, 0xa9, 0xfa, 0x76, - 0xc5, 0x64, 0x86, 0xb3, 0xdc, 0xed, 0x6f, 0x5b, 0xc0, 0x22, 0xee, 0x8e, 0x61, 0x33, 0xbb, 0x64, - 0x6e, 0x66, 0x76, 0xbe, 0xc4, 0xe8, 0xb2, 0x8f, 0xbd, 0x08, 0x13, 0x14, 0x5b, 0x8b, 0xc2, 0xfb, - 0x3b, 0x52, 0xd1, 0xce, 0x77, 0xf0, 0x7e, 0xad, 0xc4, 0x97, 0x8d, 0xba, 0x4f, 0x88, 0x7e, 0xc1, - 0x82, 0xa1, 0x86, 0xd3, 0x74, 0x1a, 0x3c, 0xb9, 0x52, 0x01, 0xef, 0x8c, 0x51, 0x7e, 0x6e, 0x49, - 0x94, 0xe5, 0x9e, 0x85, 0x8f, 0xc9, 0xae, 0x4b, 0x70, 0xae, 0x37, 0x41, 0x55, 0x3e, 0x73, 0x17, - 0x46, 0x0d, 0x66, 0x47, 0x6a, 0x86, 0xfe, 0x82, 0xc5, 0x85, 0xbe, 0x32, 0x15, 0xee, 0xc1, 0x64, - 0xa0, 0xfd, 0xa7, 0xe2, 0x4c, 0x6a, 0xc6, 0x73, 0xc5, 0xc5, 0x3a, 0x93, 0x82, 0x5a, 0x74, 0x61, - 0x86, 0x21, 0x6e, 0xaf, 0xc3, 0xfe, 0x55, 0x0b, 0x1e, 0xd1, 0x09, 0xb5, 0x0b, 0xa0, 0x79, 0x7e, - 0xe3, 0x2a, 0x0c, 0x85, 0x4d, 0x12, 0x39, 0xa9, 0x59, 0x74, 0x56, 0x8e, 0xff, 0x0d, 0x01, 0xdf, - 0xdf, 0x9d, 0x9d, 0xd2, 0xb9, 0x4b, 0x38, 0x56, 0x25, 0x91, 0x0d, 0x03, 0x6c, 0x5c, 0x62, 0x71, - 0x75, 0x97, 0x25, 0x1b, 0x62, 0x87, 0x2a, 0x31, 0x16, 0x18, 0xfb, 0xef, 0x58, 0x7c, 0xba, 0xe9, - 0x4d, 0x47, 0x5f, 0x82, 0x89, 0x2d, 0x6a, 0x41, 0x2d, 0xdf, 0x6f, 0xd2, 0x8d, 0x94, 0x1d, 0x27, - 0x5b, 0x45, 0xb6, 0x8f, 0x2e, 0xdd, 0x5d, 0x9c, 0x16, 0xad, 0x9f, 0xb8, 0x96, 0x61, 0x8b, 0xdb, - 0x2a, 0xb2, 0xff, 0x71, 0x89, 0xaf, 0x59, 0xa6, 0xc3, 0x3d, 0x03, 0x83, 0xcd, 0xd0, 0x5d, 0x5a, - 0xad, 0x62, 0x31, 0x56, 0x4a, 0xe8, 0xd4, 0x38, 0x18, 0x4b, 0x3c, 0xba, 0x00, 0x40, 0xee, 0x27, - 0x24, 0x0a, 0x1c, 0x5f, 0x1d, 0x03, 0x2b, 0x55, 0x69, 0x59, 0x61, 0xb0, 0x46, 0x45, 0xcb, 0x34, - 0xa3, 0x70, 0xdb, 0x73, 0xd9, 0xcd, 0x85, 0xb2, 0x59, 0xa6, 0xa6, 0x30, 0x58, 0xa3, 0xa2, 0x76, - 0x6b, 0x2b, 0x88, 0xf9, 0x36, 0xe6, 0xdc, 0x11, 0xb9, 0x71, 0x86, 0x52, 0xbb, 0xf5, 0xa6, 0x8e, - 0xc4, 0x26, 0x2d, 0xba, 0x02, 0x03, 0x89, 0xc3, 0x0e, 0x37, 0xfb, 0x8b, 0x44, 0x8a, 0xac, 0x51, - 0x5a, 0x3d, 0x19, 0x11, 0x2d, 0x8a, 0x05, 0x0b, 0xfb, 0x0f, 0x2a, 0x00, 0xa9, 0xd6, 0x85, 0xbe, - 0xda, 0xbe, 0xe0, 0x3f, 0x5e, 0x54, 0x65, 0x7b, 0x70, 0xab, 0x1d, 0xbd, 0x67, 0xc1, 0xb0, 0xe3, - 0xfb, 0x61, 0xc3, 0x49, 0xd8, 0xf0, 0x94, 0x8a, 0x8a, 0x1e, 0xd1, 0x92, 0x85, 0xb4, 0x2c, 0x6f, - 0xcc, 0x0b, 0xf2, 0xc0, 0x51, 0xc3, 0xe4, 0xb6, 0x47, 0x6f, 0x02, 0xfa, 0x98, 0xd4, 0xda, 0xf9, - 0x17, 0x9e, 0xc9, 0x6a, 0xed, 0x15, 0x26, 0x70, 0x35, 0x85, 0x1d, 0xbd, 0x65, 0xe4, 0x92, 0xe9, - 0x2b, 0x72, 0xfd, 0xd4, 0xd0, 0x43, 0xf2, 0xd2, 0xc8, 0xa0, 0x37, 0xf4, 0x90, 0xea, 0xfe, 0x22, - 0xf7, 0xbb, 0x35, 0x75, 0x38, 0x27, 0x9c, 0x3a, 0x81, 0x71, 0xd7, 0xdc, 0x79, 0x45, 0x58, 0xd8, - 0xf9, 0xfc, 0x1a, 0x32, 0x5b, 0x76, 0xba, 0xd7, 0x66, 0x10, 0x38, 0x5b, 0x05, 0x7a, 0x83, 0x07, - 0xbc, 0xaf, 0x06, 0xeb, 0xa1, 0x08, 0x0d, 0x3b, 0x57, 0xe0, 0x9b, 0xef, 0xc4, 0x09, 0xd9, 0xa2, - 0x65, 0xd2, 0xcd, 0xf5, 0xba, 0xe0, 0x82, 0x15, 0x3f, 0xb4, 0x06, 0x03, 0xec, 0xb6, 0x51, 0x3c, - 0x3d, 0x54, 0xc4, 0x13, 0x67, 0x5e, 0xb2, 0x4d, 0xd7, 0x0f, 0xfb, 0x1b, 0x63, 0xc1, 0x0b, 0x5d, - 0x96, 0xd7, 0xec, 0xe3, 0xd5, 0xe0, 0x66, 0x4c, 0xd8, 0x35, 0xfb, 0xca, 0xe2, 0x47, 0xd2, 0x7b, - 0xf3, 0x1c, 0xde, 0x31, 0x9b, 0x9e, 0x51, 0x92, 0x2a, 0x36, 0xe2, 0xbf, 0x4c, 0xd2, 0x37, 0x0d, - 0x45, 0x1a, 0x6a, 0xa6, 0xf4, 0x4b, 0x07, 0xfb, 0x96, 0xc9, 0x0c, 0x67, 0xb9, 0x1f, 0xeb, 0x96, - 0x3a, 0x13, 0xc0, 0x44, 0x76, 0x51, 0x1e, 0xe9, 0x16, 0xfe, 0x93, 0x3e, 0x18, 0x33, 0x27, 0x07, - 0x9a, 0x87, 0x8a, 0x60, 0xa2, 0x92, 0x76, 0xa9, 0x35, 0x70, 0x4d, 0x22, 0x70, 0x4a, 0xc3, 0xd2, - 0x97, 0xb1, 0xe2, 0x5a, 0x50, 0x50, 0x9a, 0xbe, 0x4c, 0x61, 0xb0, 0x46, 0x45, 0x35, 0xe1, 0x3b, - 0x61, 0x98, 0xa8, 0x9d, 0x40, 0xcd, 0x9b, 0x45, 0x06, 0xc5, 0x02, 0x4b, 0x77, 0x80, 0xbb, 0xf4, - 0x63, 0xfa, 0xa6, 0x57, 0x51, 0xed, 0x00, 0x57, 0x74, 0x24, 0x36, 0x69, 0xe9, 0x8e, 0x16, 0xc6, - 0x6c, 0x22, 0x0a, 0x7d, 0x3b, 0x0d, 0xb2, 0xaa, 0xf3, 0x1b, 0x78, 0x12, 0x8f, 0x3e, 0x07, 0x8f, - 0xa8, 0x0b, 0x73, 0x98, 0x7b, 0x69, 0x65, 0x8d, 0x03, 0x86, 0xc9, 0xfc, 0xc8, 0x52, 0x67, 0x32, - 0xdc, 0xad, 0x3c, 0x7a, 0x15, 0xc6, 0x84, 0xae, 0x2c, 0x39, 0x0e, 0x9a, 0x27, 0xf0, 0x57, 0x0c, - 0x2c, 0xce, 0x50, 0xa3, 0x2a, 0x4c, 0x50, 0x08, 0x53, 0x52, 0x25, 0x07, 0x7e, 0xf1, 0x4f, 0x6d, - 0xf5, 0x57, 0x32, 0x78, 0xdc, 0x56, 0x02, 0x2d, 0xc0, 0x38, 0x57, 0x56, 0xa8, 0x61, 0xc8, 0xbe, - 0x83, 0x88, 0xe7, 0x54, 0x0b, 0xe1, 0x86, 0x89, 0xc6, 0x59, 0x7a, 0x74, 0x11, 0x46, 0x9c, 0xa8, - 0xb1, 0xe9, 0x25, 0xa4, 0x91, 0xb4, 0x22, 0x9e, 0xc4, 0x42, 0x0b, 0x61, 0x58, 0xd0, 0x70, 0xd8, - 0xa0, 0xb4, 0xbf, 0x08, 0x27, 0x3a, 0x04, 0x8f, 0xd3, 0x89, 0xe3, 0x34, 0x3d, 0xd9, 0xa7, 0x4c, - 0xb8, 0xd4, 0x42, 0x6d, 0x55, 0xf6, 0x46, 0xa3, 0xa2, 0xb3, 0x93, 0xb9, 0xa7, 0xb5, 0x9c, 0x9a, - 0x6a, 0x76, 0xae, 0x48, 0x04, 0x4e, 0x69, 0xec, 0x3f, 0xaf, 0x80, 0xe6, 0xbd, 0x29, 0x10, 0x22, - 0x73, 0x11, 0x46, 0x64, 0x9a, 0x58, 0x2d, 0x3d, 0xa3, 0xea, 0xe6, 0x25, 0x0d, 0x87, 0x0d, 0x4a, - 0xda, 0xb6, 0x40, 0xfa, 0xa4, 0xb2, 0xc1, 0x59, 0xca, 0x59, 0x85, 0x53, 0x1a, 0x74, 0x0e, 0x86, - 0x62, 0xe2, 0xaf, 0x5f, 0xf5, 0x82, 0xbb, 0x62, 0x62, 0x2b, 0xc9, 0x5c, 0x17, 0x70, 0xac, 0x28, - 0xd0, 0x22, 0x94, 0x5b, 0x9e, 0x2b, 0xa6, 0xb2, 0x54, 0x1b, 0xca, 0x37, 0x57, 0xab, 0xfb, 0xbb, - 0xb3, 0x4f, 0x74, 0xcb, 0x99, 0x4b, 0xed, 0xf3, 0x78, 0x8e, 0x2e, 0x3f, 0x5a, 0xb8, 0x93, 0x9f, - 0x7e, 0xa0, 0x47, 0x3f, 0xfd, 0x05, 0x00, 0xd1, 0x6b, 0x39, 0x97, 0xcb, 0xe9, 0x57, 0xbb, 0xa4, - 0x30, 0x58, 0xa3, 0xa2, 0x56, 0x7e, 0x23, 0x22, 0x8e, 0x34, 0x84, 0x79, 0x50, 0xf3, 0xd0, 0xe1, - 0xad, 0xfc, 0xa5, 0x2c, 0x33, 0xdc, 0xce, 0x1f, 0x85, 0x30, 0xe9, 0x8a, 0x5b, 0x99, 0x69, 0xa5, - 0x95, 0xde, 0x23, 0xa9, 0x69, 0x85, 0xd5, 0x2c, 0x23, 0xdc, 0xce, 0x1b, 0x7d, 0x01, 0x66, 0x24, - 0xb0, 0xfd, 0x4a, 0x2c, 0x5b, 0x2e, 0xe5, 0xc5, 0xd3, 0x7b, 0xbb, 0xb3, 0x33, 0xd5, 0xae, 0x54, - 0xf8, 0x00, 0x0e, 0xe8, 0x4d, 0x18, 0x60, 0xe7, 0x3a, 0xf1, 0xf4, 0x30, 0xdb, 0xf1, 0x5e, 0x2c, - 0x12, 0x8f, 0x4f, 0x67, 0xfd, 0x1c, 0x3b, 0x1d, 0x12, 0x91, 0xa6, 0xe9, 0x61, 0x19, 0x03, 0x62, - 0xc1, 0x13, 0x35, 0x61, 0xd8, 0x09, 0x82, 0x30, 0x71, 0xb8, 0x22, 0x36, 0x52, 0x44, 0x97, 0xd4, - 0xaa, 0x58, 0x48, 0xcb, 0xf2, 0x7a, 0x54, 0xf0, 0x9a, 0x86, 0xc1, 0x7a, 0x15, 0xe8, 0x1e, 0x8c, - 0x87, 0xf7, 0xa8, 0xc0, 0x94, 0x47, 0x1b, 0xf1, 0xf4, 0xa8, 0xd9, 0xb1, 0x1c, 0x47, 0xad, 0x51, - 0x58, 0x93, 0x64, 0x26, 0x53, 0x9c, 0xad, 0x05, 0xcd, 0x19, 0xee, 0xea, 0xb1, 0x34, 0x9e, 0x3a, - 0x75, 0x57, 0xeb, 0xde, 0x69, 0x76, 0xed, 0x9a, 0xc7, 0x50, 0x32, 0x89, 0x30, 0x9e, 0xb9, 0x76, - 0x9d, 0xa2, 0xb0, 0x4e, 0x37, 0xf3, 0x09, 0x18, 0xd6, 0x06, 0xbe, 0x97, 0xc0, 0xdd, 0x99, 0x57, - 0x61, 0x22, 0x3b, 0xa0, 0x3d, 0x05, 0xfe, 0xfe, 0xef, 0x12, 0x8c, 0x77, 0x38, 0x37, 0xba, 0xeb, - 0xb1, 0xe0, 0x73, 0x43, 0xf4, 0x5d, 0xf1, 0x02, 0x17, 0x33, 0x8c, 0x29, 0xc0, 0x4a, 0x05, 0x04, - 0x98, 0x94, 0xa6, 0xe5, 0xae, 0xd2, 0x54, 0x08, 0xad, 0xbe, 0x0f, 0x22, 0xb4, 0xcc, 0x7d, 0xa2, - 0xbf, 0xd0, 0x3e, 0xf1, 0x00, 0x04, 0x9d, 0xb1, 0xd5, 0x0c, 0x16, 0xd8, 0x6a, 0xbe, 0x55, 0x82, - 0x89, 0x34, 0xc8, 0x59, 0xe4, 0x8e, 0x3e, 0xfa, 0x63, 0x88, 0x35, 0xe3, 0x18, 0x22, 0x2f, 0x35, - 0x74, 0xa6, 0x7d, 0x5d, 0x8f, 0x24, 0xde, 0xcc, 0x1c, 0x49, 0xbc, 0xd8, 0x23, 0xdf, 0x83, 0x8f, - 0x27, 0xbe, 0x57, 0x82, 0x93, 0xd9, 0x22, 0x4b, 0xbe, 0xe3, 0x6d, 0x1d, 0xc3, 0x78, 0x7d, 0xce, - 0x18, 0xaf, 0x97, 0x7b, 0xeb, 0x17, 0x6b, 0x64, 0xd7, 0x41, 0x73, 0x32, 0x83, 0xf6, 0x89, 0xc3, - 0x30, 0x3f, 0x78, 0xe4, 0x7e, 0xdf, 0x82, 0x47, 0x3b, 0x96, 0x3b, 0x06, 0xc7, 0xeb, 0xeb, 0xa6, - 0xe3, 0xf5, 0x85, 0x43, 0xf4, 0xae, 0x8b, 0x27, 0xf6, 0xd7, 0xca, 0x5d, 0x7a, 0xc5, 0x5c, 0x53, - 0x37, 0x60, 0xd8, 0x69, 0x34, 0x48, 0x1c, 0x5f, 0x0b, 0x5d, 0x95, 0xc0, 0xe9, 0x79, 0xb6, 0xb7, - 0xa4, 0xe0, 0xfd, 0xdd, 0xd9, 0x99, 0x2c, 0x8b, 0x14, 0x8d, 0x75, 0x0e, 0x66, 0x6a, 0xb9, 0xd2, - 0x11, 0xa5, 0x96, 0xbb, 0x00, 0xb0, 0xad, 0xac, 0xd8, 0xac, 0xc7, 0x4b, 0xb3, 0x6f, 0x35, 0x2a, - 0xf4, 0x57, 0x99, 0x46, 0xc8, 0x83, 0x34, 0xfa, 0xcc, 0xfb, 0x92, 0x39, 0xdf, 0x4f, 0x0f, 0xf8, - 0xe0, 0xd7, 0x32, 0x95, 0x77, 0x50, 0xb1, 0x44, 0x9f, 0x81, 0x89, 0x98, 0x5f, 0xfe, 0x5f, 0xf2, - 0x9d, 0x98, 0x45, 0xf7, 0x0b, 0x79, 0xca, 0x6e, 0x58, 0xd6, 0x33, 0x38, 0xdc, 0x46, 0x6d, 0x7f, - 0xb7, 0x0c, 0x1f, 0x3e, 0x60, 0xda, 0xa2, 0x05, 0xf3, 0xd4, 0xf6, 0xb9, 0xac, 0xff, 0x67, 0xa6, - 0x63, 0x61, 0xc3, 0x21, 0x94, 0xf9, 0xda, 0xa5, 0x0f, 0xfc, 0xb5, 0xbf, 0xa1, 0x7b, 0xeb, 0x78, - 0xdc, 0xe6, 0xa5, 0x43, 0x2f, 0xcc, 0x9f, 0x56, 0x67, 0xfd, 0x57, 0x2c, 0x78, 0xa2, 0x63, 0xb7, - 0x8c, 0x28, 0x91, 0x79, 0xa8, 0x34, 0x28, 0x50, 0xbb, 0x8b, 0x93, 0x5e, 0x82, 0x93, 0x08, 0x9c, - 0xd2, 0x18, 0xc1, 0x20, 0xa5, 0xdc, 0x60, 0x90, 0xdf, 0xb5, 0x60, 0x2a, 0xdb, 0x88, 0x63, 0x90, - 0x5b, 0x75, 0x53, 0x6e, 0xcd, 0xf5, 0xf6, 0xf1, 0xbb, 0x88, 0xac, 0xf7, 0xc6, 0xe0, 0x54, 0xdb, - 0xae, 0xc7, 0x47, 0xf1, 0xe7, 0x2c, 0x98, 0xdc, 0x60, 0xda, 0xbb, 0x76, 0xe1, 0x49, 0xf4, 0x2b, - 0xe7, 0x96, 0xd8, 0x81, 0xf7, 0xa4, 0xb8, 0x2d, 0xd2, 0x46, 0x82, 0xdb, 0x2b, 0x43, 0x5f, 0xb7, - 0x60, 0xca, 0xb9, 0x17, 0xb7, 0xbd, 0x6c, 0x22, 0x26, 0xd2, 0xab, 0x39, 0xce, 0xb2, 0x9c, 0x37, - 0x51, 0x16, 0xa7, 0xf7, 0x76, 0x67, 0xa7, 0x3a, 0x51, 0xe1, 0x8e, 0xb5, 0xd2, 0xef, 0xbb, 0x29, - 0xae, 0x53, 0x14, 0xbb, 0xba, 0xd7, 0xe9, 0xf2, 0x05, 0x17, 0x6b, 0x12, 0x83, 0x15, 0x47, 0xf4, - 0x36, 0x54, 0x36, 0xe4, 0x1d, 0xa7, 0xac, 0xd8, 0xec, 0x32, 0xcc, 0x9d, 0xae, 0x44, 0xf1, 0xd8, - 0x7d, 0x85, 0xc2, 0x29, 0x53, 0x74, 0x19, 0xca, 0xc1, 0x7a, 0x2c, 0x6e, 0x13, 0xe7, 0xc5, 0x00, - 0x99, 0x91, 0x57, 0xfc, 0x02, 0xe6, 0xf5, 0x95, 0x3a, 0xa6, 0x2c, 0x28, 0xa7, 0xe8, 0x8e, 0x2b, - 0xbc, 0xc4, 0x39, 0x9c, 0xf0, 0x62, 0xb5, 0x9d, 0x13, 0x5e, 0xac, 0x62, 0xca, 0x02, 0xd5, 0xa0, - 0x9f, 0x5d, 0xd6, 0x10, 0x2e, 0xe0, 0x9c, 0x2b, 0xe7, 0x6d, 0x57, 0x52, 0x78, 0x06, 0x44, 0x06, - 0xc6, 0x9c, 0x11, 0x5a, 0x83, 0x81, 0x06, 0x4b, 0xe2, 0x2f, 0x6c, 0xf3, 0xbc, 0x64, 0x0c, 0x6d, - 0x09, 0xff, 0xf9, 0xb9, 0x17, 0x87, 0x63, 0xc1, 0x8b, 0x71, 0x25, 0xcd, 0xcd, 0xf5, 0x58, 0x18, - 0xdf, 0x79, 0x5c, 0xdb, 0x9e, 0x63, 0x10, 0x5c, 0x19, 0x1c, 0x0b, 0x5e, 0xa8, 0x0a, 0xa5, 0xf5, - 0x86, 0x48, 0xa4, 0x9a, 0xe3, 0xfa, 0x35, 0x6f, 0xd3, 0x2e, 0x0e, 0xec, 0xed, 0xce, 0x96, 0x56, - 0x96, 0x70, 0x69, 0xbd, 0x81, 0x5e, 0x87, 0xc1, 0x75, 0x7e, 0x3f, 0x52, 0x24, 0x4d, 0x3d, 0x9f, - 0x77, 0x89, 0xb3, 0xed, 0x32, 0x25, 0xbf, 0x9f, 0x21, 0x10, 0x58, 0xb2, 0x63, 0xf9, 0xe4, 0xd4, - 0x8d, 0x4f, 0x91, 0x35, 0x75, 0xae, 0xb7, 0x1b, 0xa2, 0xc2, 0x26, 0x55, 0x50, 0xac, 0x71, 0xa4, - 0x73, 0xde, 0x91, 0xef, 0x91, 0xb0, 0x8c, 0xa9, 0xb9, 0x73, 0xbe, 0xe3, 0xf3, 0x25, 0x7c, 0xce, - 0x2b, 0x14, 0x4e, 0x99, 0xa2, 0x16, 0x8c, 0x6e, 0xc7, 0xcd, 0x4d, 0x22, 0x97, 0x3e, 0x4b, 0xa3, - 0x3a, 0x7c, 0xe1, 0x53, 0x39, 0xb9, 0x71, 0x45, 0x11, 0x2f, 0x4a, 0x5a, 0x8e, 0xdf, 0x26, 0xc1, - 0x58, 0x02, 0xaf, 0x5b, 0x3a, 0x5b, 0x6c, 0xd6, 0x42, 0x3f, 0xc9, 0xbb, 0xad, 0xf0, 0xce, 0x4e, - 0x42, 0x44, 0x9a, 0xd5, 0x9c, 0x4f, 0xf2, 0x1a, 0x27, 0x6e, 0xff, 0x24, 0x02, 0x81, 0x25, 0x3b, - 0x35, 0x64, 0x4c, 0x1a, 0x4f, 0x14, 0x1e, 0xb2, 0xb6, 0x3e, 0xa4, 0x43, 0xc6, 0xa4, 0x6f, 0xca, - 0x94, 0x49, 0xdd, 0xe6, 0x66, 0x98, 0x84, 0x41, 0x46, 0xf6, 0x4f, 0x16, 0x91, 0xba, 0xb5, 0x0e, - 0x25, 0xdb, 0xa5, 0x6e, 0x27, 0x2a, 0xdc, 0xb1, 0x56, 0x14, 0xc0, 0x58, 0x33, 0x8c, 0x92, 0x7b, - 0x61, 0x24, 0xe7, 0x21, 0x2a, 0x64, 0x23, 0x1a, 0x65, 0x44, 0xdd, 0x2c, 0x0c, 0xd7, 0xc4, 0xe0, - 0x0c, 0x77, 0xfb, 0x57, 0x07, 0xda, 0xb7, 0x77, 0xa6, 0xc0, 0xff, 0xed, 0xf6, 0xf3, 0xd2, 0xcf, - 0xf4, 0x6e, 0xa7, 0x3e, 0xc0, 0x93, 0xd3, 0xaf, 0x5b, 0x70, 0xaa, 0xd9, 0x71, 0xf3, 0x16, 0x1b, - 0x64, 0xaf, 0xe6, 0x2e, 0x1f, 0x24, 0x95, 0xb3, 0xb8, 0x33, 0x1e, 0x77, 0xa9, 0x33, 0xab, 0xf2, - 0x96, 0x3f, 0xb0, 0xca, 0x7b, 0x1b, 0x86, 0x98, 0x8e, 0x96, 0x66, 0x24, 0xe9, 0x31, 0x79, 0x07, - 0xdb, 0x6a, 0x97, 0x04, 0x0b, 0xac, 0x98, 0xd1, 0x81, 0x7b, 0x3c, 0xdb, 0x09, 0x4c, 0x18, 0x5a, - 0x64, 0xca, 0xe3, 0xf6, 0xc4, 0x8a, 0x18, 0x89, 0xc7, 0x6b, 0x07, 0x11, 0xef, 0xe7, 0x11, 0xe0, - 0x83, 0x2b, 0x43, 0xd5, 0x0e, 0x06, 0xcd, 0x80, 0x79, 0x38, 0x92, 0x6f, 0xd4, 0x1c, 0xaf, 0x22, - 0xfe, 0x4f, 0xac, 0x0e, 0x7a, 0x23, 0x37, 0x9e, 0x3e, 0x65, 0x1a, 0x4f, 0x4f, 0x67, 0x8d, 0xa7, - 0x36, 0x97, 0x89, 0x61, 0x37, 0x15, 0xcf, 0xf4, 0x59, 0x34, 0xe5, 0x8a, 0xed, 0xc3, 0x99, 0x3c, - 0xa1, 0xc4, 0x02, 0xa6, 0x5c, 0x75, 0x54, 0x98, 0x06, 0x4c, 0xb9, 0xab, 0x55, 0xcc, 0x30, 0x45, - 0x6f, 0xed, 0xdb, 0x3f, 0x5f, 0x82, 0x72, 0x2d, 0x74, 0x8f, 0xc1, 0x05, 0x74, 0xc9, 0x70, 0x01, - 0x3d, 0x95, 0xfb, 0x8a, 0x5c, 0x57, 0x87, 0xcf, 0x8d, 0x8c, 0xc3, 0xe7, 0xa3, 0xf9, 0xac, 0x0e, - 0x76, 0xef, 0x7c, 0xbf, 0x0c, 0xfa, 0x3b, 0x78, 0xe8, 0xbf, 0x1c, 0x26, 0x8e, 0xb6, 0x5c, 0xec, - 0x69, 0x3c, 0x51, 0x07, 0x8b, 0xb7, 0x92, 0xb7, 0xef, 0x7e, 0x6a, 0xc3, 0x69, 0x6f, 0x13, 0x6f, - 0x63, 0x33, 0x21, 0x6e, 0xb6, 0x63, 0xc7, 0x17, 0x4e, 0xfb, 0x67, 0x16, 0x8c, 0x67, 0x6a, 0x47, - 0x7e, 0xa7, 0x6b, 0x3b, 0x87, 0x74, 0xea, 0x4c, 0xe6, 0xde, 0xf3, 0x99, 0x03, 0x50, 0xbe, 0x79, - 0xe9, 0x38, 0x61, 0x3a, 0xa4, 0x72, 0xde, 0xc7, 0x58, 0xa3, 0x40, 0x2f, 0xc1, 0x70, 0x12, 0x36, - 0x43, 0x3f, 0xdc, 0xd8, 0xb9, 0x42, 0x64, 0x3e, 0x09, 0x75, 0xae, 0xb1, 0x96, 0xa2, 0xb0, 0x4e, - 0x67, 0xff, 0xa0, 0x0c, 0xd9, 0x57, 0x14, 0xff, 0x72, 0x9e, 0xfe, 0xf4, 0xcc, 0xd3, 0x3f, 0xb4, - 0x60, 0x82, 0xd6, 0xce, 0x02, 0x5c, 0x64, 0xd8, 0xab, 0x7a, 0x76, 0xc0, 0x3a, 0xe0, 0xd9, 0x81, - 0xa7, 0xa9, 0xb4, 0x73, 0xc3, 0x56, 0x22, 0x5c, 0x3d, 0x9a, 0x10, 0xa3, 0x50, 0x2c, 0xb0, 0x82, - 0x8e, 0x44, 0x91, 0xb8, 0x1f, 0xa4, 0xd3, 0x91, 0x28, 0xc2, 0x02, 0x2b, 0x5f, 0x25, 0xe8, 0xeb, - 0xf2, 0x2a, 0x01, 0xcb, 0xc8, 0x24, 0x82, 0x2a, 0x84, 0x5a, 0xa1, 0x65, 0x64, 0x92, 0xd1, 0x16, - 0x29, 0x8d, 0xfd, 0x9d, 0x32, 0x8c, 0xd4, 0x42, 0x37, 0x8d, 0x67, 0x7f, 0xd1, 0x88, 0x67, 0x3f, - 0x93, 0x89, 0x67, 0x9f, 0xd0, 0x69, 0x1f, 0x4c, 0x38, 0xbb, 0xc8, 0xdc, 0xc5, 0xde, 0xcd, 0x38, - 0x64, 0x28, 0xbb, 0x91, 0xb9, 0x4b, 0x31, 0xc2, 0x26, 0xdf, 0x9f, 0xa5, 0x10, 0xf6, 0xff, 0x6b, - 0xc1, 0x58, 0x2d, 0x74, 0xe9, 0x04, 0xfd, 0x59, 0x9a, 0x8d, 0x7a, 0xbe, 0xaf, 0x81, 0x03, 0xf2, - 0x7d, 0xfd, 0x2b, 0x0b, 0x06, 0x6b, 0xa1, 0x7b, 0x0c, 0x6e, 0xd0, 0x15, 0xd3, 0x0d, 0xfa, 0x44, - 0xae, 0xe4, 0xed, 0xe2, 0xf9, 0xfc, 0x6e, 0x19, 0x46, 0x69, 0x8b, 0xc3, 0x0d, 0xf9, 0xbd, 0x8c, - 0xb1, 0xb1, 0x0a, 0x8c, 0x0d, 0x55, 0x09, 0x43, 0xdf, 0x0f, 0xef, 0x65, 0xbf, 0xdd, 0x0a, 0x83, - 0x62, 0x81, 0x45, 0xe7, 0x60, 0xa8, 0x19, 0x91, 0x6d, 0x2f, 0x6c, 0xc5, 0xd9, 0xbb, 0x86, 0x35, - 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x08, 0x23, 0xb1, 0x17, 0x34, 0x88, 0x0c, 0xb9, 0xe8, 0x63, 0x21, - 0x17, 0x3c, 0xb5, 0xa2, 0x06, 0xc7, 0x06, 0x15, 0xba, 0x0d, 0x15, 0xf6, 0x9f, 0xad, 0xa0, 0xde, - 0x9f, 0x15, 0xe0, 0xf9, 0xc4, 0x24, 0x03, 0x9c, 0xf2, 0x42, 0x17, 0x00, 0x12, 0x19, 0x1c, 0x12, - 0x8b, 0xac, 0x28, 0x4a, 0x2f, 0x55, 0x61, 0x23, 0x31, 0xd6, 0xa8, 0xd0, 0x73, 0x50, 0x49, 0x1c, - 0xcf, 0xbf, 0xea, 0x05, 0x24, 0x16, 0xc1, 0x35, 0x22, 0x4d, 0xb2, 0x00, 0xe2, 0x14, 0x4f, 0xf7, - 0x7b, 0x76, 0xd3, 0x99, 0x3f, 0x59, 0x32, 0xc4, 0xa8, 0xd9, 0x7e, 0x7f, 0x55, 0x41, 0xb1, 0x46, - 0x61, 0x5f, 0x84, 0x93, 0xb5, 0xd0, 0xa5, 0x46, 0xfc, 0x4a, 0x18, 0xdd, 0x73, 0x22, 0x57, 0x7e, - 0xbf, 0x59, 0x99, 0x9d, 0x97, 0xee, 0xc9, 0xfd, 0xdc, 0x33, 0x68, 0x64, 0xdb, 0x7d, 0x81, 0xed, - 0xf8, 0x3d, 0x5e, 0x94, 0xf8, 0x71, 0x09, 0x50, 0x8d, 0x85, 0xaf, 0x18, 0x2f, 0xdc, 0x6c, 0xc2, - 0x58, 0x4c, 0xae, 0x7a, 0x41, 0xeb, 0xbe, 0x60, 0x55, 0xec, 0x66, 0x4a, 0x7d, 0x59, 0x2f, 0xc3, - 0xfd, 0x11, 0x26, 0x0c, 0x67, 0xf8, 0xd2, 0xc1, 0x8c, 0x5a, 0xc1, 0x42, 0x7c, 0x33, 0x26, 0x91, - 0x78, 0xd1, 0x85, 0x0d, 0x26, 0x96, 0x40, 0x9c, 0xe2, 0xe9, 0xe4, 0x61, 0x7f, 0xae, 0x87, 0x01, - 0x0e, 0xc3, 0x44, 0x4e, 0x37, 0x96, 0xe1, 0x5f, 0x83, 0x63, 0x83, 0x0a, 0xad, 0x00, 0x8a, 0x5b, - 0xcd, 0xa6, 0xcf, 0x4e, 0x04, 0x1d, 0xff, 0x52, 0x14, 0xb6, 0x9a, 0x3c, 0x8a, 0x59, 0x24, 0xc7, - 0xaf, 0xb7, 0x61, 0x71, 0x87, 0x12, 0x54, 0x58, 0xac, 0xc7, 0xec, 0xb7, 0xb8, 0xf6, 0xcc, 0xbd, - 0x8a, 0x75, 0x06, 0xc2, 0x12, 0x67, 0x7f, 0x99, 0x6d, 0x70, 0xec, 0xa9, 0x8d, 0xa4, 0x15, 0x11, - 0xb4, 0x05, 0xa3, 0x4d, 0xb6, 0x89, 0x25, 0x51, 0xe8, 0xfb, 0x44, 0xea, 0x97, 0x87, 0x0b, 0xa0, - 0xe1, 0xc9, 0xf5, 0x75, 0x76, 0xd8, 0xe4, 0x6e, 0xff, 0xe2, 0x18, 0x93, 0x55, 0xe2, 0x50, 0x76, - 0x50, 0x84, 0xca, 0x0a, 0x4d, 0xee, 0x23, 0x45, 0x1e, 0xcd, 0x4a, 0xf7, 0x01, 0x11, 0x78, 0x8b, - 0x25, 0x17, 0xf4, 0x79, 0x16, 0x08, 0xce, 0x05, 0x44, 0xf1, 0xa7, 0x00, 0x39, 0xbd, 0x11, 0x04, - 0x2e, 0x58, 0x60, 0x8d, 0x1d, 0xba, 0x0a, 0xa3, 0xe2, 0x65, 0x06, 0xe1, 0xa6, 0x28, 0x1b, 0x26, - 0xf6, 0x28, 0xd6, 0x91, 0xfb, 0x59, 0x00, 0x36, 0x0b, 0xa3, 0x0d, 0x78, 0x5c, 0x7b, 0x79, 0xa8, - 0x43, 0xb0, 0x17, 0x97, 0x3c, 0x4f, 0xec, 0xed, 0xce, 0x3e, 0xbe, 0x76, 0x10, 0x21, 0x3e, 0x98, - 0x0f, 0xba, 0x01, 0x27, 0x9d, 0x46, 0xe2, 0x6d, 0x93, 0x2a, 0x71, 0x5c, 0xdf, 0x0b, 0x88, 0x79, - 0x37, 0xfe, 0xd1, 0xbd, 0xdd, 0xd9, 0x93, 0x0b, 0x9d, 0x08, 0x70, 0xe7, 0x72, 0xe8, 0x53, 0x50, - 0x71, 0x83, 0x58, 0x8c, 0xc1, 0x80, 0xf1, 0xd0, 0x56, 0xa5, 0x7a, 0xbd, 0xae, 0xfa, 0x9f, 0xfe, - 0xc1, 0x69, 0x01, 0xf4, 0x2e, 0x7f, 0x48, 0x5e, 0x59, 0x33, 0xfc, 0x81, 0xb7, 0x97, 0x0b, 0xd9, - 0xcf, 0xc6, 0x8d, 0x15, 0xee, 0xc1, 0x53, 0x41, 0x95, 0xc6, 0x65, 0x16, 0xa3, 0x0a, 0xf4, 0x59, - 0x40, 0x31, 0x89, 0xb6, 0xbd, 0x06, 0x59, 0x68, 0xb0, 0x7c, 0xa4, 0xcc, 0xc7, 0x33, 0x64, 0xdc, - 0x2e, 0x40, 0xf5, 0x36, 0x0a, 0xdc, 0xa1, 0x14, 0xba, 0x4c, 0x25, 0x8f, 0x0e, 0x15, 0x31, 0xb0, - 0x52, 0x31, 0x9c, 0xae, 0x92, 0x66, 0x44, 0x1a, 0x4e, 0x42, 0x5c, 0x93, 0x23, 0xce, 0x94, 0xa3, - 0xfb, 0x92, 0x4a, 0x39, 0x0f, 0x66, 0xe4, 0x66, 0x7b, 0xda, 0x79, 0x6a, 0x67, 0x6d, 0x86, 0x71, - 0x72, 0x9d, 0x24, 0xf7, 0xc2, 0xe8, 0x2e, 0x3b, 0x69, 0x18, 0xd2, 0x92, 0xbb, 0xa5, 0x28, 0xac, - 0xd3, 0x51, 0x1d, 0x8a, 0x1d, 0x71, 0xad, 0x56, 0xd9, 0xf9, 0xc1, 0x50, 0xba, 0x76, 0x2e, 0x73, - 0x30, 0x96, 0x78, 0x49, 0xba, 0x5a, 0x5b, 0x62, 0x67, 0x01, 0x19, 0xd2, 0xd5, 0xda, 0x12, 0x96, - 0x78, 0x14, 0xb6, 0x3f, 0x67, 0x36, 0x56, 0xe4, 0x5c, 0xa6, 0x5d, 0x92, 0x17, 0x7c, 0xd1, 0xec, - 0x3e, 0x4c, 0xa8, 0x27, 0xd5, 0x78, 0xde, 0xcd, 0x78, 0x7a, 0xbc, 0xc8, 0x33, 0xf6, 0x1d, 0xd3, - 0x77, 0x2a, 0xbf, 0xde, 0x6a, 0x86, 0x27, 0x6e, 0xab, 0xc5, 0xc8, 0xf1, 0x30, 0x91, 0xfb, 0x8c, - 0xc0, 0x3c, 0x54, 0xe2, 0xd6, 0x1d, 0x37, 0xdc, 0x72, 0xbc, 0x80, 0x39, 0xec, 0xf5, 0x47, 0xd9, - 0x25, 0x02, 0xa7, 0x34, 0xa8, 0x06, 0x43, 0x8e, 0x30, 0xe1, 0x84, 0x63, 0x3d, 0xe7, 0x0e, 0xb8, - 0x34, 0xf8, 0xb8, 0x77, 0x55, 0xfe, 0xc3, 0x8a, 0x0b, 0x7a, 0x05, 0x46, 0xc5, 0x15, 0x26, 0x11, - 0x6a, 0x78, 0xc2, 0x0c, 0x77, 0xaf, 0xeb, 0x48, 0x6c, 0xd2, 0xa2, 0x0d, 0x18, 0xa3, 0x5c, 0x52, - 0x01, 0x38, 0x3d, 0xd5, 0x9b, 0x0c, 0xd5, 0x12, 0x36, 0xeb, 0x6c, 0x70, 0x86, 0x2d, 0x72, 0xe1, - 0x31, 0xa7, 0x95, 0x84, 0x5b, 0x74, 0x25, 0x98, 0xeb, 0x64, 0x2d, 0xbc, 0x4b, 0x82, 0xe9, 0x93, - 0x6c, 0x06, 0x9e, 0xd9, 0xdb, 0x9d, 0x7d, 0x6c, 0xe1, 0x00, 0x3a, 0x7c, 0x20, 0x17, 0xf4, 0x16, - 0x0c, 0x27, 0xa1, 0x2f, 0x22, 0x88, 0xe3, 0xe9, 0x53, 0x45, 0x32, 0xcf, 0xac, 0xa9, 0x02, 0xba, - 0x1b, 0x43, 0x31, 0xc1, 0x3a, 0xc7, 0x99, 0x4f, 0xc3, 0x64, 0x9b, 0x48, 0xea, 0x29, 0xc8, 0xf2, - 0xbf, 0xf6, 0x43, 0x45, 0x79, 0xf4, 0xd0, 0xbc, 0xe9, 0xbc, 0x7d, 0x34, 0xeb, 0xbc, 0x1d, 0xa2, - 0x0a, 0x94, 0xee, 0xaf, 0xfd, 0x42, 0x87, 0x47, 0xb4, 0x9f, 0xcd, 0x5d, 0x83, 0xc5, 0xef, 0x3d, - 0xf5, 0xf0, 0xd4, 0x78, 0x6a, 0xd5, 0xf5, 0x1d, 0x68, 0xd5, 0x15, 0x7c, 0x18, 0x8e, 0xda, 0x6f, - 0xcd, 0xd0, 0x5d, 0xad, 0x65, 0xdf, 0x3d, 0xaa, 0x51, 0x20, 0xe6, 0x38, 0xa6, 0x77, 0xd3, 0x3d, - 0x95, 0xe9, 0xdd, 0x83, 0x87, 0xd4, 0xbb, 0x25, 0x03, 0x9c, 0xf2, 0x42, 0xdb, 0x30, 0xd9, 0x30, - 0x9f, 0xb1, 0x52, 0xb7, 0x99, 0x9e, 0xef, 0xe1, 0x19, 0xa9, 0x96, 0xf6, 0xc6, 0xc5, 0x52, 0x96, - 0x1f, 0x6e, 0xaf, 0x02, 0xbd, 0x02, 0x43, 0xef, 0x86, 0x31, 0x3b, 0x56, 0x10, 0x1b, 0x8b, 0xbc, - 0x35, 0x32, 0xf4, 0xda, 0x8d, 0x3a, 0x83, 0xef, 0xef, 0xce, 0x0e, 0xd7, 0x42, 0x57, 0xfe, 0xc5, - 0xaa, 0x00, 0xfa, 0x8a, 0x05, 0x27, 0x8d, 0x75, 0xa6, 0x5a, 0x0e, 0x87, 0x69, 0xf9, 0xe3, 0xa2, - 0xe6, 0x93, 0xab, 0x9d, 0x78, 0xe2, 0xce, 0x55, 0xd9, 0xbf, 0xcd, 0x5d, 0x98, 0xc2, 0xa9, 0x41, - 0xe2, 0x96, 0x7f, 0x1c, 0xf9, 0xe6, 0x6f, 0x18, 0xfe, 0x96, 0x07, 0xe0, 0x44, 0xff, 0xcf, 0x16, - 0x73, 0xa2, 0xaf, 0x91, 0xad, 0xa6, 0xef, 0x24, 0xc7, 0x11, 0x83, 0xfb, 0x79, 0x18, 0x4a, 0x44, - 0x6d, 0xc5, 0x92, 0xe5, 0x6b, 0xcd, 0x63, 0x87, 0x0b, 0x6a, 0x63, 0x92, 0x50, 0xac, 0x18, 0xda, - 0xff, 0x9e, 0x7f, 0x15, 0x89, 0x39, 0x06, 0x4f, 0xc1, 0x75, 0xd3, 0x53, 0xf0, 0x4c, 0xe1, 0xbe, - 0x74, 0xf1, 0x18, 0xfc, 0xc0, 0xec, 0x01, 0xb3, 0x1f, 0x7e, 0x7a, 0x4e, 0x79, 0xec, 0x5f, 0xb1, - 0x60, 0xaa, 0xd3, 0xa1, 0x38, 0x55, 0x30, 0xb8, 0xf5, 0xa2, 0xce, 0xbf, 0xd4, 0xa8, 0xde, 0x12, - 0x70, 0xac, 0x28, 0x0a, 0x67, 0xaf, 0xee, 0x2d, 0xc1, 0xd2, 0x0d, 0x30, 0x1f, 0x44, 0x43, 0xaf, - 0xf2, 0x90, 0x7b, 0x4b, 0xbd, 0x58, 0xd6, 0x5b, 0xb8, 0xbd, 0xfd, 0xeb, 0x25, 0x98, 0xe2, 0x4e, - 0xe8, 0x85, 0xed, 0xd0, 0x73, 0x6b, 0xa1, 0x2b, 0x2e, 0x20, 0xb8, 0x30, 0xd2, 0xd4, 0x8c, 0xcf, - 0x62, 0x09, 0x5b, 0x74, 0x73, 0x35, 0x55, 0xf8, 0x75, 0x28, 0x36, 0xb8, 0xd2, 0x5a, 0xc8, 0xb6, - 0xd7, 0x50, 0x3e, 0xcd, 0x52, 0xcf, 0x3b, 0x83, 0xaa, 0x65, 0x59, 0xe3, 0x83, 0x0d, 0xae, 0x47, - 0xf0, 0xe8, 0x84, 0xfd, 0x8f, 0x2c, 0x78, 0xa4, 0x4b, 0x52, 0x17, 0x5a, 0xdd, 0x3d, 0xe6, 0xf8, - 0x17, 0x2f, 0xee, 0xa9, 0xea, 0xf8, 0x71, 0x00, 0x16, 0x58, 0x74, 0x07, 0x80, 0xbb, 0xf3, 0xd9, - 0xfb, 0xeb, 0xa5, 0x22, 0x51, 0x43, 0x6d, 0xa9, 0x13, 0xb4, 0x5b, 0xf5, 0xea, 0xc5, 0x75, 0x8d, - 0xab, 0xfd, 0xed, 0x32, 0xf4, 0xf3, 0x87, 0x9d, 0x6b, 0x30, 0xb8, 0xc9, 0x93, 0xcc, 0xf6, 0x96, - 0xe3, 0x36, 0x35, 0x2e, 0x38, 0x00, 0x4b, 0x36, 0xe8, 0x1a, 0x9c, 0xa0, 0x3b, 0x8b, 0xe7, 0xf8, - 0x55, 0xe2, 0x3b, 0x3b, 0xd2, 0x5a, 0xe5, 0x2f, 0x11, 0xc8, 0x94, 0xd9, 0x27, 0x56, 0xdb, 0x49, - 0x70, 0xa7, 0x72, 0xe8, 0xd5, 0xb6, 0x9c, 0x70, 0x3c, 0x79, 0xaf, 0xd2, 0x54, 0x0f, 0xce, 0x0b, - 0x47, 0xf5, 0xe9, 0x66, 0x9b, 0x5d, 0xae, 0xbd, 0x9f, 0x6b, 0xda, 0xe2, 0x26, 0x2d, 0x8b, 0x2d, - 0x68, 0xb1, 0x98, 0x8a, 0xb5, 0xcd, 0x88, 0xc4, 0x9b, 0xa1, 0xef, 0x8a, 0xa7, 0x1f, 0xd3, 0xd8, - 0x82, 0x0c, 0x1e, 0xb7, 0x95, 0xa0, 0x5c, 0xd6, 0x1d, 0xcf, 0x6f, 0x45, 0x24, 0xe5, 0x32, 0x60, - 0x72, 0x59, 0xc9, 0xe0, 0x71, 0x5b, 0x09, 0x3a, 0xb7, 0x4e, 0x8a, 0xd7, 0x02, 0xe5, 0x15, 0x66, - 0x21, 0x82, 0x3e, 0x07, 0x83, 0x32, 0x90, 0xbd, 0x50, 0xa6, 0x0d, 0x11, 0x38, 0xa0, 0x5e, 0x1e, - 0xd4, 0x5e, 0xa6, 0x12, 0x21, 0xec, 0x92, 0xdf, 0x61, 0x5e, 0xa5, 0xfb, 0x53, 0x0b, 0x4e, 0x74, - 0x08, 0xc8, 0xe2, 0x22, 0x6d, 0xc3, 0x8b, 0x13, 0x95, 0x17, 0x5f, 0x13, 0x69, 0x1c, 0x8e, 0x15, - 0x05, 0x5d, 0x2d, 0x5c, 0x68, 0x66, 0x05, 0xa5, 0x08, 0x01, 0x11, 0xd8, 0xde, 0x04, 0x25, 0x3a, - 0x03, 0x7d, 0xad, 0x98, 0x44, 0xf2, 0x89, 0x38, 0x29, 0xe7, 0x99, 0x1f, 0x90, 0x61, 0xa8, 0xda, - 0xba, 0xa1, 0x5c, 0x70, 0x9a, 0xda, 0xca, 0x9d, 0x70, 0x1c, 0x67, 0x7f, 0xa3, 0x0c, 0xe3, 0x99, - 0xc0, 0x4c, 0xda, 0x90, 0xad, 0x30, 0xf0, 0x92, 0x50, 0x65, 0x3f, 0xe3, 0xaf, 0x52, 0x91, 0xe6, - 0xe6, 0x35, 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x2d, 0x5f, 0x05, 0xcd, 0xe6, 0xfb, 0x5f, 0xac, 0x1a, - 0x0f, 0x83, 0x16, 0x7d, 0xab, 0xe3, 0x49, 0xe8, 0x6b, 0x86, 0xea, 0x91, 0x67, 0xf5, 0x3d, 0xf1, - 0x62, 0xb5, 0x16, 0x86, 0x3e, 0x66, 0x48, 0xf4, 0x94, 0xe8, 0x7d, 0xe6, 0xe4, 0x02, 0x3b, 0x6e, - 0x18, 0x6b, 0x43, 0xf0, 0x0c, 0x0c, 0xde, 0x25, 0x3b, 0x91, 0x17, 0x6c, 0x64, 0xcf, 0x6d, 0xae, - 0x70, 0x30, 0x96, 0x78, 0xf3, 0x3d, 0x8e, 0xc1, 0x23, 0x7e, 0x8f, 0x63, 0x28, 0x77, 0x1f, 0xfc, - 0xae, 0x05, 0xe3, 0x2c, 0x25, 0xa8, 0xb8, 0x40, 0xef, 0x85, 0xc1, 0x31, 0xe8, 0x18, 0x4f, 0x42, - 0x7f, 0x44, 0x2b, 0xcd, 0x26, 0xd4, 0x67, 0x2d, 0xc1, 0x1c, 0x87, 0x1e, 0x83, 0x3e, 0xd6, 0x04, - 0xfa, 0x19, 0x47, 0x78, 0xe6, 0xf1, 0xaa, 0x93, 0x38, 0x98, 0x41, 0xd9, 0x5d, 0x28, 0x4c, 0x9a, - 0xbe, 0xc7, 0x1b, 0x9d, 0xba, 0x5b, 0x1f, 0xb6, 0xbb, 0x50, 0x1d, 0x1b, 0xf9, 0xa0, 0xee, 0x42, - 0x75, 0x66, 0x7e, 0xb0, 0x9e, 0xff, 0xbf, 0x4a, 0x70, 0xba, 0x63, 0xb9, 0xf4, 0x04, 0x78, 0xc5, - 0x38, 0x01, 0xbe, 0x90, 0x39, 0x01, 0xb6, 0x0f, 0x2e, 0xfd, 0x60, 0xce, 0x84, 0x3b, 0x1f, 0xd5, - 0x96, 0x8f, 0xf1, 0xa8, 0xb6, 0xaf, 0xa8, 0x8a, 0xd3, 0x9f, 0xa3, 0xe2, 0xfc, 0xbe, 0x05, 0x8f, - 0x76, 0x1c, 0xb2, 0x87, 0xee, 0xf2, 0x59, 0xc7, 0x56, 0x76, 0xb1, 0x4e, 0x7e, 0xb9, 0xdc, 0xa5, - 0x57, 0xcc, 0x4e, 0x39, 0x4b, 0xa5, 0x10, 0x43, 0xc6, 0x42, 0x79, 0x1b, 0xe1, 0x12, 0x88, 0xc3, - 0xb0, 0xc2, 0xa2, 0x58, 0xbb, 0xbc, 0xc5, 0x1b, 0xb9, 0x7c, 0xc8, 0x05, 0x35, 0x67, 0xfa, 0xc9, - 0xf5, 0xac, 0x00, 0xd9, 0x2b, 0x5d, 0xb7, 0x35, 0xcb, 0xb3, 0x7c, 0x18, 0xcb, 0x73, 0xa4, 0xb3, - 0xd5, 0x89, 0x16, 0x60, 0x7c, 0xcb, 0x0b, 0xd8, 0x33, 0x9e, 0xa6, 0xf6, 0xa4, 0x6e, 0xd0, 0x5e, - 0x33, 0xd1, 0x38, 0x4b, 0x3f, 0xf3, 0x0a, 0x8c, 0x1e, 0xde, 0xbb, 0xf6, 0x7e, 0x19, 0x3e, 0x7c, - 0x80, 0x50, 0xe0, 0xbb, 0x83, 0xf1, 0x5d, 0xb4, 0xdd, 0xa1, 0xed, 0xdb, 0xd4, 0x60, 0x6a, 0xbd, - 0xe5, 0xfb, 0x3b, 0x2c, 0x7e, 0x8a, 0xb8, 0x92, 0x42, 0x28, 0x35, 0xea, 0xbd, 0xf0, 0x95, 0x0e, - 0x34, 0xb8, 0x63, 0x49, 0xf4, 0x59, 0x40, 0xe1, 0x1d, 0x96, 0x34, 0xd7, 0x4d, 0xb3, 0x1e, 0xb0, - 0x4f, 0x50, 0x4e, 0x97, 0xea, 0x8d, 0x36, 0x0a, 0xdc, 0xa1, 0x14, 0xd5, 0x53, 0xd9, 0x53, 0xe3, - 0xaa, 0x59, 0x19, 0x3d, 0x15, 0xeb, 0x48, 0x6c, 0xd2, 0xa2, 0x4b, 0x30, 0xe9, 0x6c, 0x3b, 0x1e, - 0x4f, 0x82, 0x25, 0x19, 0x70, 0x45, 0x55, 0xf9, 0xaf, 0x16, 0xb2, 0x04, 0xb8, 0xbd, 0x0c, 0x6a, - 0x1a, 0x0e, 0x49, 0x9e, 0x2e, 0xff, 0x53, 0x87, 0x98, 0xc1, 0x85, 0x5d, 0x94, 0xf6, 0xff, 0xb0, - 0xe8, 0xd6, 0xd7, 0xe1, 0xc5, 0x47, 0x3a, 0x22, 0xca, 0xc1, 0xa6, 0x5d, 0x46, 0x53, 0x23, 0xb2, - 0xa4, 0x23, 0xb1, 0x49, 0xcb, 0xa7, 0x46, 0x9c, 0x86, 0x73, 0x1b, 0xda, 0xa6, 0xb8, 0xc7, 0xa9, - 0x28, 0xa8, 0x06, 0xed, 0x7a, 0xdb, 0x5e, 0x1c, 0x46, 0x62, 0x01, 0xf5, 0x18, 0xdc, 0x9b, 0xca, - 0xcb, 0x2a, 0x67, 0x83, 0x25, 0x3f, 0xfb, 0x9b, 0x25, 0x18, 0x95, 0x35, 0xbe, 0xd6, 0x0a, 0x13, - 0xe7, 0x18, 0xb6, 0xf4, 0xd7, 0x8c, 0x2d, 0x7d, 0xbe, 0xd8, 0xb5, 0x56, 0xd6, 0xb8, 0xae, 0x5b, - 0xf9, 0xe7, 0x32, 0x5b, 0xf9, 0xf9, 0x5e, 0x98, 0x1e, 0xbc, 0x85, 0xff, 0x47, 0x0b, 0x26, 0x0d, - 0xfa, 0x63, 0xd8, 0x49, 0x6a, 0xe6, 0x4e, 0xf2, 0x5c, 0x0f, 0xbd, 0xe9, 0xb2, 0x83, 0x7c, 0xa7, - 0x94, 0xe9, 0x05, 0xdb, 0x39, 0xbe, 0x04, 0x7d, 0x9b, 0x4e, 0xe4, 0x16, 0xcb, 0x08, 0xd9, 0x56, - 0x7c, 0xee, 0xb2, 0x13, 0xb9, 0x5c, 0xfe, 0x9f, 0x53, 0xef, 0x51, 0x39, 0x91, 0x9b, 0x7b, 0xcb, - 0x81, 0x55, 0x8a, 0x2e, 0xc2, 0x40, 0xdc, 0x08, 0x9b, 0x2a, 0x0e, 0xf4, 0x0c, 0x7f, 0xab, 0x8a, - 0x42, 0xf6, 0x77, 0x67, 0x91, 0x59, 0x1d, 0x05, 0x63, 0x41, 0x3f, 0xb3, 0x01, 0x15, 0x55, 0xf5, - 0x91, 0x46, 0xc2, 0xff, 0xcf, 0x32, 0x9c, 0xe8, 0x30, 0x57, 0xd0, 0x97, 0x8d, 0x71, 0x7b, 0xa5, - 0xe7, 0xc9, 0xf6, 0x01, 0x47, 0xee, 0xcb, 0xcc, 0x52, 0x72, 0xc5, 0xec, 0x38, 0x44, 0xf5, 0x37, - 0x63, 0x92, 0xad, 0x9e, 0x82, 0xf2, 0xab, 0xa7, 0xd5, 0x1e, 0xdb, 0xf0, 0xd3, 0x8a, 0x54, 0x4b, - 0x8f, 0xf4, 0x3b, 0xff, 0x8d, 0x3e, 0x98, 0xea, 0x74, 0x7f, 0x1e, 0x7d, 0xcd, 0xca, 0x3c, 0xfb, - 0xf0, 0x6a, 0xef, 0x97, 0xf0, 0xf9, 0x5b, 0x10, 0x22, 0xe7, 0xcc, 0x9c, 0xf9, 0x10, 0x44, 0xee, - 0x88, 0x8b, 0xda, 0xd9, 0xfd, 0xa4, 0x88, 0x3f, 0xe1, 0x21, 0xa5, 0xc2, 0x67, 0x0e, 0xd1, 0x14, - 0xf1, 0x0a, 0x48, 0x9c, 0xb9, 0x9f, 0x24, 0xc1, 0xf9, 0xf7, 0x93, 0x64, 0x1b, 0x66, 0x3c, 0x18, - 0xd6, 0xfa, 0x75, 0xa4, 0xd3, 0xe0, 0x2e, 0xdd, 0xa2, 0xb4, 0x76, 0x1f, 0xe9, 0x54, 0xf8, 0xfb, - 0x16, 0x64, 0x82, 0xb6, 0x94, 0x5b, 0xc6, 0xea, 0xea, 0x96, 0x39, 0x03, 0x7d, 0x51, 0xe8, 0x93, - 0xec, 0x93, 0x04, 0x38, 0xf4, 0x09, 0x66, 0x18, 0xf5, 0x44, 0x6d, 0xb9, 0xdb, 0x13, 0xb5, 0xd4, - 0x4e, 0xf7, 0xc9, 0x36, 0x91, 0x4e, 0x12, 0x25, 0xc6, 0xaf, 0x52, 0x20, 0xe6, 0x38, 0xfb, 0xf7, - 0xca, 0x30, 0xc0, 0x3d, 0x11, 0xc7, 0xb0, 0x4f, 0xd7, 0x84, 0x53, 0xa0, 0xd0, 0x9d, 0x74, 0xde, - 0xaa, 0xb9, 0xaa, 0x93, 0x38, 0x7c, 0x72, 0xa9, 0x3e, 0xa6, 0x8e, 0x04, 0x34, 0x67, 0x8c, 0xc2, - 0x4c, 0xc6, 0xd6, 0x05, 0xce, 0x43, 0x1b, 0x93, 0x4d, 0x80, 0x98, 0x3d, 0x89, 0x48, 0x79, 0x88, - 0xcc, 0x9b, 0x2f, 0x16, 0x6a, 0x47, 0x5d, 0x15, 0xe3, 0xad, 0x49, 0xd3, 0xfd, 0x29, 0x04, 0xd6, - 0x78, 0xcf, 0xbc, 0x0c, 0x15, 0x45, 0x9c, 0x67, 0x04, 0x8c, 0xe8, 0x93, 0xf3, 0xaf, 0xc0, 0x78, - 0xa6, 0xae, 0x9e, 0x6c, 0x88, 0xdf, 0xb2, 0x60, 0x3c, 0xf3, 0x9a, 0x3b, 0xfa, 0xaa, 0x05, 0x53, - 0x7e, 0x07, 0x47, 0x94, 0xf8, 0xcc, 0x87, 0x71, 0x61, 0x29, 0xf3, 0xa1, 0x13, 0x16, 0x77, 0xac, - 0x8d, 0x9a, 0x95, 0xfc, 0x85, 0x57, 0xc7, 0x17, 0x31, 0xb0, 0x23, 0x3c, 0xe7, 0x30, 0x87, 0x61, - 0x85, 0xb5, 0x7f, 0x62, 0xc1, 0x64, 0xdb, 0x83, 0xe1, 0x0f, 0x4b, 0x37, 0x44, 0x76, 0xe5, 0x52, - 0x97, 0xec, 0xca, 0x7a, 0x2f, 0xcb, 0x07, 0xf6, 0xf2, 0xd7, 0x2d, 0x10, 0x33, 0xf4, 0x18, 0x34, - 0xc0, 0x55, 0x53, 0x03, 0xfc, 0x48, 0x91, 0x49, 0xdf, 0x45, 0xf5, 0xfb, 0xa5, 0x12, 0x4c, 0x70, - 0x82, 0xd4, 0xa7, 0xfe, 0xb0, 0x7c, 0x9c, 0xde, 0x5e, 0xfd, 0x50, 0x4f, 0x2d, 0x76, 0xee, 0xa9, - 0xf1, 0x2d, 0xfb, 0x0e, 0xfc, 0x96, 0x7f, 0x6e, 0x01, 0xe2, 0x63, 0x92, 0x7d, 0x1e, 0x97, 0x3b, - 0x77, 0x35, 0x83, 0x2e, 0x95, 0x1c, 0x0a, 0x83, 0x35, 0xaa, 0x07, 0xdc, 0x85, 0xcc, 0x89, 0x46, - 0x39, 0xff, 0x44, 0xa3, 0x87, 0x5e, 0xff, 0x76, 0x19, 0xb2, 0xc1, 0x70, 0xe8, 0x6d, 0x18, 0x69, - 0x38, 0x4d, 0xe7, 0x8e, 0xe7, 0x7b, 0x89, 0x47, 0xe2, 0x62, 0x47, 0xa6, 0x4b, 0x5a, 0x09, 0x71, - 0x90, 0xa0, 0x41, 0xb0, 0xc1, 0x11, 0xcd, 0x01, 0x34, 0x23, 0x6f, 0xdb, 0xf3, 0xc9, 0x06, 0xd3, - 0x59, 0x59, 0x34, 0x3d, 0x3f, 0xfd, 0x93, 0x50, 0xac, 0x51, 0x74, 0x88, 0xbe, 0x2e, 0x1f, 0x47, - 0xf4, 0x75, 0x5f, 0x8f, 0xd1, 0xd7, 0xfd, 0x85, 0xa2, 0xaf, 0x31, 0x9c, 0x92, 0xfe, 0x7f, 0xfa, - 0x7f, 0xc5, 0xf3, 0x09, 0x4f, 0x32, 0x2b, 0xa2, 0xed, 0x67, 0xf6, 0x76, 0x67, 0x4f, 0xe1, 0x8e, - 0x14, 0xb8, 0x4b, 0x49, 0xbb, 0x05, 0x27, 0xea, 0x24, 0xf2, 0x58, 0xee, 0x3f, 0x37, 0x5d, 0x4b, - 0x5f, 0x80, 0x4a, 0x94, 0x59, 0xc6, 0x3d, 0x5e, 0xa9, 0xd6, 0xb2, 0x45, 0xc9, 0x65, 0x9b, 0xb2, - 0xb4, 0xff, 0x56, 0x09, 0x06, 0x45, 0x18, 0xdc, 0x31, 0x28, 0x1f, 0x57, 0x0c, 0x27, 0xc1, 0x33, - 0x79, 0xf2, 0x8f, 0x35, 0xab, 0xab, 0x7b, 0xa0, 0x9e, 0x71, 0x0f, 0x3c, 0x57, 0x8c, 0xdd, 0xc1, - 0x8e, 0x81, 0x7f, 0x5e, 0x86, 0x31, 0x33, 0x2c, 0xf0, 0x18, 0x86, 0xe5, 0x75, 0x18, 0x8c, 0x45, - 0x84, 0x6a, 0xa9, 0x48, 0xd4, 0x55, 0xf6, 0x13, 0xa7, 0x67, 0xa9, 0x22, 0x26, 0x55, 0xb2, 0xeb, - 0x18, 0x04, 0x5b, 0x3e, 0x96, 0x20, 0xd8, 0xbc, 0x68, 0xcd, 0xbe, 0x07, 0x11, 0xad, 0x69, 0xff, - 0x90, 0x89, 0x7c, 0x1d, 0x7e, 0x0c, 0xdb, 0xf8, 0x6b, 0xe6, 0xe6, 0x70, 0xae, 0xd0, 0xbc, 0x13, - 0xcd, 0xeb, 0xb2, 0x9d, 0x7f, 0xcf, 0x82, 0x61, 0x41, 0x78, 0x0c, 0x1d, 0xf8, 0xac, 0xd9, 0x81, - 0xa7, 0x0a, 0x75, 0xa0, 0x4b, 0xcb, 0xbf, 0x59, 0x52, 0x2d, 0xaf, 0x89, 0x27, 0xcd, 0x73, 0x33, - 0x1d, 0x0f, 0x35, 0xa3, 0x30, 0x09, 0x1b, 0xa1, 0x2f, 0x14, 0xb8, 0xc7, 0xd2, 0xcb, 0x55, 0x1c, - 0xbe, 0xaf, 0xfd, 0xc6, 0x8a, 0x9a, 0xdd, 0xfd, 0x09, 0xa3, 0x44, 0x6c, 0xa0, 0x9d, 0x1e, 0x54, - 0x77, 0x01, 0xd2, 0x57, 0xac, 0xc5, 0xbd, 0xc4, 0xde, 0x9f, 0x6a, 0x4f, 0x6f, 0x4b, 0x29, 0x5e, - 0x58, 0xe3, 0x2b, 0xc3, 0xf0, 0x59, 0x1d, 0xfd, 0xe6, 0x19, 0xc0, 0x75, 0x01, 0xc7, 0x8a, 0xc2, - 0x7e, 0x99, 0x49, 0x76, 0x36, 0x40, 0xbd, 0x5d, 0x64, 0xfa, 0xc5, 0x01, 0x35, 0xb4, 0xcc, 0xb1, - 0x77, 0x5d, 0xbf, 0x2e, 0x55, 0x54, 0x7c, 0xd2, 0x26, 0xe8, 0x91, 0xb0, 0xe9, 0xed, 0x2a, 0x44, - 0xda, 0x0e, 0x8e, 0x5e, 0x2e, 0x2c, 0x91, 0x7b, 0x38, 0x2a, 0x62, 0xc9, 0xdd, 0x58, 0x46, 0xab, - 0xd5, 0x5a, 0x36, 0x3f, 0xf5, 0x92, 0x44, 0xe0, 0x94, 0x06, 0xcd, 0x0b, 0x83, 0xd2, 0x7c, 0xf1, - 0x5e, 0x1a, 0x94, 0x72, 0x48, 0x34, 0x8b, 0xf2, 0x3c, 0x0c, 0xab, 0x27, 0x3f, 0x6a, 0xfc, 0xb1, - 0x85, 0x0a, 0xd7, 0xaf, 0x96, 0x53, 0x30, 0xd6, 0x69, 0xd0, 0x2a, 0x9c, 0x70, 0xd5, 0xad, 0x8b, - 0x5a, 0xeb, 0x8e, 0xef, 0x35, 0x68, 0x51, 0x7e, 0x63, 0xf2, 0x91, 0xbd, 0xdd, 0xd9, 0x13, 0xd5, - 0x76, 0x34, 0xee, 0x54, 0x06, 0xad, 0xc1, 0x78, 0xcc, 0x9f, 0x36, 0x91, 0xa1, 0xf5, 0x22, 0x6d, - 0xeb, 0xb3, 0xf2, 0xc4, 0xaa, 0x6e, 0xa2, 0xf7, 0x19, 0x88, 0x4b, 0x05, 0x19, 0x8c, 0x9f, 0x65, - 0x81, 0x5e, 0x85, 0x31, 0x5f, 0x7f, 0xb7, 0xb1, 0x26, 0x2e, 0x9f, 0xa8, 0x18, 0x24, 0xe3, 0x55, - 0xc7, 0x1a, 0xce, 0x50, 0xa3, 0xd7, 0x61, 0x5a, 0x87, 0x88, 0x4c, 0x30, 0x4e, 0xb0, 0x41, 0x62, - 0xf1, 0x0c, 0xc2, 0x63, 0x7b, 0xbb, 0xb3, 0xd3, 0x57, 0xbb, 0xd0, 0xe0, 0xae, 0xa5, 0xd1, 0x45, - 0x18, 0x91, 0x23, 0xa9, 0x5d, 0x44, 0x49, 0xa3, 0xdf, 0x34, 0x1c, 0x36, 0x28, 0x3f, 0xd8, 0xc1, - 0xdc, 0x97, 0x68, 0x61, 0x6d, 0x0b, 0x47, 0xef, 0xc0, 0x88, 0xde, 0xc6, 0xec, 0xde, 0x9c, 0xff, - 0x16, 0xa6, 0x50, 0x05, 0x54, 0xcb, 0x75, 0x1c, 0x36, 0x78, 0xdb, 0x37, 0x60, 0xa0, 0xbe, 0x13, - 0x37, 0x12, 0xbf, 0x80, 0x7c, 0x7b, 0xd2, 0xe8, 0x42, 0xba, 0xf6, 0xd8, 0xbb, 0x3c, 0xa2, 0x47, - 0x36, 0x81, 0xf1, 0xb5, 0xa5, 0x1a, 0x7f, 0xf5, 0x7f, 0x81, 0x5b, 0x6f, 0x58, 0x48, 0x37, 0xeb, - 0x90, 0x52, 0xab, 0x83, 0x3c, 0xb4, 0xff, 0xc4, 0x82, 0x7e, 0xf6, 0xa6, 0x4c, 0xde, 0x7b, 0x44, - 0x45, 0x1a, 0x8d, 0x5e, 0x82, 0x01, 0xb2, 0xbe, 0x4e, 0x1a, 0x89, 0x58, 0xc6, 0x32, 0xda, 0x7b, - 0x60, 0x99, 0x41, 0xe9, 0xe2, 0x64, 0x95, 0xf1, 0xbf, 0x58, 0x10, 0xa3, 0xcf, 0x43, 0x25, 0xf1, - 0xb6, 0xc8, 0x82, 0xeb, 0x12, 0xf7, 0x10, 0x77, 0xc5, 0x95, 0xb0, 0x58, 0x93, 0x4c, 0x70, 0xca, - 0xcf, 0x7e, 0xaf, 0x04, 0x90, 0xde, 0xb5, 0xc8, 0xeb, 0xe6, 0x62, 0xdb, 0xb3, 0x4b, 0x4f, 0x77, - 0x78, 0x76, 0x09, 0xa5, 0x0c, 0x3b, 0x3c, 0xba, 0xa4, 0x86, 0xaa, 0x5c, 0x68, 0xa8, 0xfa, 0x7a, - 0x19, 0xaa, 0x25, 0x98, 0x4c, 0xef, 0x8a, 0x98, 0x97, 0xee, 0x58, 0x12, 0xc6, 0xb5, 0x2c, 0x12, - 0xb7, 0xd3, 0xdb, 0xef, 0x59, 0x20, 0x42, 0xd6, 0x0a, 0xcc, 0x56, 0x57, 0x3e, 0x91, 0x62, 0xe4, - 0xa1, 0x7a, 0xb6, 0x48, 0x34, 0x9f, 0xc8, 0x3e, 0xa5, 0xd6, 0x8f, 0x91, 0x73, 0xca, 0xe0, 0x6a, - 0xff, 0x86, 0x05, 0xc3, 0x1c, 0x7d, 0x8d, 0xe9, 0xd4, 0xf9, 0xed, 0xea, 0x29, 0xc3, 0x27, 0x7b, - 0x3d, 0x84, 0x32, 0x56, 0x99, 0x1e, 0xf5, 0xd7, 0x43, 0x24, 0x02, 0xa7, 0x34, 0xe8, 0x19, 0x18, - 0x8c, 0x5b, 0x77, 0x18, 0x79, 0x26, 0x7e, 0xad, 0xce, 0xc1, 0x58, 0xe2, 0xed, 0x7f, 0x59, 0x82, - 0x89, 0x6c, 0xf8, 0x22, 0xc2, 0x30, 0xc0, 0x75, 0xec, 0xac, 0x7a, 0x76, 0x90, 0x2f, 0x47, 0x0b, - 0x7f, 0x04, 0xfe, 0x06, 0x2e, 0x8b, 0x39, 0x13, 0x9c, 0xd0, 0x3a, 0x0c, 0xbb, 0xe1, 0xbd, 0xe0, - 0x9e, 0x13, 0xb9, 0x0b, 0xb5, 0x55, 0xf1, 0x25, 0x72, 0x02, 0x4e, 0xaa, 0x69, 0x01, 0x3d, 0xb8, - 0x92, 0xf9, 0x16, 0x52, 0x14, 0xd6, 0x19, 0x53, 0x9b, 0xb2, 0x11, 0x06, 0xeb, 0xde, 0xc6, 0x35, - 0xa7, 0x59, 0xec, 0x68, 0x75, 0x49, 0x92, 0x6b, 0x75, 0x8c, 0x8a, 0x5b, 0xf6, 0x1c, 0x81, 0x53, - 0x96, 0xf6, 0x1f, 0x9c, 0x00, 0x63, 0x2e, 0x18, 0x69, 0x38, 0xad, 0x07, 0x9e, 0x86, 0xf3, 0x4d, - 0x18, 0x22, 0x5b, 0xcd, 0x64, 0xa7, 0xea, 0x45, 0xc5, 0x92, 0x2a, 0x2f, 0x0b, 0xea, 0x76, 0xee, - 0x12, 0x83, 0x15, 0xc7, 0x2e, 0x49, 0x55, 0xcb, 0x0f, 0x45, 0x52, 0xd5, 0xbe, 0xbf, 0x90, 0xa4, - 0xaa, 0xaf, 0xc3, 0xe0, 0x86, 0x97, 0x60, 0xd2, 0x0c, 0x45, 0xda, 0x82, 0x9c, 0xc9, 0x73, 0x89, - 0x13, 0xb7, 0x67, 0x4a, 0x14, 0x08, 0x2c, 0xd9, 0xa1, 0x35, 0xb5, 0xa8, 0x06, 0x8a, 0xec, 0xe5, - 0xed, 0xbe, 0xbe, 0x8e, 0xcb, 0x4a, 0x24, 0x51, 0x1d, 0xfc, 0xe0, 0x49, 0x54, 0x55, 0xea, 0xd3, - 0xa1, 0x07, 0x95, 0xfa, 0xd4, 0x48, 0x21, 0x5b, 0x39, 0x8a, 0x14, 0xb2, 0xef, 0x59, 0x70, 0xb2, - 0xd9, 0x29, 0x01, 0xb3, 0x48, 0x62, 0xfa, 0xe9, 0x43, 0xa4, 0xa4, 0x36, 0xaa, 0x66, 0x97, 0xc1, - 0x3b, 0x92, 0xe1, 0xce, 0x15, 0xcb, 0x5c, 0xb4, 0xc3, 0x1f, 0x3c, 0x17, 0xed, 0x51, 0x67, 0x3b, - 0x4d, 0x33, 0xd3, 0x8e, 0x1e, 0x49, 0x66, 0xda, 0xb1, 0x07, 0x98, 0x99, 0x56, 0xcb, 0x29, 0x3b, - 0xfe, 0x60, 0x73, 0xca, 0x6e, 0x9a, 0xfb, 0x12, 0x4f, 0x61, 0xfa, 0x52, 0xe1, 0x7d, 0xc9, 0xa8, - 0xe1, 0xe0, 0x9d, 0x89, 0x67, 0xd7, 0x9d, 0xfc, 0x80, 0xd9, 0x75, 0x8d, 0x1c, 0xb5, 0xe8, 0x28, - 0x72, 0xd4, 0xbe, 0xad, 0xef, 0xa0, 0x27, 0x8a, 0xd4, 0xa0, 0x36, 0xca, 0xf6, 0x1a, 0x3a, 0xed, - 0xa1, 0xed, 0x59, 0x70, 0xa7, 0x8e, 0x3b, 0x0b, 0xee, 0xc9, 0x23, 0xcc, 0x82, 0x7b, 0xea, 0x58, - 0xb3, 0xe0, 0x3e, 0xf2, 0x90, 0x64, 0xc1, 0x9d, 0x3e, 0xca, 0x2c, 0xb8, 0x74, 0x80, 0x9b, 0xf2, - 0xaa, 0xce, 0xf4, 0xa3, 0x45, 0x06, 0xb8, 0xe3, 0xcd, 0x1e, 0x3e, 0xc0, 0x0a, 0x85, 0x53, 0xa6, - 0xf6, 0x5f, 0x83, 0xd3, 0x07, 0x4f, 0xb0, 0xf4, 0xed, 0x89, 0x5a, 0xea, 0xd9, 0xca, 0xbc, 0x3d, - 0xc1, 0x94, 0x37, 0x8d, 0xaa, 0x70, 0x9a, 0xce, 0xef, 0x58, 0xf0, 0x48, 0x97, 0x2c, 0x76, 0x85, - 0xef, 0xb9, 0x35, 0x61, 0xbc, 0x69, 0x16, 0x2d, 0x7c, 0x6d, 0xd6, 0xc8, 0x9a, 0xa7, 0x62, 0x91, - 0x33, 0x08, 0x9c, 0x65, 0xbf, 0xf8, 0x91, 0x1f, 0xbd, 0x7f, 0xfa, 0x43, 0x3f, 0x7e, 0xff, 0xf4, - 0x87, 0xfe, 0xe8, 0xfd, 0xd3, 0x1f, 0xfa, 0xb9, 0xbd, 0xd3, 0xd6, 0x8f, 0xf6, 0x4e, 0x5b, 0x3f, - 0xde, 0x3b, 0x6d, 0xfd, 0xe9, 0xde, 0x69, 0xeb, 0xbd, 0x9f, 0x9c, 0xfe, 0xd0, 0x1b, 0xa5, 0xed, - 0xf3, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xa2, 0x84, 0xda, 0xcc, 0xc5, 0x00, 0x00, + // 11000 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, + 0x75, 0x18, 0xae, 0xd9, 0xc5, 0xd7, 0x3e, 0x7c, 0x37, 0x70, 0x47, 0x10, 0x22, 0x0f, 0xc7, 0xa1, + 0x48, 0x1d, 0xc9, 0x23, 0x20, 0x1e, 0x49, 0xf1, 0x24, 0xea, 0x47, 0x09, 0xc0, 0x02, 0x77, 0xd0, + 0x7d, 0x2d, 0x7b, 0x71, 0x77, 0x14, 0xc5, 0x9f, 0xc8, 0xb9, 0x9d, 0x06, 0x30, 0xbc, 0xc1, 0xcc, + 0x72, 0x66, 0x16, 0x77, 0x90, 0xa2, 0x2a, 0x5b, 0x51, 0xc9, 0x49, 0x59, 0x49, 0xe4, 0x72, 0x54, + 0x95, 0x72, 0x52, 0xa5, 0x94, 0xab, 0xe2, 0x28, 0x9f, 0x8e, 0xa2, 0xb2, 0x24, 0x97, 0xe5, 0xa4, + 0xe2, 0x58, 0x8e, 0x5c, 0x95, 0x38, 0xaa, 0x72, 0x25, 0x76, 0xca, 0x15, 0xd8, 0x82, 0x2a, 0xfe, + 0x23, 0x7f, 0xe4, 0x8f, 0xf8, 0x3f, 0x24, 0x95, 0x4a, 0xf5, 0xe7, 0x74, 0xcf, 0xee, 0x62, 0x66, + 0xc1, 0x03, 0x7c, 0x52, 0xe5, 0xbf, 0xdd, 0x7e, 0xaf, 0x5f, 0x7f, 0x4c, 0xf7, 0xeb, 0xf7, 0x5e, + 0xbf, 0xf7, 0x1a, 0xce, 0xdf, 0xbd, 0x18, 0xcf, 0x7b, 0xe1, 0xc2, 0xdd, 0xd6, 0x1d, 0x12, 0x05, + 0x24, 0x21, 0xf1, 0x42, 0xf3, 0xee, 0xe6, 0x82, 0xd3, 0xf4, 0x16, 0x76, 0x5e, 0x58, 0xd8, 0x24, + 0x01, 0x89, 0x9c, 0x84, 0xb8, 0xf3, 0xcd, 0x28, 0x4c, 0x42, 0xf4, 0x18, 0xc7, 0x9e, 0x4f, 0xb1, + 0xe7, 0x9b, 0x77, 0x37, 0xe7, 0x9d, 0xa6, 0x37, 0xbf, 0xf3, 0xc2, 0xec, 0xf3, 0x9b, 0x5e, 0xb2, + 0xd5, 0xba, 0x33, 0xdf, 0x08, 0xb7, 0x17, 0x36, 0xc3, 0xcd, 0x70, 0x81, 0x55, 0xba, 0xd3, 0xda, + 0x60, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0x13, 0x9b, 0x7d, 0x49, 0x34, 0xed, 0x34, 0xbd, 0x6d, 0xa7, + 0xb1, 0xe5, 0x05, 0x24, 0xda, 0x55, 0x8d, 0x47, 0x24, 0x0e, 0x5b, 0x51, 0x83, 0x64, 0xbb, 0x70, + 0x68, 0xad, 0x78, 0x61, 0x9b, 0x24, 0x4e, 0x87, 0x8e, 0xcf, 0x2e, 0x74, 0xab, 0x15, 0xb5, 0x82, + 0xc4, 0xdb, 0x6e, 0x6f, 0xe6, 0xa3, 0x79, 0x15, 0xe2, 0xc6, 0x16, 0xd9, 0x76, 0xda, 0xea, 0xbd, + 0xd8, 0xad, 0x5e, 0x2b, 0xf1, 0xfc, 0x05, 0x2f, 0x48, 0xe2, 0x24, 0x3a, 0x6c, 0x4c, 0x31, 0x89, + 0x76, 0x48, 0x94, 0x0e, 0x88, 0xdc, 0x77, 0xb6, 0x9b, 0x3e, 0xe9, 0x30, 0x26, 0xfb, 0x8f, 0x2c, + 0x38, 0xbb, 0x78, 0xbb, 0xbe, 0xe2, 0x3b, 0x71, 0xe2, 0x35, 0x96, 0xfc, 0xb0, 0x71, 0xb7, 0x9e, + 0x84, 0x11, 0xb9, 0x15, 0xfa, 0xad, 0x6d, 0x52, 0x67, 0xd3, 0x87, 0xce, 0xc3, 0xd0, 0x0e, 0xfb, + 0xbf, 0x56, 0x9d, 0xb1, 0xce, 0x5a, 0xe7, 0x2a, 0x4b, 0x13, 0x3f, 0xdc, 0x9b, 0xfb, 0xc0, 0xfe, + 0xde, 0xdc, 0xd0, 0x2d, 0x51, 0x8e, 0x15, 0x06, 0x7a, 0x1a, 0x06, 0x36, 0xe2, 0xf5, 0xdd, 0x26, + 0x99, 0x29, 0x31, 0xdc, 0x31, 0x81, 0x3b, 0xb0, 0x5a, 0xa7, 0xa5, 0x58, 0x40, 0xd1, 0x02, 0x54, + 0x9a, 0x4e, 0x94, 0x78, 0x89, 0x17, 0x06, 0x33, 0xe5, 0xb3, 0xd6, 0xb9, 0xfe, 0xa5, 0x49, 0x81, + 0x5a, 0xa9, 0x49, 0x00, 0x4e, 0x71, 0x68, 0x37, 0x22, 0xe2, 0xb8, 0x37, 0x02, 0x7f, 0x77, 0xa6, + 0xef, 0xac, 0x75, 0x6e, 0x28, 0xed, 0x06, 0x16, 0xe5, 0x58, 0x61, 0xd8, 0xdf, 0x2b, 0xc1, 0xd0, + 0xe2, 0xc6, 0x86, 0x17, 0x78, 0xc9, 0x2e, 0x7a, 0x07, 0x46, 0x82, 0xd0, 0x25, 0xf2, 0x3f, 0x1b, + 0xc5, 0xf0, 0x85, 0x67, 0xe7, 0x0f, 0x5b, 0x8a, 0xf3, 0xd7, 0xb5, 0x1a, 0x4b, 0x13, 0xfb, 0x7b, + 0x73, 0x23, 0x7a, 0x09, 0x36, 0x28, 0xa2, 0xb7, 0x60, 0xb8, 0x19, 0xba, 0xaa, 0x81, 0x12, 0x6b, + 0xe0, 0x99, 0xc3, 0x1b, 0xa8, 0xa5, 0x15, 0x96, 0xc6, 0xf7, 0xf7, 0xe6, 0x86, 0xb5, 0x02, 0xac, + 0x93, 0x43, 0x3e, 0x8c, 0xd3, 0xbf, 0x41, 0xe2, 0xa9, 0x16, 0xca, 0xac, 0x85, 0xe7, 0xf3, 0x5b, + 0xd0, 0x2a, 0x2d, 0x4d, 0xed, 0xef, 0xcd, 0x8d, 0x67, 0x0a, 0x71, 0x96, 0xb4, 0xfd, 0x79, 0x18, + 0x5b, 0x4c, 0x12, 0xa7, 0xb1, 0x45, 0x5c, 0xfe, 0x7d, 0xd1, 0x4b, 0xd0, 0x17, 0x38, 0xdb, 0x44, + 0x7c, 0xfd, 0xb3, 0x62, 0xda, 0xfb, 0xae, 0x3b, 0xdb, 0xe4, 0x60, 0x6f, 0x6e, 0xe2, 0x66, 0xe0, + 0xbd, 0xd7, 0x12, 0x6b, 0x86, 0x96, 0x61, 0x86, 0x8d, 0x2e, 0x00, 0xb8, 0x64, 0xc7, 0x6b, 0x90, + 0x9a, 0x93, 0x6c, 0x89, 0xd5, 0x80, 0x44, 0x5d, 0xa8, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x2f, 0x59, + 0x50, 0x59, 0xdc, 0x09, 0x3d, 0xb7, 0x16, 0xba, 0x31, 0x6a, 0xc1, 0x78, 0x33, 0x22, 0x1b, 0x24, + 0x52, 0x45, 0x33, 0xd6, 0xd9, 0xf2, 0xb9, 0xe1, 0x0b, 0x17, 0x72, 0xc6, 0x6d, 0x56, 0x5a, 0x09, + 0x92, 0x68, 0x77, 0xe9, 0x11, 0xd1, 0xf4, 0x78, 0x06, 0x8a, 0xb3, 0x6d, 0xd8, 0xbf, 0x54, 0x82, + 0x53, 0x8b, 0x9f, 0x6f, 0x45, 0xa4, 0xea, 0xc5, 0x77, 0xb3, 0x5b, 0xc1, 0xf5, 0xe2, 0xbb, 0xd7, + 0xd3, 0xc9, 0x50, 0x6b, 0xb0, 0x2a, 0xca, 0xb1, 0xc2, 0x40, 0xcf, 0xc3, 0x20, 0xfd, 0x7d, 0x13, + 0xaf, 0x89, 0xd1, 0x4f, 0x09, 0xe4, 0xe1, 0xaa, 0x93, 0x38, 0x55, 0x0e, 0xc2, 0x12, 0x07, 0x5d, + 0x83, 0xe1, 0x06, 0xdb, 0xef, 0x9b, 0xd7, 0x42, 0x97, 0xb0, 0x2f, 0x5c, 0x59, 0x7a, 0x8e, 0xa2, + 0x2f, 0xa7, 0xc5, 0x07, 0x7b, 0x73, 0x33, 0xbc, 0x6f, 0x82, 0x84, 0x06, 0xc3, 0x7a, 0x7d, 0x64, + 0xab, 0x8d, 0xd8, 0xc7, 0x28, 0x41, 0x87, 0x4d, 0x78, 0x4e, 0xdb, 0x53, 0xfd, 0x6c, 0x4f, 0x8d, + 0x74, 0xd9, 0x4f, 0xff, 0xd8, 0x12, 0x73, 0xb2, 0xea, 0xf9, 0x26, 0x7b, 0xb8, 0x00, 0x10, 0x93, + 0x46, 0x44, 0x12, 0x6d, 0x56, 0xd4, 0x67, 0xae, 0x2b, 0x08, 0xd6, 0xb0, 0xe8, 0xe6, 0x8f, 0xb7, + 0x9c, 0x88, 0xad, 0x16, 0x31, 0x37, 0x6a, 0xf3, 0xd7, 0x25, 0x00, 0xa7, 0x38, 0xc6, 0xe6, 0x2f, + 0xe7, 0x6e, 0xfe, 0xdf, 0xb1, 0x60, 0x70, 0xc9, 0x0b, 0x5c, 0x2f, 0xd8, 0x44, 0xef, 0xc0, 0x10, + 0xe5, 0xe8, 0xae, 0x93, 0x38, 0x62, 0xdf, 0x7f, 0x44, 0x2e, 0x1e, 0x9d, 0xc1, 0xca, 0xe5, 0x13, + 0xcf, 0x53, 0x6c, 0xba, 0x88, 0x6e, 0xdc, 0x79, 0x97, 0x34, 0x92, 0x6b, 0x24, 0x71, 0xd2, 0xe1, + 0xa4, 0x65, 0x58, 0x51, 0x45, 0x37, 0x61, 0x20, 0x71, 0xa2, 0x4d, 0x92, 0x88, 0x6d, 0x9f, 0xb3, + 0x29, 0x39, 0x0d, 0x4c, 0x97, 0x1c, 0x09, 0x1a, 0x24, 0x65, 0x90, 0xeb, 0x8c, 0x08, 0x16, 0xc4, + 0xec, 0x06, 0x8c, 0x2c, 0x3b, 0x4d, 0xe7, 0x8e, 0xe7, 0x7b, 0x89, 0x47, 0x62, 0xf4, 0x61, 0x28, + 0x3b, 0xae, 0xcb, 0x36, 0x40, 0x65, 0xe9, 0xd4, 0xfe, 0xde, 0x5c, 0x79, 0xd1, 0x75, 0x0f, 0xf6, + 0xe6, 0x40, 0x61, 0xed, 0x62, 0x8a, 0x81, 0x9e, 0x85, 0x3e, 0x37, 0x0a, 0x9b, 0x33, 0x25, 0x86, + 0x79, 0x9a, 0xee, 0xd4, 0x6a, 0x14, 0x36, 0x33, 0xa8, 0x0c, 0xc7, 0xfe, 0x41, 0x09, 0xd0, 0x32, + 0x69, 0x6e, 0xad, 0xd6, 0x8d, 0x6f, 0x7a, 0x0e, 0x86, 0xb6, 0xc3, 0xc0, 0x4b, 0xc2, 0x28, 0x16, + 0x0d, 0xb2, 0x75, 0x71, 0x4d, 0x94, 0x61, 0x05, 0x45, 0x67, 0xa1, 0xaf, 0x99, 0x6e, 0xef, 0x11, + 0xc9, 0x1a, 0xd8, 0xc6, 0x66, 0x10, 0x8a, 0xd1, 0x8a, 0x49, 0x24, 0xd6, 0xb3, 0xc2, 0xb8, 0x19, + 0x93, 0x08, 0x33, 0x48, 0xba, 0x82, 0xe8, 0xda, 0x12, 0xab, 0x35, 0xb3, 0x82, 0x28, 0x04, 0x6b, + 0x58, 0xe8, 0x6d, 0xa8, 0xf0, 0x7f, 0x98, 0x6c, 0xb0, 0xa5, 0x9b, 0xcb, 0x14, 0xae, 0x86, 0x0d, + 0xc7, 0xcf, 0x4e, 0xfe, 0x28, 0x5b, 0x71, 0x92, 0x10, 0x4e, 0x69, 0x1a, 0x2b, 0x6e, 0x20, 0x77, + 0xc5, 0xfd, 0x1d, 0x0b, 0xd0, 0xb2, 0x17, 0xb8, 0x24, 0x3a, 0x81, 0xa3, 0xb3, 0xb7, 0xcd, 0xf0, + 0x27, 0xb4, 0x6b, 0xe1, 0x76, 0x33, 0x0c, 0x48, 0x90, 0x2c, 0x87, 0x81, 0xcb, 0x8f, 0xd3, 0x8f, + 0x43, 0x5f, 0x42, 0x9b, 0xe2, 0xdd, 0x7a, 0x5a, 0x7e, 0x16, 0xda, 0xc0, 0xc1, 0xde, 0xdc, 0xe9, + 0xf6, 0x1a, 0xac, 0x0b, 0xac, 0x0e, 0xfa, 0x18, 0x0c, 0xc4, 0x89, 0x93, 0xb4, 0x62, 0xd1, 0xd1, + 0x27, 0x64, 0x47, 0xeb, 0xac, 0xf4, 0x60, 0x6f, 0x6e, 0x5c, 0x55, 0xe3, 0x45, 0x58, 0x54, 0x40, + 0xcf, 0xc0, 0xe0, 0x36, 0x89, 0x63, 0x67, 0x53, 0x32, 0xb8, 0x71, 0x51, 0x77, 0xf0, 0x1a, 0x2f, + 0xc6, 0x12, 0x8e, 0x9e, 0x84, 0x7e, 0x12, 0x45, 0x61, 0x24, 0x56, 0xc4, 0xa8, 0x40, 0xec, 0x5f, + 0xa1, 0x85, 0x98, 0xc3, 0xec, 0xff, 0x62, 0xc1, 0xb8, 0xea, 0x2b, 0x6f, 0xeb, 0x04, 0xb6, 0xbc, + 0x0b, 0xd0, 0x90, 0x03, 0x8c, 0xd9, 0x46, 0xd3, 0xda, 0xe8, 0xbc, 0xfc, 0xda, 0x27, 0x34, 0x6d, + 0x43, 0x15, 0xc5, 0x58, 0xa3, 0x6b, 0xff, 0x3b, 0x0b, 0xa6, 0x32, 0x63, 0xbb, 0xea, 0xc5, 0x09, + 0x7a, 0xab, 0x6d, 0x7c, 0xf3, 0xc5, 0xc6, 0x47, 0x6b, 0xb3, 0xd1, 0xa9, 0xf5, 0x22, 0x4b, 0xb4, + 0xb1, 0x61, 0xe8, 0xf7, 0x12, 0xb2, 0x2d, 0x87, 0xf5, 0x7c, 0xc1, 0x61, 0xf1, 0xfe, 0xa5, 0x5f, + 0x69, 0x8d, 0xd2, 0xc0, 0x9c, 0x94, 0xfd, 0xbf, 0x2c, 0xa8, 0x2c, 0x87, 0xc1, 0x86, 0xb7, 0x79, + 0xcd, 0x69, 0x9e, 0xc0, 0xf7, 0xa9, 0x43, 0x1f, 0xa3, 0xce, 0x87, 0xf0, 0x42, 0xde, 0x10, 0x44, + 0xc7, 0xe6, 0xe9, 0x99, 0xca, 0x85, 0x05, 0xc5, 0xa6, 0x68, 0x11, 0x66, 0xc4, 0x66, 0x5f, 0x81, + 0x8a, 0x42, 0x40, 0x13, 0x50, 0xbe, 0x4b, 0xb8, 0x24, 0x59, 0xc1, 0xf4, 0x27, 0x9a, 0x86, 0xfe, + 0x1d, 0xc7, 0x6f, 0x89, 0xcd, 0x8b, 0xf9, 0x9f, 0x8f, 0x97, 0x2e, 0x5a, 0xf6, 0x0f, 0xd8, 0x0e, + 0x14, 0x8d, 0xac, 0x04, 0x3b, 0x82, 0x39, 0x7c, 0xd9, 0x82, 0x69, 0xbf, 0x03, 0x53, 0x12, 0x73, + 0x72, 0x14, 0x76, 0xf6, 0x98, 0xe8, 0xf6, 0x74, 0x27, 0x28, 0xee, 0xd8, 0x1a, 0xe5, 0xf5, 0x61, + 0x93, 0x2e, 0x38, 0xc7, 0x67, 0x5d, 0x17, 0x32, 0xc0, 0x0d, 0x51, 0x86, 0x15, 0xd4, 0xfe, 0x73, + 0x0b, 0xa6, 0xd5, 0x38, 0xae, 0x90, 0xdd, 0x3a, 0xf1, 0x49, 0x23, 0x09, 0xa3, 0x87, 0x65, 0x24, + 0x8f, 0xf3, 0x6f, 0xc2, 0x79, 0xd2, 0xb0, 0x20, 0x50, 0xbe, 0x42, 0x76, 0xf9, 0x07, 0xd2, 0x07, + 0x5a, 0x3e, 0x74, 0xa0, 0xbf, 0x65, 0xc1, 0xa8, 0x1a, 0xe8, 0x09, 0x6c, 0xb9, 0xab, 0xe6, 0x96, + 0xfb, 0x70, 0xc1, 0xf5, 0xda, 0x65, 0xb3, 0xfd, 0xed, 0x12, 0x65, 0x1b, 0x02, 0xa7, 0x16, 0x85, + 0x74, 0x92, 0x28, 0xc7, 0x7f, 0x48, 0xbe, 0x52, 0x6f, 0x83, 0xbd, 0x42, 0x76, 0xd7, 0x43, 0x2a, + 0x4d, 0x74, 0x1e, 0xac, 0xf1, 0x51, 0xfb, 0x0e, 0xfd, 0xa8, 0xbf, 0x5f, 0x82, 0x53, 0x6a, 0x5a, + 0x8c, 0x53, 0xfa, 0x67, 0x72, 0x62, 0x5e, 0x80, 0x61, 0x97, 0x6c, 0x38, 0x2d, 0x3f, 0x51, 0xda, + 0x44, 0x3f, 0x57, 0x33, 0xab, 0x69, 0x31, 0xd6, 0x71, 0x7a, 0x98, 0xcb, 0x6f, 0x0c, 0x33, 0x7e, + 0x9e, 0x38, 0x74, 0xd5, 0x53, 0x09, 0x4f, 0x53, 0x0f, 0x47, 0x74, 0xf5, 0x50, 0xa8, 0x82, 0x4f, + 0x42, 0xbf, 0xb7, 0x4d, 0xcf, 0xfc, 0x92, 0x79, 0x94, 0xaf, 0xd1, 0x42, 0xcc, 0x61, 0xe8, 0x29, + 0x18, 0x6c, 0x84, 0xdb, 0xdb, 0x4e, 0xe0, 0xce, 0x94, 0x99, 0xcc, 0x39, 0x4c, 0xc5, 0x82, 0x65, + 0x5e, 0x84, 0x25, 0x0c, 0x3d, 0x06, 0x7d, 0x4e, 0xb4, 0x19, 0xcf, 0xf4, 0x31, 0x9c, 0x21, 0xda, + 0xd2, 0x62, 0xb4, 0x19, 0x63, 0x56, 0x4a, 0x65, 0xc9, 0x7b, 0x61, 0x74, 0xd7, 0x0b, 0x36, 0xab, + 0x5e, 0xc4, 0x04, 0x43, 0x4d, 0x96, 0xbc, 0xad, 0x20, 0x58, 0xc3, 0x42, 0x35, 0xe8, 0x6f, 0x86, + 0x51, 0x12, 0xcf, 0x0c, 0xb0, 0x89, 0x7f, 0x2e, 0x77, 0xfb, 0xf1, 0x71, 0xd7, 0xc2, 0x28, 0x49, + 0x87, 0x42, 0xff, 0xc5, 0x98, 0x13, 0x42, 0xcb, 0x50, 0x26, 0xc1, 0xce, 0xcc, 0x20, 0xa3, 0xf7, + 0xa1, 0xc3, 0xe9, 0xad, 0x04, 0x3b, 0xb7, 0x9c, 0x28, 0xe5, 0x57, 0x2b, 0xc1, 0x0e, 0xa6, 0xb5, + 0x51, 0x03, 0x2a, 0xd2, 0x84, 0x15, 0xcf, 0x0c, 0x15, 0x59, 0x8a, 0x58, 0xa0, 0x63, 0xf2, 0x5e, + 0xcb, 0x8b, 0xc8, 0x36, 0x09, 0x92, 0x38, 0x55, 0xac, 0x24, 0x34, 0xc6, 0x29, 0x5d, 0xd4, 0x80, + 0x11, 0x2e, 0x7f, 0x5e, 0x0b, 0x5b, 0x41, 0x12, 0xcf, 0x54, 0x58, 0x97, 0x73, 0x2c, 0x17, 0xb7, + 0xd2, 0x1a, 0x4b, 0xd3, 0x82, 0xfc, 0x88, 0x56, 0x18, 0x63, 0x83, 0x28, 0x7a, 0x0b, 0x46, 0x7d, + 0x6f, 0x87, 0x04, 0x24, 0x8e, 0x6b, 0x51, 0x78, 0x87, 0xcc, 0x00, 0x1b, 0xcd, 0x93, 0x79, 0x5a, + 0x7c, 0x78, 0x87, 0x2c, 0x4d, 0xee, 0xef, 0xcd, 0x8d, 0x5e, 0xd5, 0x6b, 0x63, 0x93, 0x18, 0x7a, + 0x1b, 0xc6, 0xa8, 0xb0, 0xeb, 0xa5, 0xe4, 0x87, 0x8b, 0x93, 0x47, 0xfb, 0x7b, 0x73, 0x63, 0xd8, + 0xa8, 0x8e, 0x33, 0xe4, 0xd0, 0x3a, 0x54, 0x7c, 0x6f, 0x83, 0x34, 0x76, 0x1b, 0x3e, 0x99, 0x19, + 0x61, 0xb4, 0x73, 0x36, 0xe7, 0x55, 0x89, 0xce, 0x15, 0x0c, 0xf5, 0x17, 0xa7, 0x84, 0xd0, 0x2d, + 0x38, 0x9d, 0x90, 0x68, 0xdb, 0x0b, 0x1c, 0xba, 0xa9, 0x84, 0xf4, 0xcb, 0x4c, 0x25, 0xa3, 0x6c, + 0xd5, 0x9e, 0x11, 0x13, 0x7b, 0x7a, 0xbd, 0x23, 0x16, 0xee, 0x52, 0x1b, 0xdd, 0x80, 0x71, 0xb6, + 0x9f, 0x6a, 0x2d, 0xdf, 0xaf, 0x85, 0xbe, 0xd7, 0xd8, 0x9d, 0x19, 0x63, 0x04, 0x9f, 0x92, 0x06, + 0x90, 0x35, 0x13, 0x4c, 0x15, 0xc3, 0xf4, 0x1f, 0xce, 0xd6, 0x46, 0x3e, 0x8c, 0xc7, 0xa4, 0xd1, + 0x8a, 0xbc, 0x64, 0x97, 0xae, 0x7d, 0x72, 0x3f, 0x99, 0x19, 0x2f, 0xa2, 0xe8, 0xd6, 0xcd, 0x4a, + 0xdc, 0xfa, 0x94, 0x29, 0xc4, 0x59, 0xd2, 0x94, 0x55, 0xc4, 0x89, 0xeb, 0x05, 0x33, 0x13, 0x8c, + 0x03, 0xa9, 0xfd, 0x55, 0xa7, 0x85, 0x98, 0xc3, 0x98, 0xfd, 0x80, 0xfe, 0xb8, 0x41, 0xb9, 0xf4, + 0x24, 0x43, 0x4c, 0xed, 0x07, 0x12, 0x80, 0x53, 0x1c, 0x2a, 0x1a, 0x24, 0xc9, 0xee, 0x0c, 0x62, + 0xa8, 0x6a, 0xab, 0xad, 0xaf, 0x7f, 0x06, 0xd3, 0x72, 0x74, 0x0b, 0x06, 0x49, 0xb0, 0xb3, 0x1a, + 0x85, 0xdb, 0x33, 0x53, 0x45, 0x78, 0xc0, 0x0a, 0x47, 0xe6, 0xe7, 0x47, 0xaa, 0xc2, 0x88, 0x62, + 0x2c, 0x89, 0xa1, 0xfb, 0x30, 0xd3, 0xe1, 0x2b, 0xf1, 0x8f, 0x32, 0xcd, 0x3e, 0xca, 0x27, 0x44, + 0xdd, 0x99, 0xf5, 0x2e, 0x78, 0x07, 0x87, 0xc0, 0x70, 0x57, 0xea, 0xf6, 0x1d, 0x18, 0x53, 0x8c, + 0x8a, 0x7d, 0x6f, 0x34, 0x07, 0xfd, 0x94, 0x17, 0x4b, 0x85, 0xbe, 0x42, 0x27, 0x95, 0xb2, 0xe8, + 0x18, 0xf3, 0x72, 0x36, 0xa9, 0xde, 0xe7, 0xc9, 0xd2, 0x6e, 0x42, 0xb8, 0x62, 0x57, 0xd6, 0x26, + 0x55, 0x02, 0x70, 0x8a, 0x63, 0xff, 0x1f, 0x2e, 0x26, 0xa5, 0xdc, 0xb0, 0xc0, 0x49, 0x70, 0x1e, + 0x86, 0xb6, 0xc2, 0x38, 0xa1, 0xd8, 0xac, 0x8d, 0xfe, 0x54, 0x30, 0xba, 0x2c, 0xca, 0xb1, 0xc2, + 0x40, 0xaf, 0xc2, 0x68, 0x43, 0x6f, 0x40, 0x1c, 0x63, 0xa7, 0x44, 0x15, 0xb3, 0x75, 0x6c, 0xe2, + 0xa2, 0x8b, 0x30, 0xc4, 0xac, 0xdc, 0x8d, 0xd0, 0x17, 0x2a, 0xa4, 0x3c, 0x95, 0x87, 0x6a, 0xa2, + 0xfc, 0x40, 0xfb, 0x8d, 0x15, 0x36, 0x55, 0xc4, 0x69, 0x17, 0xd6, 0x6a, 0xe2, 0x00, 0x51, 0x8a, + 0xf8, 0x65, 0x56, 0x8a, 0x05, 0xd4, 0xfe, 0x17, 0x25, 0x6d, 0x96, 0xa9, 0x02, 0x44, 0xd0, 0x9b, + 0x30, 0x78, 0xcf, 0xf1, 0x12, 0x2f, 0xd8, 0x14, 0xd2, 0xc3, 0x8b, 0x05, 0x4f, 0x13, 0x56, 0xfd, + 0x36, 0xaf, 0xca, 0x4f, 0x3e, 0xf1, 0x07, 0x4b, 0x82, 0x94, 0x76, 0xd4, 0x0a, 0x02, 0x4a, 0xbb, + 0xd4, 0x3b, 0x6d, 0xcc, 0xab, 0x72, 0xda, 0xe2, 0x0f, 0x96, 0x04, 0xd1, 0x06, 0x80, 0x5c, 0x4b, + 0xc4, 0x15, 0xd6, 0xe5, 0x8f, 0xf6, 0x42, 0x7e, 0x5d, 0xd5, 0x5e, 0x1a, 0xa3, 0x67, 0x6d, 0xfa, + 0x1f, 0x6b, 0x94, 0xed, 0x84, 0x09, 0x61, 0xed, 0xdd, 0x42, 0x9f, 0xa5, 0x5b, 0xda, 0x89, 0x12, + 0xe2, 0x2e, 0x26, 0x59, 0x03, 0xfd, 0xe1, 0x22, 0xf6, 0xba, 0xb7, 0x4d, 0xf4, 0xed, 0x2f, 0x88, + 0xe0, 0x94, 0x9e, 0xfd, 0xdd, 0x32, 0xcc, 0x74, 0xeb, 0x2e, 0x5d, 0x92, 0xe4, 0xbe, 0x97, 0x2c, + 0x53, 0x31, 0xc9, 0x32, 0x97, 0xe4, 0x8a, 0x28, 0xc7, 0x0a, 0x83, 0xae, 0x8d, 0xd8, 0xdb, 0x94, + 0xca, 0x52, 0x7f, 0xba, 0x36, 0xea, 0xac, 0x14, 0x0b, 0x28, 0xc5, 0x8b, 0x88, 0x13, 0x8b, 0xcb, + 0x0d, 0x6d, 0x0d, 0x61, 0x56, 0x8a, 0x05, 0x54, 0x37, 0x88, 0xf4, 0xe5, 0x18, 0x44, 0x8c, 0x29, + 0xea, 0x7f, 0xb0, 0x53, 0x84, 0x3e, 0x07, 0xb0, 0xe1, 0x05, 0x5e, 0xbc, 0xc5, 0xa8, 0x0f, 0xf4, + 0x4c, 0x5d, 0x09, 0x59, 0xab, 0x8a, 0x0a, 0xd6, 0x28, 0xa2, 0x97, 0x61, 0x58, 0x6d, 0xcf, 0xb5, + 0xea, 0xcc, 0xa0, 0x69, 0x10, 0x4f, 0x79, 0x55, 0x15, 0xeb, 0x78, 0xf6, 0xbb, 0xd9, 0xf5, 0x22, + 0x76, 0x85, 0x36, 0xbf, 0x56, 0xd1, 0xf9, 0x2d, 0x1d, 0x3e, 0xbf, 0xf6, 0x7f, 0x2e, 0xc3, 0xb8, + 0xd1, 0x58, 0x2b, 0x2e, 0xc0, 0xd1, 0x5e, 0xa7, 0x07, 0x96, 0x93, 0x10, 0xb1, 0x27, 0xcf, 0xf7, + 0xb2, 0x69, 0xf4, 0xe3, 0x8d, 0xee, 0x05, 0x4e, 0x09, 0x6d, 0x41, 0xc5, 0x77, 0x62, 0x66, 0x52, + 0x21, 0x62, 0x2f, 0xf6, 0x46, 0x36, 0x55, 0x3f, 0x9c, 0x38, 0xd1, 0x4e, 0x0f, 0xde, 0x4a, 0x4a, + 0x9c, 0x9e, 0xb6, 0x54, 0xd8, 0x91, 0x37, 0x6a, 0xaa, 0x3b, 0x54, 0x22, 0xda, 0xc5, 0x1c, 0x86, + 0x2e, 0xc2, 0x48, 0x44, 0xd8, 0x4a, 0x59, 0xa6, 0xf2, 0x1c, 0x5b, 0x7a, 0xfd, 0xa9, 0xe0, 0x87, + 0x35, 0x18, 0x36, 0x30, 0x53, 0xb9, 0x7f, 0xe0, 0x10, 0xb9, 0xff, 0x19, 0x18, 0x64, 0x3f, 0xd4, + 0xaa, 0x50, 0x5f, 0x68, 0x8d, 0x17, 0x63, 0x09, 0xcf, 0x2e, 0xa2, 0xa1, 0x82, 0x8b, 0xe8, 0x59, + 0x18, 0xab, 0x3a, 0x64, 0x3b, 0x0c, 0x56, 0x02, 0xb7, 0x19, 0x7a, 0x41, 0x82, 0x66, 0xa0, 0x8f, + 0x9d, 0x27, 0x7c, 0xbf, 0xf7, 0x51, 0x0a, 0xb8, 0x8f, 0xca, 0xee, 0xf6, 0x9f, 0x94, 0x60, 0xb4, + 0x4a, 0x7c, 0x92, 0x10, 0xae, 0xf7, 0xc4, 0x68, 0x15, 0xd0, 0x66, 0xe4, 0x34, 0x48, 0x8d, 0x44, + 0x5e, 0xe8, 0xd6, 0x49, 0x23, 0x0c, 0xd8, 0x45, 0x14, 0x3d, 0x20, 0x4f, 0xef, 0xef, 0xcd, 0xa1, + 0x4b, 0x6d, 0x50, 0xdc, 0xa1, 0x06, 0x72, 0x61, 0xb4, 0x19, 0x11, 0xc3, 0x6e, 0x68, 0xe5, 0x8b, + 0x1a, 0x35, 0xbd, 0x0a, 0x97, 0x86, 0x8d, 0x22, 0x6c, 0x12, 0x45, 0x9f, 0x82, 0x89, 0x30, 0x6a, + 0x6e, 0x39, 0x41, 0x95, 0x34, 0x49, 0xe0, 0x52, 0x15, 0x40, 0x58, 0x3b, 0xa6, 0xf7, 0xf7, 0xe6, + 0x26, 0x6e, 0x64, 0x60, 0xb8, 0x0d, 0x1b, 0xbd, 0x09, 0x93, 0xcd, 0x28, 0x6c, 0x3a, 0x9b, 0x6c, + 0xc9, 0x08, 0x69, 0x85, 0xf3, 0xa6, 0xf3, 0xfb, 0x7b, 0x73, 0x93, 0xb5, 0x2c, 0xf0, 0x60, 0x6f, + 0x6e, 0x8a, 0x4d, 0x19, 0x2d, 0x49, 0x81, 0xb8, 0x9d, 0x8c, 0xfd, 0x1e, 0x9c, 0xaa, 0x86, 0xf7, + 0x82, 0x7b, 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0x34, 0xe3, 0xc4, 0x1b, 0x52, 0xf9, 0xe5, 0x17, 0x7c, + 0x39, 0x27, 0x9b, 0x46, 0x83, 0xab, 0x1d, 0xab, 0x9e, 0x4f, 0xba, 0x98, 0x43, 0xfe, 0x49, 0xc9, + 0x68, 0x33, 0xc5, 0x57, 0x77, 0x17, 0x56, 0xd7, 0xbb, 0x8b, 0xcf, 0xc2, 0xd0, 0x86, 0x47, 0x7c, + 0x17, 0x93, 0x0d, 0xf1, 0xb5, 0x5e, 0x28, 0x72, 0xb9, 0xb3, 0x4a, 0xeb, 0x48, 0xeb, 0x18, 0x57, + 0xa2, 0x57, 0x05, 0x19, 0xac, 0x08, 0xa2, 0x16, 0x4c, 0x48, 0x3d, 0x4c, 0x42, 0xc5, 0x66, 0x7f, + 0xb1, 0x98, 0x9a, 0x67, 0x36, 0xc3, 0x3e, 0x2f, 0xce, 0x10, 0xc4, 0x6d, 0x4d, 0x50, 0xfd, 0x79, + 0x9b, 0x1e, 0x75, 0x7d, 0x6c, 0xe9, 0x33, 0xfd, 0x99, 0x99, 0x02, 0x58, 0xa9, 0xfd, 0x6b, 0x16, + 0x3c, 0xd2, 0x36, 0x5b, 0xc2, 0x4e, 0x72, 0x6c, 0xdf, 0x28, 0x6b, 0xac, 0x28, 0xe5, 0x1b, 0x2b, + 0xec, 0x1b, 0x30, 0xbd, 0xb2, 0xdd, 0x4c, 0x76, 0xab, 0x9e, 0x79, 0xe5, 0xf2, 0x0a, 0x0c, 0x6c, + 0x13, 0xd7, 0x6b, 0x6d, 0x8b, 0xcf, 0x3a, 0x27, 0xcf, 0x85, 0x6b, 0xac, 0xf4, 0x60, 0x6f, 0x6e, + 0xb4, 0x9e, 0x84, 0x91, 0xb3, 0x49, 0x78, 0x01, 0x16, 0xe8, 0xf6, 0x8f, 0x2d, 0x18, 0x97, 0xfc, + 0x61, 0xd1, 0x75, 0x23, 0x12, 0xc7, 0x68, 0x16, 0x4a, 0x5e, 0x53, 0x10, 0x02, 0x41, 0xa8, 0xb4, + 0x56, 0xc3, 0x25, 0xaf, 0x89, 0xde, 0x84, 0x0a, 0xbf, 0xa9, 0x4b, 0x17, 0x47, 0x8f, 0x37, 0x7f, + 0x4c, 0x37, 0x5c, 0x97, 0x34, 0x70, 0x4a, 0x4e, 0x4a, 0xc9, 0xec, 0xe4, 0x29, 0x9b, 0xf7, 0x46, + 0x97, 0x45, 0x39, 0x56, 0x18, 0xe8, 0x1c, 0x0c, 0x05, 0xa1, 0xcb, 0x2f, 0x53, 0xf9, 0x3e, 0x65, + 0x4b, 0xee, 0xba, 0x28, 0xc3, 0x0a, 0x6a, 0x7f, 0xd5, 0x82, 0x11, 0x39, 0xc6, 0x82, 0x02, 0x3b, + 0xdd, 0x24, 0xa9, 0xb0, 0x9e, 0x6e, 0x12, 0x2a, 0x70, 0x33, 0x88, 0x21, 0x67, 0x97, 0x7b, 0x91, + 0xb3, 0xed, 0xdf, 0x2c, 0xc1, 0x98, 0xec, 0x4e, 0xbd, 0x75, 0x27, 0x26, 0x54, 0x0c, 0xa9, 0x38, + 0x7c, 0xf2, 0x89, 0x5c, 0x67, 0xcf, 0xe7, 0xe9, 0x62, 0xc6, 0x37, 0x4b, 0xc5, 0x9c, 0x45, 0x49, + 0x07, 0xa7, 0x24, 0xd1, 0x0e, 0x4c, 0x06, 0x61, 0xc2, 0x8e, 0x37, 0x05, 0x2f, 0x76, 0xd3, 0x91, + 0x6d, 0xe7, 0x51, 0xd1, 0xce, 0xe4, 0xf5, 0x2c, 0x3d, 0xdc, 0xde, 0x04, 0xba, 0x21, 0x6d, 0x4c, + 0x65, 0xd6, 0xd6, 0xb3, 0xc5, 0xda, 0xea, 0x6e, 0x62, 0xb2, 0x7f, 0xcf, 0x82, 0x8a, 0x44, 0x3b, + 0x89, 0x2b, 0xaf, 0xdb, 0x30, 0x18, 0xb3, 0x4f, 0x24, 0xa7, 0xeb, 0x7c, 0xb1, 0x21, 0xf0, 0xef, + 0x9a, 0x9e, 0xe9, 0xfc, 0x7f, 0x8c, 0x25, 0x35, 0x66, 0x6c, 0x57, 0x03, 0x79, 0xe8, 0x8c, 0xed, + 0xaa, 0x67, 0xdd, 0x6f, 0xb6, 0x46, 0x0d, 0x6b, 0x00, 0x15, 0x4c, 0x9b, 0x11, 0xd9, 0xf0, 0xee, + 0x67, 0x05, 0xd3, 0x1a, 0x2b, 0xc5, 0x02, 0x8a, 0x36, 0x60, 0xa4, 0x21, 0xcd, 0xd1, 0x29, 0x0b, + 0xf9, 0x48, 0x41, 0xdb, 0xbf, 0xba, 0x46, 0xe2, 0xae, 0x49, 0xcb, 0x1a, 0x25, 0x6c, 0xd0, 0xa5, + 0x7c, 0x2a, 0xbd, 0x29, 0x2f, 0x17, 0x34, 0xdc, 0x44, 0x24, 0x49, 0x5b, 0xe8, 0x7a, 0x49, 0x6e, + 0x7f, 0xd3, 0x82, 0x01, 0x6e, 0xbf, 0x2c, 0x66, 0x04, 0xd6, 0x2e, 0xc8, 0xd2, 0xf9, 0xbc, 0x45, + 0x0b, 0xc5, 0x7d, 0x19, 0xba, 0x0d, 0x15, 0xf6, 0x83, 0xd9, 0x62, 0xca, 0x45, 0xfc, 0xb4, 0x78, + 0xfb, 0x7a, 0x57, 0x6f, 0x49, 0x02, 0x38, 0xa5, 0x65, 0x7f, 0xbf, 0x4c, 0x59, 0x5f, 0x8a, 0x6a, + 0x9c, 0xed, 0xd6, 0x49, 0x9c, 0xed, 0xa5, 0xe3, 0x3f, 0xdb, 0xdf, 0x83, 0xf1, 0x86, 0x76, 0x41, + 0x97, 0x7e, 0xf1, 0x0b, 0x05, 0x97, 0x95, 0x76, 0xab, 0xc7, 0xed, 0x75, 0xcb, 0x26, 0x39, 0x9c, + 0xa5, 0x8f, 0x08, 0x8c, 0xf0, 0xf5, 0x20, 0xda, 0xeb, 0x63, 0xed, 0x2d, 0x14, 0x59, 0x61, 0x7a, + 0x63, 0x6c, 0x15, 0xd7, 0x35, 0x42, 0xd8, 0x20, 0x6b, 0xff, 0x4a, 0x3f, 0xf4, 0xaf, 0xec, 0x90, + 0x20, 0x39, 0x01, 0x56, 0xb7, 0x0d, 0x63, 0x5e, 0xb0, 0x13, 0xfa, 0x3b, 0xc4, 0xe5, 0xf0, 0xa3, + 0x1d, 0xef, 0xa7, 0x45, 0x23, 0x63, 0x6b, 0x06, 0x31, 0x9c, 0x21, 0x7e, 0x1c, 0x96, 0x82, 0xd7, + 0x61, 0x80, 0xaf, 0x0c, 0x61, 0x26, 0xc8, 0xb1, 0xe7, 0xb3, 0x89, 0x15, 0x3b, 0x28, 0xb5, 0x67, + 0xf0, 0xab, 0x04, 0x41, 0x08, 0xbd, 0x0b, 0x63, 0x1b, 0x5e, 0x14, 0x27, 0x54, 0xd9, 0x8f, 0x13, + 0x67, 0xbb, 0x79, 0x04, 0x1b, 0x81, 0x9a, 0x91, 0x55, 0x83, 0x12, 0xce, 0x50, 0x46, 0x9b, 0x30, + 0x4a, 0x55, 0xd4, 0xb4, 0xa9, 0xc1, 0x9e, 0x9b, 0x52, 0x26, 0xc2, 0xab, 0x3a, 0x21, 0x6c, 0xd2, + 0xa5, 0x2c, 0xa9, 0xc1, 0x54, 0xda, 0x21, 0x26, 0xdd, 0x28, 0x96, 0xc4, 0x75, 0x59, 0x0e, 0xa3, + 0x9c, 0x8d, 0x79, 0xca, 0x54, 0x4c, 0xce, 0x96, 0xfa, 0xc3, 0xd8, 0xdf, 0xa6, 0x67, 0x31, 0x9d, + 0xc3, 0x13, 0x38, 0xbe, 0x2e, 0x9b, 0xc7, 0xd7, 0x93, 0x05, 0xbe, 0x6c, 0x97, 0xa3, 0xeb, 0x1d, + 0x18, 0xd6, 0x3e, 0x3c, 0x5a, 0x80, 0x4a, 0x43, 0x3a, 0x73, 0x08, 0x2e, 0xae, 0x44, 0x29, 0xe5, + 0xe5, 0x81, 0x53, 0x1c, 0x3a, 0x2f, 0x54, 0x04, 0xcd, 0xba, 0x7e, 0x51, 0x01, 0x15, 0x33, 0x88, + 0xfd, 0x22, 0xc0, 0xca, 0x7d, 0xd2, 0x58, 0xe4, 0x2a, 0x9e, 0x76, 0xbf, 0x67, 0x75, 0xbf, 0xdf, + 0xb3, 0xbf, 0x65, 0xc1, 0xd8, 0xea, 0xb2, 0x21, 0xd3, 0xcf, 0x03, 0x70, 0xd9, 0xf8, 0xf6, 0xed, + 0xeb, 0xd2, 0x7e, 0xcd, 0x8d, 0x8c, 0xaa, 0x14, 0x6b, 0x18, 0xe8, 0x51, 0x28, 0xfb, 0xad, 0x40, + 0x88, 0xac, 0x83, 0xfb, 0x7b, 0x73, 0xe5, 0xab, 0xad, 0x00, 0xd3, 0x32, 0xcd, 0xc7, 0xaa, 0x5c, + 0xd8, 0xc7, 0x2a, 0xdf, 0xdb, 0xf8, 0xeb, 0x65, 0x98, 0x58, 0xf5, 0xc9, 0x7d, 0xa3, 0xd7, 0x4f, + 0xc3, 0x80, 0x1b, 0x79, 0x3b, 0x24, 0xca, 0x0a, 0x02, 0x55, 0x56, 0x8a, 0x05, 0xb4, 0xb0, 0xdb, + 0xd7, 0xdb, 0xed, 0x07, 0xf9, 0xf1, 0xb9, 0xbc, 0xe5, 0x8e, 0x19, 0x6d, 0xc0, 0x20, 0xbf, 0x0f, + 0x8e, 0x67, 0xfa, 0xd9, 0x52, 0x7c, 0xf5, 0xf0, 0xce, 0x64, 0xe7, 0x67, 0x5e, 0xd8, 0x57, 0xb8, + 0xc3, 0x8d, 0xe2, 0x65, 0xa2, 0x14, 0x4b, 0xe2, 0xb3, 0x1f, 0x87, 0x11, 0x1d, 0xb3, 0x27, 0xcf, + 0x9b, 0xbf, 0x6a, 0xc1, 0xd4, 0xaa, 0x1f, 0x36, 0xee, 0x66, 0xfc, 0xf2, 0x5e, 0x86, 0x61, 0xba, + 0x99, 0x62, 0xc3, 0x69, 0xd5, 0xf0, 0xce, 0x15, 0x20, 0xac, 0xe3, 0x69, 0xd5, 0x6e, 0xde, 0x5c, + 0xab, 0x76, 0x72, 0xea, 0x15, 0x20, 0xac, 0xe3, 0xd9, 0x7f, 0x60, 0xc1, 0xe3, 0x97, 0x96, 0x57, + 0x6a, 0x24, 0x8a, 0xbd, 0x38, 0x21, 0x41, 0xd2, 0xe6, 0x57, 0x4c, 0x65, 0x46, 0x57, 0xeb, 0x4a, + 0x2a, 0x33, 0x56, 0x59, 0x2f, 0x04, 0xf4, 0x61, 0x71, 0xae, 0xff, 0xa6, 0x05, 0x53, 0x97, 0xbc, + 0x04, 0x93, 0x66, 0x98, 0x75, 0x05, 0x8e, 0x48, 0x33, 0x8c, 0xbd, 0x24, 0x8c, 0x76, 0xb3, 0xae, + 0xc0, 0x58, 0x41, 0xb0, 0x86, 0xc5, 0x5b, 0xde, 0xf1, 0x62, 0xda, 0xd3, 0x92, 0xa9, 0xea, 0x62, + 0x51, 0x8e, 0x15, 0x06, 0x1d, 0x98, 0xeb, 0x45, 0x4c, 0x64, 0xd8, 0x15, 0x3b, 0x58, 0x0d, 0xac, + 0x2a, 0x01, 0x38, 0xc5, 0xb1, 0xff, 0x9e, 0x05, 0xa7, 0x2e, 0xf9, 0xad, 0x38, 0x21, 0xd1, 0x46, + 0x6c, 0x74, 0xf6, 0x45, 0xa8, 0x10, 0x29, 0xdc, 0x8b, 0xbe, 0xaa, 0x43, 0x43, 0x49, 0xfd, 0xdc, + 0x0f, 0x59, 0xe1, 0x15, 0x70, 0x77, 0xed, 0xcd, 0x39, 0xf3, 0xb7, 0x4b, 0x30, 0x7a, 0x79, 0x7d, + 0xbd, 0x76, 0x89, 0x24, 0x82, 0x4b, 0xe6, 0x1b, 0xa5, 0xb0, 0xa6, 0x91, 0x1f, 0x26, 0xfc, 0xb4, + 0x12, 0xcf, 0x9f, 0xe7, 0xe1, 0x22, 0xf3, 0x6b, 0x41, 0x72, 0x23, 0xaa, 0x27, 0x91, 0x17, 0x6c, + 0x76, 0xd4, 0xe1, 0x25, 0x2f, 0x2f, 0x77, 0xe3, 0xe5, 0xe8, 0x45, 0x18, 0x60, 0xf1, 0x2a, 0x52, + 0xf8, 0xf8, 0xa0, 0x92, 0x13, 0x58, 0xe9, 0xc1, 0xde, 0x5c, 0xe5, 0x26, 0x5e, 0xe3, 0x7f, 0xb0, + 0x40, 0x45, 0x6f, 0xc3, 0xf0, 0x56, 0x92, 0x34, 0x2f, 0x13, 0xc7, 0x25, 0x91, 0xe4, 0x13, 0xe7, + 0x0e, 0xe7, 0x13, 0x74, 0x3a, 0x78, 0x85, 0x74, 0x6b, 0xa5, 0x65, 0x31, 0xd6, 0x29, 0xda, 0x75, + 0x80, 0x14, 0xf6, 0x80, 0x74, 0x10, 0xfb, 0xe7, 0x4b, 0x30, 0x78, 0xd9, 0x09, 0x5c, 0x9f, 0x44, + 0x68, 0x15, 0xfa, 0xc8, 0x7d, 0xd2, 0x10, 0x07, 0x79, 0x4e, 0xd7, 0xd3, 0xc3, 0x8e, 0xdb, 0xd5, + 0xe8, 0x7f, 0xcc, 0xea, 0x23, 0x0c, 0x83, 0xb4, 0xdf, 0x97, 0x94, 0x97, 0xf8, 0x73, 0xf9, 0xb3, + 0xa0, 0x16, 0x05, 0x3f, 0x29, 0x45, 0x11, 0x96, 0x84, 0x98, 0x05, 0xaa, 0xd1, 0xac, 0x53, 0xf6, + 0x96, 0x14, 0xd3, 0xec, 0xd6, 0x97, 0x6b, 0x1c, 0x5d, 0xd0, 0xe5, 0x16, 0x28, 0x59, 0x88, 0x53, + 0x72, 0xf6, 0x45, 0x98, 0x66, 0xf7, 0xb1, 0x4e, 0xb2, 0x65, 0xec, 0x9a, 0xdc, 0xe5, 0x69, 0xff, + 0xb0, 0x04, 0x93, 0x6b, 0xf5, 0xe5, 0xba, 0x69, 0x3b, 0xbc, 0x08, 0x23, 0xfc, 0x80, 0xa6, 0x8b, + 0xce, 0xf1, 0x45, 0x7d, 0x75, 0x87, 0xb0, 0xae, 0xc1, 0xb0, 0x81, 0x89, 0x1e, 0x87, 0xb2, 0xf7, + 0x5e, 0x90, 0xf5, 0xea, 0x5b, 0x7b, 0xfd, 0x3a, 0xa6, 0xe5, 0x14, 0x4c, 0xcf, 0x7a, 0xce, 0xe4, + 0x14, 0x58, 0x9d, 0xf7, 0xaf, 0xc1, 0x98, 0x17, 0x37, 0x62, 0x6f, 0x2d, 0xa0, 0x1c, 0xc0, 0x69, + 0xc8, 0xe5, 0x9b, 0x0a, 0xe7, 0xb4, 0xab, 0x0a, 0x8a, 0x33, 0xd8, 0x1a, 0xc7, 0xed, 0x2f, 0x2c, + 0x2f, 0xe4, 0xba, 0x8b, 0x53, 0x51, 0xa8, 0xc9, 0x46, 0x17, 0x33, 0x1f, 0x21, 0x21, 0x0a, 0xf1, + 0x01, 0xc7, 0x58, 0xc2, 0xec, 0x77, 0xa1, 0xa2, 0xdc, 0xbc, 0xa4, 0x77, 0xa3, 0xd5, 0xc5, 0xbb, + 0x31, 0x9f, 0x33, 0x49, 0xc3, 0x6f, 0xb9, 0xa3, 0xe1, 0xf7, 0x9f, 0x59, 0x90, 0xfa, 0xa9, 0x20, + 0x0c, 0x95, 0x66, 0xc8, 0x2e, 0x89, 0x22, 0x79, 0x1b, 0xfb, 0x54, 0xce, 0x82, 0xe5, 0x1b, 0x86, + 0x2f, 0xa9, 0x9a, 0xac, 0x8b, 0x53, 0x32, 0xe8, 0x2a, 0x0c, 0x36, 0x23, 0x52, 0x4f, 0x58, 0x68, + 0x42, 0x0f, 0x14, 0xf9, 0xdc, 0xf0, 0x9a, 0x58, 0x92, 0xb0, 0xff, 0x95, 0x05, 0x70, 0xd5, 0xdb, + 0xf6, 0x12, 0xec, 0x04, 0x9b, 0xe4, 0x04, 0xb4, 0xc2, 0xeb, 0xd0, 0x17, 0x37, 0x49, 0xa3, 0xd8, + 0x35, 0x5f, 0xda, 0xb3, 0x7a, 0x93, 0x34, 0xd2, 0xcf, 0x41, 0xff, 0x61, 0x46, 0xc7, 0xfe, 0x1e, + 0xc0, 0x58, 0x8a, 0x46, 0x25, 0x73, 0xf4, 0xbc, 0xe1, 0x93, 0xff, 0x68, 0xc6, 0x27, 0xbf, 0xc2, + 0xb0, 0x35, 0x37, 0xfc, 0x04, 0xca, 0xdb, 0xce, 0x7d, 0xa1, 0x08, 0xbc, 0x5c, 0xb4, 0x43, 0xb4, + 0xa5, 0xf9, 0x6b, 0xce, 0x7d, 0x2e, 0x77, 0x3d, 0x27, 0x17, 0xd2, 0x35, 0xe7, 0xfe, 0x01, 0xbf, + 0xcc, 0x63, 0x1b, 0x96, 0x6a, 0x1e, 0x5f, 0xfa, 0xd3, 0xf4, 0x3f, 0xe3, 0xa1, 0xb4, 0x39, 0xd6, + 0xaa, 0x17, 0x08, 0x3b, 0x66, 0x8f, 0xad, 0x7a, 0x41, 0xb6, 0x55, 0x2f, 0x28, 0xd0, 0xaa, 0xc7, + 0x9c, 0x57, 0x07, 0x85, 0xf9, 0x9f, 0x79, 0xfe, 0x0d, 0x5f, 0xf8, 0x58, 0x4f, 0x4d, 0x8b, 0x7b, + 0x04, 0xde, 0xfc, 0x82, 0x14, 0x36, 0x45, 0x69, 0x6e, 0x17, 0x64, 0xd3, 0xe8, 0xef, 0x5b, 0x30, + 0x26, 0x7e, 0x63, 0xf2, 0x5e, 0x8b, 0xc4, 0x89, 0x38, 0xd4, 0x3e, 0x75, 0x94, 0xde, 0x08, 0x12, + 0xbc, 0x53, 0x1f, 0x95, 0x1c, 0xc9, 0x04, 0xe6, 0xf6, 0x2d, 0xd3, 0x1f, 0xf4, 0x3d, 0x0b, 0xa6, + 0xb7, 0x9d, 0xfb, 0xbc, 0x45, 0x5e, 0x86, 0x9d, 0xc4, 0x0b, 0x85, 0x77, 0xe3, 0x6a, 0xaf, 0xeb, + 0xa4, 0x8d, 0x10, 0xef, 0xae, 0x74, 0x5c, 0x9a, 0xee, 0x84, 0x92, 0xdb, 0xe9, 0x8e, 0x3d, 0x9c, + 0xdd, 0x80, 0x21, 0xb9, 0x30, 0x3b, 0x88, 0xf9, 0x55, 0xfd, 0xec, 0xce, 0x51, 0xaa, 0xe7, 0xa5, + 0x69, 0x6c, 0xfe, 0xf5, 0x96, 0x13, 0x24, 0x5e, 0xb2, 0xab, 0xa9, 0x05, 0xac, 0x1d, 0xb1, 0x14, + 0x8f, 0xb5, 0x9d, 0x77, 0x61, 0x44, 0x5f, 0x77, 0xc7, 0xda, 0xd6, 0x7b, 0x30, 0xd5, 0x61, 0x55, + 0x1d, 0x6b, 0x93, 0xf7, 0xe0, 0xd1, 0xae, 0xeb, 0xe3, 0x38, 0x1b, 0xb6, 0x7f, 0xdb, 0xd2, 0x59, + 0xe7, 0x09, 0x18, 0x5d, 0xae, 0x99, 0x46, 0x97, 0x73, 0x45, 0xf7, 0x50, 0x17, 0xcb, 0xcb, 0x86, + 0xde, 0x7d, 0x7a, 0x24, 0xa0, 0x75, 0x18, 0xf0, 0x69, 0x89, 0xbc, 0xf3, 0x3a, 0xdf, 0xcb, 0x2e, + 0x4d, 0x85, 0x12, 0x56, 0x1e, 0x63, 0x41, 0xcb, 0xfe, 0x9e, 0x05, 0x7d, 0x7f, 0x89, 0x11, 0x43, + 0x6d, 0xa4, 0x45, 0xe0, 0xfb, 0x3c, 0x76, 0xee, 0xad, 0xdc, 0x4f, 0x48, 0x10, 0x33, 0x19, 0xb4, + 0xdb, 0xad, 0xfd, 0x30, 0x6d, 0x4a, 0x3a, 0x61, 0xbc, 0x0a, 0xa3, 0xbe, 0x73, 0x87, 0xf8, 0xd2, + 0x60, 0x9c, 0xd5, 0xd8, 0xae, 0xea, 0x40, 0x6c, 0xe2, 0xd2, 0xca, 0x1b, 0xba, 0x3d, 0x5d, 0x08, + 0x49, 0xaa, 0xb2, 0x61, 0x6c, 0xc7, 0x26, 0x2e, 0x55, 0x19, 0xee, 0x39, 0x49, 0x63, 0x4b, 0x68, + 0x73, 0xaa, 0xbb, 0xb7, 0x69, 0x21, 0xe6, 0x30, 0xb4, 0x08, 0xe3, 0x72, 0xc5, 0xde, 0xa2, 0x6a, + 0x7e, 0x18, 0x08, 0x39, 0x53, 0x45, 0x1d, 0x63, 0x13, 0x8c, 0xb3, 0xf8, 0xe8, 0xe3, 0x30, 0x46, + 0x27, 0x27, 0x6c, 0x25, 0xd2, 0xc5, 0xa4, 0x9f, 0xb9, 0x98, 0x30, 0x0f, 0xe5, 0x75, 0x03, 0x82, + 0x33, 0x98, 0xf6, 0xdb, 0x30, 0x75, 0x35, 0x74, 0xdc, 0x25, 0xc7, 0x77, 0x82, 0x06, 0x89, 0xd6, + 0x82, 0xcd, 0xdc, 0xeb, 0x6b, 0xfd, 0x8a, 0xb9, 0x94, 0x77, 0xc5, 0x6c, 0x47, 0x80, 0xf4, 0x06, + 0x84, 0x73, 0xd4, 0x5b, 0x30, 0xe8, 0xf1, 0xa6, 0xc4, 0xb2, 0x7d, 0x21, 0xcf, 0x1e, 0xd5, 0xd6, + 0x47, 0xcd, 0xd9, 0x87, 0x17, 0x60, 0x49, 0x92, 0xaa, 0x20, 0x9d, 0x0c, 0x58, 0xf9, 0x5a, 0x9e, + 0xfd, 0xd7, 0x2d, 0x18, 0xbf, 0x9e, 0x09, 0x69, 0x7d, 0x1a, 0x06, 0x78, 0x62, 0x84, 0xac, 0x89, + 0xa5, 0xce, 0x4a, 0xb1, 0x80, 0x3e, 0x70, 0x0d, 0xff, 0x97, 0x4b, 0x50, 0x61, 0x6e, 0xb6, 0x4d, + 0xaa, 0x4e, 0x1c, 0xbf, 0x98, 0x7a, 0xcd, 0x10, 0x53, 0x73, 0xb4, 0x4c, 0xd5, 0xb1, 0x6e, 0x52, + 0x2a, 0xba, 0xa9, 0x42, 0x3d, 0x0b, 0x29, 0x98, 0x29, 0x41, 0x1e, 0x0e, 0x38, 0x66, 0x46, 0x86, + 0xca, 0x30, 0x50, 0x76, 0xe9, 0xab, 0x70, 0x1f, 0xba, 0x4b, 0x5f, 0xd5, 0xb3, 0x2e, 0xcc, 0xa9, + 0xa6, 0x75, 0x9e, 0xb1, 0xef, 0x4f, 0x32, 0xe7, 0x49, 0xc7, 0xf7, 0x3e, 0x4f, 0x54, 0xc4, 0xf4, + 0x9c, 0x70, 0x86, 0x14, 0xa5, 0x07, 0x8c, 0xcf, 0x88, 0x7f, 0x3c, 0x20, 0x3e, 0xad, 0x62, 0x5f, + 0x86, 0xf1, 0xcc, 0xd4, 0xa1, 0x97, 0xa1, 0xbf, 0xb9, 0xe5, 0xc4, 0x24, 0xe3, 0xc7, 0xd2, 0x5f, + 0xa3, 0x85, 0x07, 0x7b, 0x73, 0x63, 0xaa, 0x02, 0x2b, 0xc1, 0x1c, 0xdb, 0xfe, 0x72, 0x09, 0xfa, + 0xae, 0x87, 0xee, 0x49, 0x2c, 0xb5, 0xcb, 0xc6, 0x52, 0x7b, 0x3a, 0x3f, 0x9d, 0x46, 0xd7, 0x55, + 0x56, 0xcb, 0xac, 0xb2, 0x73, 0x05, 0x68, 0x1d, 0xbe, 0xc0, 0xb6, 0x61, 0x98, 0xa5, 0xeb, 0x10, + 0x8e, 0x3c, 0x2f, 0x1a, 0x9a, 0xd5, 0x5c, 0x46, 0xb3, 0x1a, 0xd7, 0x50, 0x35, 0xfd, 0xea, 0x19, + 0x18, 0x14, 0x8e, 0x23, 0x59, 0xd7, 0x51, 0x81, 0x8b, 0x25, 0xdc, 0xfe, 0x97, 0x65, 0x30, 0xd2, + 0x83, 0xa0, 0xdf, 0xb3, 0x60, 0x3e, 0xe2, 0x61, 0x38, 0x6e, 0xb5, 0x15, 0x79, 0xc1, 0x66, 0xbd, + 0xb1, 0x45, 0xdc, 0x96, 0xef, 0x05, 0x9b, 0x6b, 0x9b, 0x41, 0xa8, 0x8a, 0x57, 0xee, 0x93, 0x46, + 0x8b, 0xd9, 0x69, 0x0b, 0x67, 0x25, 0x51, 0x97, 0xa6, 0x17, 0xf6, 0xf7, 0xe6, 0xe6, 0x71, 0x4f, + 0xad, 0xe0, 0x1e, 0x7b, 0x85, 0xfe, 0xd8, 0x82, 0x05, 0x9e, 0x20, 0xa3, 0xf8, 0x48, 0x0a, 0x69, + 0xa4, 0x35, 0x49, 0x34, 0x25, 0xb7, 0x4e, 0xa2, 0xed, 0xa5, 0x57, 0xc4, 0x24, 0x2f, 0xd4, 0x7a, + 0x6b, 0x15, 0xf7, 0xda, 0x4d, 0xfb, 0xdf, 0x94, 0x61, 0x94, 0xce, 0x67, 0x1a, 0x14, 0xff, 0xb2, + 0xb1, 0x4c, 0x9e, 0xc8, 0x2c, 0x93, 0x49, 0x03, 0xf9, 0xc1, 0xc4, 0xc3, 0xc7, 0x30, 0xe9, 0x3b, + 0x71, 0x72, 0x99, 0x38, 0x51, 0x72, 0x87, 0x38, 0xec, 0x6e, 0x32, 0xeb, 0xf7, 0x50, 0xe0, 0xba, + 0x53, 0x39, 0x23, 0x5d, 0xcd, 0x12, 0xc3, 0xed, 0xf4, 0xd1, 0x0e, 0x20, 0x76, 0x0f, 0x1a, 0x39, + 0x41, 0xcc, 0xc7, 0xe2, 0x09, 0xbb, 0x6e, 0x6f, 0xad, 0xce, 0x8a, 0x56, 0xd1, 0xd5, 0x36, 0x6a, + 0xb8, 0x43, 0x0b, 0xda, 0x4d, 0x77, 0x7f, 0xd1, 0x9b, 0xee, 0x81, 0x1c, 0x9f, 0xed, 0xaf, 0x58, + 0x30, 0x45, 0x3f, 0x8b, 0xe9, 0xdf, 0x1b, 0xa3, 0x10, 0xc6, 0xe9, 0xb2, 0xf3, 0x49, 0x22, 0xcb, + 0xc4, 0xfe, 0xca, 0x91, 0xac, 0x4d, 0x3a, 0xa9, 0xf8, 0x76, 0xc5, 0x24, 0x86, 0xb3, 0xd4, 0xed, + 0x6f, 0x59, 0xc0, 0x3c, 0xee, 0x4e, 0xe0, 0x30, 0xbb, 0x64, 0x1e, 0x66, 0x76, 0x3e, 0xc7, 0xe8, + 0x72, 0x8e, 0xbd, 0x04, 0x13, 0x14, 0x5a, 0x8b, 0xc2, 0xfb, 0xbb, 0x52, 0xd0, 0xce, 0x37, 0xf0, + 0x7e, 0xa5, 0xc4, 0xb7, 0x8d, 0x8a, 0x27, 0x44, 0xbf, 0x60, 0xc1, 0x50, 0xc3, 0x69, 0x3a, 0x0d, + 0x9e, 0x5c, 0xa9, 0x80, 0x75, 0xc6, 0xa8, 0x3f, 0xbf, 0x2c, 0xea, 0x72, 0xcb, 0xc2, 0x47, 0xe4, + 0xd0, 0x65, 0x71, 0xae, 0x35, 0x41, 0x35, 0x3e, 0x7b, 0x17, 0x46, 0x0d, 0x62, 0xc7, 0xaa, 0x86, + 0xfe, 0x82, 0xc5, 0x99, 0xbe, 0x52, 0x15, 0xee, 0xc1, 0x64, 0xa0, 0xfd, 0xa7, 0xec, 0x4c, 0x4a, + 0xc6, 0xf3, 0xc5, 0xd9, 0x3a, 0xe3, 0x82, 0x9a, 0x77, 0x61, 0x86, 0x20, 0x6e, 0x6f, 0xc3, 0xfe, + 0x55, 0x0b, 0x1e, 0xd1, 0x11, 0xb5, 0x00, 0xd0, 0x3c, 0xbb, 0x71, 0x15, 0x86, 0xc2, 0x26, 0x89, + 0x9c, 0x54, 0x2d, 0x3a, 0x27, 0xe7, 0xff, 0x86, 0x28, 0x3f, 0xd8, 0x9b, 0x9b, 0xd6, 0xa9, 0xcb, + 0x72, 0xac, 0x6a, 0x22, 0x1b, 0x06, 0xd8, 0xbc, 0xc4, 0x22, 0x74, 0x97, 0x25, 0x1b, 0x62, 0x97, + 0x2a, 0x31, 0x16, 0x10, 0xfb, 0x6f, 0x59, 0x7c, 0xb9, 0xe9, 0x5d, 0x47, 0x5f, 0x80, 0x89, 0x6d, + 0xaa, 0x41, 0xad, 0xdc, 0x6f, 0xd2, 0x83, 0x94, 0x5d, 0x27, 0x5b, 0x45, 0x8e, 0x8f, 0x2e, 0xc3, + 0x5d, 0x9a, 0x11, 0xbd, 0x9f, 0xb8, 0x96, 0x21, 0x8b, 0xdb, 0x1a, 0xb2, 0xff, 0x61, 0x89, 0xef, + 0x59, 0x26, 0xc3, 0x3d, 0x03, 0x83, 0xcd, 0xd0, 0x5d, 0x5e, 0xab, 0x62, 0x31, 0x57, 0x8a, 0xe9, + 0xd4, 0x78, 0x31, 0x96, 0x70, 0x74, 0x01, 0x80, 0xdc, 0x4f, 0x48, 0x14, 0x38, 0xbe, 0xba, 0x06, + 0x56, 0xa2, 0xd2, 0x8a, 0x82, 0x60, 0x0d, 0x8b, 0xd6, 0x69, 0x46, 0xe1, 0x8e, 0xe7, 0xb2, 0xc8, + 0x85, 0xb2, 0x59, 0xa7, 0xa6, 0x20, 0x58, 0xc3, 0xa2, 0x7a, 0x6b, 0x2b, 0x88, 0xf9, 0x31, 0xe6, + 0xdc, 0x11, 0xb9, 0x71, 0x86, 0x52, 0xbd, 0xf5, 0xa6, 0x0e, 0xc4, 0x26, 0x2e, 0xba, 0x02, 0x03, + 0x89, 0xc3, 0x2e, 0x37, 0xfb, 0x8b, 0x78, 0x8a, 0xac, 0x53, 0x5c, 0x3d, 0x19, 0x11, 0xad, 0x8a, + 0x05, 0x09, 0xfb, 0x3f, 0x55, 0x00, 0x52, 0xa9, 0x0b, 0x7d, 0xb9, 0x7d, 0xc3, 0x7f, 0xb4, 0xa8, + 0xc8, 0xf6, 0xe0, 0x76, 0x3b, 0xfa, 0x9a, 0x05, 0xc3, 0x8e, 0xef, 0x87, 0x0d, 0x27, 0x61, 0xd3, + 0x53, 0x2a, 0xca, 0x7a, 0x44, 0x4f, 0x16, 0xd3, 0xba, 0xbc, 0x33, 0x2f, 0xca, 0x0b, 0x47, 0x0d, + 0x92, 0xdb, 0x1f, 0xbd, 0x0b, 0xe8, 0x23, 0x52, 0x6a, 0xe7, 0x5f, 0x78, 0x36, 0x2b, 0xb5, 0x57, + 0x18, 0xc3, 0xd5, 0x04, 0x76, 0xf4, 0xb6, 0x91, 0x4b, 0xa6, 0xaf, 0x48, 0xf8, 0xa9, 0x21, 0x87, + 0xe4, 0xa5, 0x91, 0x41, 0x6f, 0xea, 0x2e, 0xd5, 0xfd, 0x45, 0xe2, 0xbb, 0x35, 0x71, 0x38, 0xc7, + 0x9d, 0x3a, 0x81, 0x71, 0xd7, 0x3c, 0x79, 0x85, 0x5b, 0xd8, 0x0b, 0xf9, 0x2d, 0x64, 0x8e, 0xec, + 0xf4, 0xac, 0xcd, 0x00, 0x70, 0xb6, 0x09, 0xf4, 0x26, 0x77, 0x78, 0x5f, 0x0b, 0x36, 0x42, 0xe1, + 0x1a, 0x76, 0xbe, 0xc0, 0x37, 0xdf, 0x8d, 0x13, 0xb2, 0x4d, 0xeb, 0xa4, 0x87, 0xeb, 0x75, 0x41, + 0x05, 0x2b, 0x7a, 0x68, 0x1d, 0x06, 0x58, 0xb4, 0x51, 0x3c, 0x33, 0x54, 0xc4, 0x12, 0x67, 0x06, + 0xd9, 0xa6, 0xfb, 0x87, 0xfd, 0x8d, 0xb1, 0xa0, 0x85, 0x2e, 0xcb, 0x30, 0xfb, 0x78, 0x2d, 0xb8, + 0x19, 0x13, 0x16, 0x66, 0x5f, 0x59, 0xfa, 0x50, 0x1a, 0x37, 0xcf, 0xcb, 0x3b, 0x66, 0xd3, 0x33, + 0x6a, 0x52, 0xc1, 0x46, 0xfc, 0x97, 0x49, 0xfa, 0x66, 0xa0, 0x48, 0x47, 0xcd, 0x94, 0x7e, 0xe9, + 0x64, 0xdf, 0x32, 0x89, 0xe1, 0x2c, 0xf5, 0x13, 0x3d, 0x52, 0x67, 0x03, 0x98, 0xc8, 0x6e, 0xca, + 0x63, 0x3d, 0xc2, 0x7f, 0xd2, 0x07, 0x63, 0xe6, 0xe2, 0x40, 0x0b, 0x50, 0x11, 0x44, 0x54, 0xd2, + 0x2e, 0xb5, 0x07, 0xae, 0x49, 0x00, 0x4e, 0x71, 0x58, 0xfa, 0x32, 0x56, 0x5d, 0x73, 0x0a, 0x4a, + 0xd3, 0x97, 0x29, 0x08, 0xd6, 0xb0, 0xa8, 0x24, 0x7c, 0x27, 0x0c, 0x13, 0x75, 0x12, 0xa8, 0x75, + 0xb3, 0xc4, 0x4a, 0xb1, 0x80, 0xd2, 0x13, 0xe0, 0x2e, 0xfd, 0x98, 0xbe, 0x69, 0x55, 0x54, 0x27, + 0xc0, 0x15, 0x1d, 0x88, 0x4d, 0x5c, 0x7a, 0xa2, 0x85, 0x31, 0x5b, 0x88, 0x42, 0xde, 0x4e, 0x9d, + 0xac, 0xea, 0x3c, 0x02, 0x4f, 0xc2, 0xd1, 0x67, 0xe0, 0x11, 0x15, 0x30, 0x87, 0xb9, 0x95, 0x56, + 0xb6, 0x38, 0x60, 0xa8, 0xcc, 0x8f, 0x2c, 0x77, 0x46, 0xc3, 0xdd, 0xea, 0xa3, 0xd7, 0x60, 0x4c, + 0xc8, 0xca, 0x92, 0xe2, 0xa0, 0x79, 0x03, 0x7f, 0xc5, 0x80, 0xe2, 0x0c, 0x36, 0xaa, 0xc2, 0x04, + 0x2d, 0x61, 0x42, 0xaa, 0xa4, 0xc0, 0x03, 0xff, 0xd4, 0x51, 0x7f, 0x25, 0x03, 0xc7, 0x6d, 0x35, + 0xd0, 0x22, 0x8c, 0x73, 0x61, 0x85, 0x2a, 0x86, 0xec, 0x3b, 0x08, 0x7f, 0x4e, 0xb5, 0x11, 0x6e, + 0x98, 0x60, 0x9c, 0xc5, 0x47, 0x17, 0x61, 0xc4, 0x89, 0x1a, 0x5b, 0x5e, 0x42, 0x1a, 0x49, 0x2b, + 0xe2, 0x49, 0x2c, 0x34, 0x17, 0x86, 0x45, 0x0d, 0x86, 0x0d, 0x4c, 0xfb, 0xf3, 0x30, 0xd5, 0xc1, + 0x79, 0x9c, 0x2e, 0x1c, 0xa7, 0xe9, 0xc9, 0x31, 0x65, 0xdc, 0xa5, 0x16, 0x6b, 0x6b, 0x72, 0x34, + 0x1a, 0x16, 0x5d, 0x9d, 0xcc, 0x3c, 0xad, 0xe5, 0xd4, 0x54, 0xab, 0x73, 0x55, 0x02, 0x70, 0x8a, + 0x63, 0xff, 0x45, 0x05, 0x34, 0xeb, 0x4d, 0x01, 0x17, 0x99, 0x8b, 0x30, 0x22, 0xd3, 0xc4, 0x6a, + 0xe9, 0x19, 0xd5, 0x30, 0x2f, 0x69, 0x30, 0x6c, 0x60, 0xd2, 0xbe, 0x05, 0xd2, 0x26, 0x95, 0x75, + 0xce, 0x52, 0xc6, 0x2a, 0x9c, 0xe2, 0xa0, 0xf3, 0x30, 0x14, 0x13, 0x7f, 0xe3, 0xaa, 0x17, 0xdc, + 0x15, 0x0b, 0x5b, 0x71, 0xe6, 0xba, 0x28, 0xc7, 0x0a, 0x03, 0x2d, 0x41, 0xb9, 0xe5, 0xb9, 0x62, + 0x29, 0x4b, 0xb1, 0xa1, 0x7c, 0x73, 0xad, 0x7a, 0xb0, 0x37, 0xf7, 0x44, 0xb7, 0x9c, 0xb9, 0x54, + 0x3f, 0x8f, 0xe7, 0xe9, 0xf6, 0xa3, 0x95, 0x3b, 0xd9, 0xe9, 0x07, 0x7a, 0xb4, 0xd3, 0x5f, 0x00, + 0x10, 0xa3, 0x96, 0x6b, 0xb9, 0x9c, 0x7e, 0xb5, 0x4b, 0x0a, 0x82, 0x35, 0x2c, 0xaa, 0xe5, 0x37, + 0x22, 0xe2, 0x48, 0x45, 0x98, 0x3b, 0x35, 0x0f, 0x1d, 0x5d, 0xcb, 0x5f, 0xce, 0x12, 0xc3, 0xed, + 0xf4, 0x51, 0x08, 0x93, 0xae, 0x88, 0xca, 0x4c, 0x1b, 0xad, 0xf4, 0xee, 0x49, 0x4d, 0x1b, 0xac, + 0x66, 0x09, 0xe1, 0x76, 0xda, 0xe8, 0x73, 0x30, 0x2b, 0x0b, 0xdb, 0x43, 0x62, 0xd9, 0x76, 0x29, + 0x2f, 0x9d, 0xd9, 0xdf, 0x9b, 0x9b, 0xad, 0x76, 0xc5, 0xc2, 0x87, 0x50, 0x40, 0x6f, 0xc1, 0x00, + 0xbb, 0xd7, 0x89, 0x67, 0x86, 0xd9, 0x89, 0xf7, 0x52, 0x11, 0x7f, 0x7c, 0xba, 0xea, 0xe7, 0xd9, + 0xed, 0x90, 0xf0, 0x34, 0x4d, 0x2f, 0xcb, 0x58, 0x21, 0x16, 0x34, 0x51, 0x13, 0x86, 0x9d, 0x20, + 0x08, 0x13, 0x87, 0x0b, 0x62, 0x23, 0x45, 0x64, 0x49, 0xad, 0x89, 0xc5, 0xb4, 0x2e, 0x6f, 0x47, + 0x39, 0xaf, 0x69, 0x10, 0xac, 0x37, 0x81, 0xee, 0xc1, 0x78, 0x78, 0x8f, 0x32, 0x4c, 0x79, 0xb5, + 0x11, 0xcf, 0x8c, 0x9a, 0x03, 0xcb, 0x31, 0xd4, 0x1a, 0x95, 0x35, 0x4e, 0x66, 0x12, 0xc5, 0xd9, + 0x56, 0xd0, 0xbc, 0x61, 0xae, 0x1e, 0x4b, 0xfd, 0xa9, 0x53, 0x73, 0xb5, 0x6e, 0x9d, 0x66, 0x61, + 0xd7, 0xdc, 0x87, 0x92, 0x71, 0x84, 0xf1, 0x4c, 0xd8, 0x75, 0x0a, 0xc2, 0x3a, 0xde, 0xec, 0xc7, + 0x60, 0x58, 0x9b, 0xf8, 0x5e, 0x1c, 0x77, 0x67, 0x5f, 0x83, 0x89, 0xec, 0x84, 0xf6, 0xe4, 0xf8, + 0xfb, 0x3f, 0x4b, 0x30, 0xde, 0xe1, 0xde, 0xe8, 0xae, 0xc7, 0x9c, 0xcf, 0x0d, 0xd6, 0x77, 0xc5, + 0x0b, 0x5c, 0xcc, 0x20, 0x26, 0x03, 0x2b, 0x15, 0x60, 0x60, 0x92, 0x9b, 0x96, 0xbb, 0x72, 0x53, + 0xc1, 0xb4, 0xfa, 0xde, 0x0f, 0xd3, 0x32, 0xcf, 0x89, 0xfe, 0x42, 0xe7, 0xc4, 0x03, 0x60, 0x74, + 0xc6, 0x51, 0x33, 0x58, 0xe0, 0xa8, 0xf9, 0x66, 0x09, 0x26, 0x52, 0x27, 0x67, 0x91, 0x3b, 0xfa, + 0xf8, 0xaf, 0x21, 0xd6, 0x8d, 0x6b, 0x88, 0xbc, 0xd4, 0xd0, 0x99, 0xfe, 0x75, 0xbd, 0x92, 0x78, + 0x2b, 0x73, 0x25, 0xf1, 0x52, 0x8f, 0x74, 0x0f, 0xbf, 0x9e, 0xf8, 0x6e, 0x09, 0x4e, 0x65, 0xab, + 0x2c, 0xfb, 0x8e, 0xb7, 0x7d, 0x02, 0xf3, 0xf5, 0x19, 0x63, 0xbe, 0x5e, 0xe9, 0x6d, 0x5c, 0xac, + 0x93, 0x5d, 0x27, 0xcd, 0xc9, 0x4c, 0xda, 0xc7, 0x8e, 0x42, 0xfc, 0xf0, 0x99, 0xfb, 0x43, 0x0b, + 0x1e, 0xed, 0x58, 0xef, 0x04, 0x0c, 0xaf, 0x6f, 0x98, 0x86, 0xd7, 0x17, 0x8f, 0x30, 0xba, 0x2e, + 0x96, 0xd8, 0x5f, 0x2b, 0x77, 0x19, 0x15, 0x33, 0x4d, 0xdd, 0x80, 0x61, 0xa7, 0xd1, 0x20, 0x71, + 0x7c, 0x2d, 0x74, 0x55, 0x02, 0xa7, 0xe7, 0xd9, 0xd9, 0x92, 0x16, 0x1f, 0xec, 0xcd, 0xcd, 0x66, + 0x49, 0xa4, 0x60, 0xac, 0x53, 0x30, 0x53, 0xcb, 0x95, 0x8e, 0x29, 0xb5, 0xdc, 0x05, 0x80, 0x1d, + 0xa5, 0xc5, 0x66, 0x2d, 0x5e, 0x9a, 0x7e, 0xab, 0x61, 0xa1, 0xff, 0x9f, 0x49, 0x84, 0xdc, 0x49, + 0xa3, 0xcf, 0x8c, 0x97, 0xcc, 0xf9, 0x7e, 0xba, 0xc3, 0x07, 0x0f, 0xcb, 0x54, 0xd6, 0x41, 0x45, + 0x12, 0x7d, 0x0a, 0x26, 0x62, 0x1e, 0xfc, 0xbf, 0xec, 0x3b, 0x31, 0xf3, 0xee, 0x17, 0xfc, 0x94, + 0x45, 0x58, 0xd6, 0x33, 0x30, 0xdc, 0x86, 0x6d, 0x7f, 0xa7, 0x0c, 0x1f, 0x3c, 0x64, 0xd9, 0xa2, + 0x45, 0xf3, 0xd6, 0xf6, 0xb9, 0xac, 0xfd, 0x67, 0xb6, 0x63, 0x65, 0xc3, 0x20, 0x94, 0xf9, 0xda, + 0xa5, 0xf7, 0xfd, 0xb5, 0xbf, 0xae, 0x5b, 0xeb, 0xb8, 0xdf, 0xe6, 0xa5, 0x23, 0x6f, 0xcc, 0x9f, + 0x56, 0x63, 0xfd, 0x97, 0x2c, 0x78, 0xa2, 0xe3, 0xb0, 0x0c, 0x2f, 0x91, 0x05, 0xa8, 0x34, 0x68, + 0xa1, 0x16, 0x8b, 0x93, 0x06, 0xc1, 0x49, 0x00, 0x4e, 0x71, 0x0c, 0x67, 0x90, 0x52, 0xae, 0x33, + 0xc8, 0xef, 0x5b, 0x30, 0x9d, 0xed, 0xc4, 0x09, 0xf0, 0xad, 0xba, 0xc9, 0xb7, 0xe6, 0x7b, 0xfb, + 0xf8, 0x5d, 0x58, 0xd6, 0x7f, 0x1f, 0x83, 0xd3, 0x6d, 0xa7, 0x1e, 0x9f, 0xc5, 0x9f, 0xb3, 0x60, + 0x72, 0x93, 0x49, 0xef, 0x5a, 0xc0, 0x93, 0x18, 0x57, 0x4e, 0x94, 0xd8, 0xa1, 0x71, 0x52, 0x5c, + 0x17, 0x69, 0x43, 0xc1, 0xed, 0x8d, 0xa1, 0xaf, 0x5a, 0x30, 0xed, 0xdc, 0x8b, 0xdb, 0x5e, 0x36, + 0x11, 0x0b, 0xe9, 0xb5, 0x1c, 0x63, 0x59, 0xce, 0x9b, 0x28, 0x4b, 0x33, 0xfb, 0x7b, 0x73, 0xd3, + 0x9d, 0xb0, 0x70, 0xc7, 0x56, 0xe9, 0xf7, 0xdd, 0x12, 0xe1, 0x14, 0xc5, 0x42, 0xf7, 0x3a, 0x05, + 0x5f, 0x70, 0xb6, 0x26, 0x21, 0x58, 0x51, 0x44, 0xef, 0x40, 0x65, 0x53, 0xc6, 0x38, 0x65, 0xd9, + 0x66, 0x97, 0x69, 0xee, 0x14, 0x12, 0xc5, 0x7d, 0xf7, 0x15, 0x08, 0xa7, 0x44, 0xd1, 0x65, 0x28, + 0x07, 0x1b, 0xb1, 0x88, 0x26, 0xce, 0xf3, 0x01, 0x32, 0x3d, 0xaf, 0x78, 0x00, 0xe6, 0xf5, 0xd5, + 0x3a, 0xa6, 0x24, 0x28, 0xa5, 0xe8, 0x8e, 0x2b, 0xac, 0xc4, 0x39, 0x94, 0xf0, 0x52, 0xb5, 0x9d, + 0x12, 0x5e, 0xaa, 0x62, 0x4a, 0x02, 0xd5, 0xa0, 0x9f, 0x05, 0x6b, 0x08, 0x13, 0x70, 0x4e, 0xc8, + 0x79, 0x5b, 0x48, 0x0a, 0xcf, 0x80, 0xc8, 0x8a, 0x31, 0x27, 0x84, 0xd6, 0x61, 0xa0, 0xc1, 0x92, + 0xf8, 0x0b, 0xdd, 0x3c, 0x2f, 0x19, 0x43, 0x5b, 0xc2, 0x7f, 0x7e, 0xef, 0xc5, 0xcb, 0xb1, 0xa0, + 0xc5, 0xa8, 0x92, 0xe6, 0xd6, 0x46, 0x2c, 0x94, 0xef, 0x3c, 0xaa, 0x6d, 0xcf, 0x31, 0x08, 0xaa, + 0xac, 0x1c, 0x0b, 0x5a, 0xa8, 0x0a, 0xa5, 0x8d, 0x86, 0x48, 0xa4, 0x9a, 0x63, 0xfa, 0x35, 0xa3, + 0x69, 0x97, 0x06, 0xf6, 0xf7, 0xe6, 0x4a, 0xab, 0xcb, 0xb8, 0xb4, 0xd1, 0x40, 0x6f, 0xc0, 0xe0, + 0x06, 0x8f, 0x8f, 0x14, 0x49, 0x53, 0x5f, 0xc8, 0x0b, 0xe2, 0x6c, 0x0b, 0xa6, 0xe4, 0xf1, 0x19, + 0x02, 0x80, 0x25, 0x39, 0x96, 0x4f, 0x4e, 0x45, 0x7c, 0x8a, 0xac, 0xa9, 0xf3, 0xbd, 0x45, 0x88, + 0x0a, 0x9d, 0x54, 0x95, 0x62, 0x8d, 0x22, 0x5d, 0xf3, 0x8e, 0x7c, 0x8f, 0x84, 0x65, 0x4c, 0xcd, + 0x5d, 0xf3, 0x1d, 0x9f, 0x2f, 0xe1, 0x6b, 0x5e, 0x81, 0x70, 0x4a, 0x14, 0xb5, 0x60, 0x74, 0x27, + 0x6e, 0x6e, 0x11, 0xb9, 0xf5, 0x59, 0x1a, 0xd5, 0xe1, 0x0b, 0x9f, 0xc8, 0xc9, 0x8d, 0x2b, 0xaa, + 0x78, 0x51, 0xd2, 0x72, 0xfc, 0x36, 0x0e, 0xc6, 0x12, 0x78, 0xdd, 0xd2, 0xc9, 0x62, 0xb3, 0x15, + 0xfa, 0x49, 0xde, 0x6b, 0x85, 0x77, 0x76, 0x13, 0x22, 0xd2, 0xac, 0xe6, 0x7c, 0x92, 0xd7, 0x39, + 0x72, 0xfb, 0x27, 0x11, 0x00, 0x2c, 0xc9, 0xa9, 0x29, 0x63, 0xdc, 0x78, 0xa2, 0xf0, 0x94, 0xb5, + 0x8d, 0x21, 0x9d, 0x32, 0xc6, 0x7d, 0x53, 0xa2, 0x8c, 0xeb, 0x36, 0xb7, 0xc2, 0x24, 0x0c, 0x32, + 0xbc, 0x7f, 0xb2, 0x08, 0xd7, 0xad, 0x75, 0xa8, 0xd9, 0xce, 0x75, 0x3b, 0x61, 0xe1, 0x8e, 0xad, + 0xa2, 0x00, 0xc6, 0x9a, 0x61, 0x94, 0xdc, 0x0b, 0x23, 0xb9, 0x0e, 0x51, 0x21, 0x1d, 0xd1, 0xa8, + 0x23, 0xda, 0x66, 0x6e, 0xb8, 0x26, 0x04, 0x67, 0xa8, 0xd3, 0x4f, 0x17, 0x37, 0x1c, 0x9f, 0xac, + 0xdd, 0x98, 0x99, 0x2a, 0xf2, 0xe9, 0xea, 0x1c, 0xb9, 0xfd, 0xd3, 0x09, 0x00, 0x96, 0xe4, 0xec, + 0x5f, 0x1d, 0x68, 0x17, 0x1c, 0x98, 0x6a, 0xf0, 0x37, 0xdb, 0x6f, 0x62, 0x3f, 0xd5, 0xbb, 0x06, + 0xfc, 0x00, 0xef, 0x64, 0xbf, 0x6a, 0xc1, 0xe9, 0x66, 0x47, 0xb1, 0x40, 0x1c, 0xbd, 0xbd, 0x2a, + 0xd2, 0x7c, 0x5a, 0x54, 0x36, 0xe4, 0xce, 0x70, 0xdc, 0xa5, 0xcd, 0xac, 0x30, 0x5d, 0x7e, 0xdf, + 0xc2, 0xf4, 0x6d, 0x18, 0x62, 0xd2, 0x5f, 0x9a, 0xeb, 0xa4, 0xc7, 0xb4, 0x20, 0xec, 0x10, 0x5f, + 0x16, 0x24, 0xb0, 0x22, 0x46, 0x27, 0xee, 0xf1, 0xec, 0x20, 0x30, 0x61, 0x60, 0x91, 0x83, 0x8f, + 0x6b, 0x2a, 0xab, 0x62, 0x26, 0x1e, 0xaf, 0x1d, 0x86, 0x7c, 0x90, 0x87, 0x80, 0x0f, 0x6f, 0x0c, + 0x55, 0x3b, 0xa8, 0x4a, 0x03, 0xe6, 0xb5, 0x4b, 0xbe, 0xba, 0x74, 0xb2, 0x22, 0xfe, 0x3f, 0xb2, + 0x3a, 0x48, 0xa4, 0x5c, 0x2d, 0xfb, 0x84, 0xa9, 0x96, 0x3d, 0x9d, 0x55, 0xcb, 0xda, 0x8c, 0x31, + 0x86, 0x46, 0x56, 0x3c, 0x87, 0x68, 0xd1, 0x64, 0x2e, 0xb6, 0x0f, 0x67, 0xf3, 0xd8, 0x1d, 0x73, + 0xc5, 0x72, 0xd5, 0x25, 0x64, 0xea, 0x8a, 0xe5, 0xae, 0x55, 0x31, 0x83, 0x14, 0xcd, 0x07, 0x60, + 0xff, 0x7c, 0x09, 0xca, 0xb5, 0xd0, 0x3d, 0x01, 0xe3, 0xd2, 0x25, 0xc3, 0xb8, 0xf4, 0x54, 0xee, + 0xfb, 0x74, 0x5d, 0x4d, 0x49, 0x37, 0x32, 0xa6, 0xa4, 0x0f, 0xe7, 0x93, 0x3a, 0xdc, 0x70, 0xf4, + 0xbd, 0x32, 0xe8, 0x2f, 0xec, 0xa1, 0xff, 0x70, 0x14, 0x0f, 0xdd, 0x72, 0xb1, 0x47, 0xf7, 0x44, + 0x1b, 0xcc, 0x93, 0x4b, 0xc6, 0xf5, 0xfd, 0xd4, 0x3a, 0xea, 0xde, 0x26, 0xde, 0xe6, 0x56, 0x42, + 0xdc, 0xec, 0xc0, 0x4e, 0xce, 0x51, 0xf7, 0xcf, 0x2d, 0x18, 0xcf, 0xb4, 0x8e, 0xfc, 0x4e, 0x01, + 0x41, 0x47, 0x34, 0x17, 0x4d, 0xe6, 0x46, 0x10, 0xcd, 0x03, 0x28, 0xab, 0xbf, 0x34, 0xc9, 0x30, + 0xe9, 0x54, 0x5d, 0x0b, 0xc4, 0x58, 0xc3, 0x40, 0x2f, 0xc3, 0x70, 0x12, 0x36, 0x43, 0x3f, 0xdc, + 0xdc, 0xbd, 0x42, 0x64, 0xa6, 0x0a, 0x75, 0x63, 0xb2, 0x9e, 0x82, 0xb0, 0x8e, 0x67, 0x7f, 0xbf, + 0x0c, 0xd9, 0xf7, 0x19, 0xff, 0xdf, 0x3a, 0xfd, 0xe9, 0x59, 0xa7, 0x7f, 0x64, 0xc1, 0x04, 0x6d, + 0x9d, 0xb9, 0xce, 0x48, 0x87, 0x5a, 0xf5, 0xa0, 0x81, 0x75, 0xc8, 0x83, 0x06, 0x4f, 0x53, 0x6e, + 0xe7, 0x86, 0xad, 0x44, 0x18, 0x91, 0x34, 0x26, 0x46, 0x4b, 0xb1, 0x80, 0x0a, 0x3c, 0x12, 0x45, + 0x22, 0xf2, 0x48, 0xc7, 0x23, 0x51, 0x84, 0x05, 0x54, 0xbe, 0x77, 0xd0, 0xd7, 0xe5, 0xbd, 0x03, + 0x96, 0xeb, 0x49, 0xb8, 0x6b, 0x08, 0xb1, 0x42, 0xcb, 0xf5, 0x24, 0xfd, 0x38, 0x52, 0x1c, 0xfb, + 0xdb, 0x65, 0x18, 0xa9, 0x85, 0x6e, 0xea, 0x29, 0xff, 0x92, 0xe1, 0x29, 0x7f, 0x36, 0xe3, 0x29, + 0x3f, 0xa1, 0xe3, 0x3e, 0x18, 0x47, 0x79, 0x91, 0x13, 0x8c, 0xbd, 0xc8, 0x71, 0x44, 0x27, 0x79, + 0x23, 0x27, 0x98, 0x22, 0x84, 0x4d, 0xba, 0x3f, 0x4b, 0xce, 0xf1, 0xff, 0xdb, 0x82, 0xb1, 0x5a, + 0xe8, 0xd2, 0x05, 0xfa, 0xb3, 0xb4, 0x1a, 0xf5, 0x4c, 0x62, 0x03, 0x87, 0x64, 0x12, 0xfb, 0x75, + 0x0b, 0x06, 0x6b, 0xa1, 0x7b, 0x02, 0x06, 0xd6, 0x55, 0xd3, 0xc0, 0xfa, 0x44, 0x2e, 0xe7, 0xed, + 0x62, 0x53, 0xfd, 0x4e, 0x19, 0x46, 0x69, 0x8f, 0xc3, 0x4d, 0xf9, 0xbd, 0x8c, 0xb9, 0xb1, 0x0a, + 0xcc, 0x0d, 0x15, 0x09, 0x43, 0xdf, 0x0f, 0xef, 0x65, 0xbf, 0xdd, 0x2a, 0x2b, 0xc5, 0x02, 0x8a, + 0xce, 0xc3, 0x50, 0x33, 0x22, 0x3b, 0x5e, 0xd8, 0x8a, 0xb3, 0x51, 0x8c, 0x35, 0x51, 0x8e, 0x15, + 0x06, 0x7a, 0x09, 0x46, 0x62, 0x2f, 0x68, 0x10, 0xe9, 0xcc, 0xd1, 0xc7, 0x9c, 0x39, 0x78, 0xd2, + 0x46, 0xad, 0x1c, 0x1b, 0x58, 0xe8, 0x36, 0x54, 0xd8, 0x7f, 0xb6, 0x83, 0x7a, 0x7f, 0xb0, 0x80, + 0x67, 0x2a, 0x93, 0x04, 0x70, 0x4a, 0x0b, 0x5d, 0x00, 0x48, 0xa4, 0xdb, 0x49, 0x2c, 0xf2, 0xad, + 0x28, 0xb9, 0x54, 0x39, 0xa4, 0xc4, 0x58, 0xc3, 0x42, 0xcf, 0x41, 0x25, 0x71, 0x3c, 0xff, 0xaa, + 0x17, 0x90, 0x58, 0xb8, 0xed, 0x88, 0x04, 0xcc, 0xa2, 0x10, 0xa7, 0x70, 0x7a, 0xde, 0xb3, 0x18, + 0x6a, 0xfe, 0x18, 0xca, 0x10, 0xc3, 0x66, 0xe7, 0xfd, 0x55, 0x55, 0x8a, 0x35, 0x0c, 0xfb, 0x22, + 0x9c, 0xaa, 0x85, 0x6e, 0x2d, 0x8c, 0x92, 0xd5, 0x30, 0xba, 0xe7, 0x44, 0xae, 0xfc, 0x7e, 0x73, + 0x32, 0xef, 0x2f, 0x3d, 0x93, 0xfb, 0xb9, 0xcd, 0xd1, 0xc8, 0xe3, 0xfb, 0x22, 0x3b, 0xf1, 0x7b, + 0x0c, 0xc1, 0xf8, 0x51, 0x09, 0x50, 0x8d, 0x39, 0xc6, 0x18, 0x6f, 0xe7, 0x6c, 0xc1, 0x58, 0x4c, + 0xae, 0x7a, 0x41, 0xeb, 0xbe, 0x20, 0x55, 0x2c, 0xe6, 0xa5, 0xbe, 0xa2, 0xd7, 0xe1, 0x96, 0x0e, + 0xb3, 0x0c, 0x67, 0xe8, 0xd2, 0xc9, 0x8c, 0x5a, 0xc1, 0x62, 0x7c, 0x33, 0x26, 0x91, 0x78, 0x2b, + 0x86, 0x4d, 0x26, 0x96, 0x85, 0x38, 0x85, 0xd3, 0xc5, 0xc3, 0xfe, 0x5c, 0x0f, 0x03, 0x1c, 0x86, + 0x89, 0x5c, 0x6e, 0xec, 0xed, 0x00, 0xad, 0x1c, 0x1b, 0x58, 0x68, 0x15, 0x50, 0xdc, 0x6a, 0x36, + 0x7d, 0x76, 0xd7, 0xe8, 0xf8, 0x97, 0xa2, 0xb0, 0xd5, 0xe4, 0xfe, 0xd1, 0x22, 0xed, 0x7e, 0xbd, + 0x0d, 0x8a, 0x3b, 0xd4, 0xa0, 0xcc, 0x62, 0x23, 0x66, 0xbf, 0x45, 0x40, 0x35, 0xb7, 0x57, 0xd6, + 0x59, 0x11, 0x96, 0x30, 0xfb, 0x8b, 0xec, 0x80, 0x63, 0x8f, 0x78, 0x24, 0xad, 0x88, 0xa0, 0x6d, + 0x18, 0x6d, 0xb2, 0x43, 0x2c, 0x89, 0x42, 0xdf, 0x27, 0x52, 0xbe, 0x3c, 0x9a, 0x6b, 0x0e, 0x4f, + 0xdb, 0xaf, 0x93, 0xc3, 0x26, 0x75, 0xfb, 0x17, 0xc7, 0x18, 0xaf, 0x12, 0xd7, 0xbd, 0x83, 0xc2, + 0x09, 0x57, 0x48, 0x72, 0x1f, 0x2a, 0xf2, 0x1c, 0x57, 0x7a, 0x0e, 0x08, 0x97, 0x5e, 0x2c, 0xa9, + 0xa0, 0xcf, 0x32, 0x17, 0x73, 0xce, 0x20, 0x8a, 0x3f, 0x32, 0xc8, 0xf1, 0x0d, 0xf7, 0x72, 0x41, + 0x02, 0x6b, 0xe4, 0xd0, 0x55, 0x18, 0x15, 0x6f, 0x3e, 0x08, 0x33, 0x45, 0xd9, 0x50, 0xb1, 0x47, + 0xb1, 0x0e, 0x3c, 0xc8, 0x16, 0x60, 0xb3, 0x32, 0xda, 0x84, 0xc7, 0xb5, 0x37, 0x8d, 0x3a, 0xb8, + 0x91, 0x71, 0xce, 0xf3, 0xc4, 0xfe, 0xde, 0xdc, 0xe3, 0xeb, 0x87, 0x21, 0xe2, 0xc3, 0xe9, 0xa0, + 0x1b, 0x70, 0xca, 0x69, 0x24, 0xde, 0x0e, 0xa9, 0x12, 0xc7, 0xf5, 0xbd, 0x80, 0x98, 0x51, 0xf7, + 0x8f, 0xee, 0xef, 0xcd, 0x9d, 0x5a, 0xec, 0x84, 0x80, 0x3b, 0xd7, 0x43, 0x9f, 0x80, 0x8a, 0x1b, + 0xc4, 0x62, 0x0e, 0x06, 0x8c, 0x27, 0xbc, 0x2a, 0xd5, 0xeb, 0x75, 0x35, 0xfe, 0xf4, 0x0f, 0x4e, + 0x2b, 0xa0, 0xf7, 0xf8, 0x13, 0xf5, 0x4a, 0x9b, 0xe1, 0x4f, 0xc7, 0xbd, 0x52, 0x48, 0x7f, 0x36, + 0x62, 0x61, 0xb8, 0x05, 0x4f, 0xb9, 0x6b, 0x1a, 0x61, 0x32, 0x46, 0x13, 0xe8, 0xd3, 0x80, 0x62, + 0x12, 0xed, 0x78, 0x0d, 0xb2, 0xd8, 0x60, 0x99, 0x4e, 0x99, 0x8d, 0x67, 0xc8, 0x88, 0x5b, 0x40, + 0xf5, 0x36, 0x0c, 0xdc, 0xa1, 0x16, 0xba, 0x4c, 0x39, 0x8f, 0x5e, 0x2a, 0xbc, 0x6b, 0xa5, 0x60, + 0x38, 0x53, 0x25, 0xcd, 0x88, 0x34, 0x9c, 0x84, 0xb8, 0x26, 0x45, 0x9c, 0xa9, 0x47, 0xcf, 0x25, + 0x95, 0xcc, 0x1e, 0x4c, 0x9f, 0xd0, 0xf6, 0x84, 0xf6, 0x54, 0xcf, 0xda, 0x0a, 0xe3, 0xe4, 0x3a, + 0x49, 0xee, 0x85, 0xd1, 0x5d, 0x76, 0x87, 0x31, 0xa4, 0xa5, 0x8d, 0x4b, 0x41, 0x58, 0xc7, 0xa3, + 0x32, 0x14, 0xbb, 0x3c, 0x5b, 0xab, 0xb2, 0x9b, 0x89, 0xa1, 0x74, 0xef, 0x5c, 0xe6, 0xc5, 0x58, + 0xc2, 0x25, 0xea, 0x5a, 0x6d, 0x99, 0xdd, 0x32, 0x64, 0x50, 0xd7, 0x6a, 0xcb, 0x58, 0xc2, 0x51, + 0xd8, 0xfe, 0x50, 0xda, 0x58, 0x91, 0x1b, 0x9f, 0x76, 0x4e, 0x5e, 0xf0, 0xad, 0xb4, 0xfb, 0x30, + 0xa1, 0x1e, 0x6b, 0xe3, 0x19, 0x3d, 0xe3, 0x99, 0xf1, 0x22, 0x0f, 0xe4, 0x77, 0x4c, 0x0c, 0xaa, + 0xec, 0x7a, 0x6b, 0x19, 0x9a, 0xb8, 0xad, 0x15, 0x23, 0x7b, 0xc4, 0x44, 0xee, 0x03, 0x05, 0x0b, + 0x50, 0x89, 0x5b, 0x77, 0xdc, 0x70, 0xdb, 0xf1, 0x02, 0x76, 0x15, 0xa0, 0x3f, 0xf7, 0x2e, 0x01, + 0x38, 0xc5, 0x41, 0x35, 0x18, 0x72, 0x84, 0x0a, 0x27, 0x4c, 0xf6, 0x39, 0xd1, 0xe5, 0x52, 0xe1, + 0xe3, 0xd6, 0x55, 0xf9, 0x0f, 0x2b, 0x2a, 0xe8, 0x55, 0x18, 0x15, 0xc1, 0x51, 0xc2, 0x89, 0x71, + 0xca, 0x74, 0xa4, 0xaf, 0xeb, 0x40, 0x6c, 0xe2, 0xa2, 0x4d, 0x18, 0xa3, 0x54, 0x52, 0x06, 0x38, + 0x33, 0xdd, 0x1b, 0x0f, 0xd5, 0x52, 0x41, 0xeb, 0x64, 0x70, 0x86, 0x2c, 0x72, 0xe1, 0x31, 0xa7, + 0x95, 0x84, 0xdb, 0x74, 0x27, 0x98, 0xfb, 0x64, 0x3d, 0xbc, 0x4b, 0x82, 0x99, 0x53, 0x6c, 0x05, + 0x9e, 0xdd, 0xdf, 0x9b, 0x7b, 0x6c, 0xf1, 0x10, 0x3c, 0x7c, 0x28, 0x15, 0xf4, 0x36, 0x0c, 0x27, + 0xa1, 0x2f, 0x7c, 0x93, 0xe3, 0x99, 0xd3, 0x45, 0x72, 0xda, 0xac, 0xab, 0x0a, 0xba, 0x19, 0x43, + 0x11, 0xc1, 0x3a, 0xc5, 0xd9, 0x4f, 0xc2, 0x64, 0x1b, 0x4b, 0xea, 0xc9, 0x7d, 0xf3, 0x3f, 0xf6, + 0x43, 0x45, 0x59, 0xf4, 0xd0, 0x82, 0x69, 0xbc, 0x7d, 0x34, 0x6b, 0xbc, 0x1d, 0xa2, 0x02, 0x94, + 0x6e, 0xaf, 0xfd, 0x5c, 0x87, 0xe7, 0xb9, 0x9f, 0xcd, 0xdd, 0x83, 0xc5, 0x23, 0xaa, 0x7a, 0x78, + 0xc4, 0x3c, 0xd5, 0xea, 0xfa, 0x0e, 0xd5, 0xea, 0x0a, 0x3e, 0x39, 0x47, 0xf5, 0xb7, 0x66, 0xe8, + 0xae, 0xd5, 0xb2, 0x2f, 0x2a, 0xd5, 0x68, 0x21, 0xe6, 0x30, 0x26, 0x77, 0xd3, 0x33, 0x95, 0xc9, + 0xdd, 0x83, 0x47, 0x94, 0xbb, 0x25, 0x01, 0x9c, 0xd2, 0x42, 0x3b, 0x30, 0xd9, 0x30, 0x1f, 0xc8, + 0x52, 0x71, 0x52, 0xcf, 0xf7, 0xf0, 0x40, 0x55, 0x4b, 0x7b, 0x3d, 0x63, 0x39, 0x4b, 0x0f, 0xb7, + 0x37, 0x81, 0x5e, 0x85, 0xa1, 0xf7, 0xc2, 0x98, 0x5d, 0x2b, 0x88, 0x83, 0x45, 0xc6, 0xa3, 0x0c, + 0xbd, 0x7e, 0xa3, 0xce, 0xca, 0x0f, 0xf6, 0xe6, 0x86, 0x6b, 0xa1, 0x2b, 0xff, 0x62, 0x55, 0x01, + 0x7d, 0xc9, 0x82, 0x53, 0xc6, 0x3e, 0x53, 0x3d, 0x87, 0xa3, 0xf4, 0xfc, 0x71, 0xd1, 0xf2, 0xa9, + 0xb5, 0x4e, 0x34, 0x71, 0xe7, 0xa6, 0xec, 0xdf, 0xe5, 0x26, 0x4c, 0x61, 0xd4, 0x20, 0x71, 0xcb, + 0x3f, 0x89, 0x4c, 0xf6, 0x37, 0x0c, 0x7b, 0xcb, 0x03, 0x30, 0xa2, 0xff, 0x7b, 0x8b, 0x19, 0xd1, + 0xd7, 0xc9, 0x76, 0xd3, 0x77, 0x92, 0x93, 0xf0, 0xee, 0xfd, 0x2c, 0x0c, 0x25, 0xa2, 0xb5, 0x62, + 0x69, 0xf8, 0xb5, 0xee, 0xb1, 0xcb, 0x05, 0x75, 0x30, 0xc9, 0x52, 0xac, 0x08, 0xda, 0xff, 0x9a, + 0x7f, 0x15, 0x09, 0x39, 0x01, 0x4b, 0xc1, 0x75, 0xd3, 0x52, 0xf0, 0x4c, 0xe1, 0xb1, 0x74, 0xb1, + 0x18, 0x7c, 0xdf, 0x1c, 0x01, 0xd3, 0x1f, 0x7e, 0x7a, 0x6e, 0x79, 0xec, 0x5f, 0xb1, 0x60, 0xba, + 0xd3, 0x75, 0x3b, 0x15, 0x30, 0xb8, 0xf6, 0xa2, 0xee, 0xbf, 0xd4, 0xac, 0xde, 0x12, 0xe5, 0x58, + 0x61, 0x14, 0xce, 0x8b, 0xdd, 0x5b, 0xea, 0xa6, 0x1b, 0x60, 0x3e, 0xb5, 0x86, 0x5e, 0xe3, 0xce, + 0xfc, 0x96, 0x7a, 0x0b, 0xad, 0x37, 0x47, 0x7e, 0xfb, 0x37, 0x4a, 0x30, 0xcd, 0x8d, 0xd0, 0x8b, + 0x3b, 0xa1, 0xe7, 0xd6, 0x42, 0x57, 0x84, 0x36, 0xb8, 0x30, 0xd2, 0xd4, 0x94, 0xcf, 0x62, 0xa9, + 0x60, 0x74, 0x75, 0x35, 0x15, 0xf8, 0xf5, 0x52, 0x6c, 0x50, 0xa5, 0xad, 0x90, 0x1d, 0xaf, 0xa1, + 0x6c, 0x9a, 0xa5, 0x9e, 0x4f, 0x06, 0xd5, 0xca, 0x8a, 0x46, 0x07, 0x1b, 0x54, 0x8f, 0xe1, 0x39, + 0x0b, 0xfb, 0x1f, 0x58, 0xf0, 0x48, 0x97, 0x74, 0x31, 0xb4, 0xb9, 0x7b, 0xcc, 0xf0, 0x2f, 0xde, + 0xf2, 0x53, 0xcd, 0xf1, 0xeb, 0x00, 0x2c, 0xa0, 0xe8, 0x0e, 0x00, 0x37, 0xe7, 0xb3, 0x97, 0xdd, + 0x4b, 0x45, 0xfc, 0x91, 0xda, 0x92, 0x32, 0x68, 0xf1, 0xfa, 0xea, 0x2d, 0x77, 0x8d, 0xaa, 0xfd, + 0xad, 0x32, 0xf4, 0xf3, 0x27, 0xa3, 0x6b, 0x30, 0xb8, 0xc5, 0xd3, 0xd7, 0xf6, 0x96, 0x3d, 0x37, + 0x55, 0x2e, 0x78, 0x01, 0x96, 0x64, 0xd0, 0x35, 0x98, 0xa2, 0x27, 0x8b, 0xe7, 0xf8, 0x55, 0xe2, + 0x3b, 0xbb, 0x52, 0x5b, 0xe5, 0x6f, 0x1c, 0xc8, 0x64, 0xdc, 0x53, 0x6b, 0xed, 0x28, 0xb8, 0x53, + 0x3d, 0xf4, 0x5a, 0x5b, 0xb6, 0x39, 0x9e, 0x16, 0x58, 0x49, 0xaa, 0x87, 0x67, 0x9c, 0xa3, 0xf2, + 0x74, 0xb3, 0x4d, 0x2f, 0xd7, 0x5e, 0xe6, 0x35, 0x75, 0x71, 0x13, 0x97, 0xf9, 0x16, 0xb4, 0x98, + 0x4f, 0xc5, 0xfa, 0x56, 0x44, 0xe2, 0xad, 0xd0, 0x77, 0xc5, 0xa3, 0x92, 0xa9, 0x6f, 0x41, 0x06, + 0x8e, 0xdb, 0x6a, 0x50, 0x2a, 0x1b, 0x8e, 0xe7, 0xb7, 0x22, 0x92, 0x52, 0x19, 0x30, 0xa9, 0xac, + 0x66, 0xe0, 0xb8, 0xad, 0x06, 0x5d, 0x5b, 0xa7, 0xc4, 0x3b, 0x84, 0x32, 0x38, 0x5a, 0xb0, 0xa0, + 0xcf, 0xc0, 0xa0, 0x74, 0x91, 0x2f, 0x94, 0xc3, 0x43, 0x38, 0x0e, 0xa8, 0x37, 0x0d, 0xb5, 0x37, + 0xaf, 0x84, 0x73, 0xbc, 0xa4, 0x77, 0x94, 0xf7, 0xee, 0xfe, 0xcc, 0x82, 0xa9, 0x0e, 0xae, 0x5e, + 0x9c, 0xa5, 0x6d, 0x7a, 0x71, 0xa2, 0x32, 0xee, 0x6b, 0x2c, 0x8d, 0x97, 0x63, 0x85, 0x41, 0x77, + 0x0b, 0x67, 0x9a, 0x59, 0x46, 0x29, 0x5c, 0x40, 0x04, 0xb4, 0x37, 0x46, 0x89, 0xce, 0x42, 0x5f, + 0x2b, 0x26, 0x91, 0x7c, 0x7c, 0x4e, 0xf2, 0x79, 0x66, 0x07, 0x64, 0x10, 0x2a, 0xb6, 0x6e, 0x2a, + 0x13, 0x9c, 0x26, 0xb6, 0x72, 0x23, 0x1c, 0x87, 0xd9, 0x5f, 0x2f, 0xc3, 0x78, 0xc6, 0xe5, 0x93, + 0x76, 0x64, 0x3b, 0x0c, 0xbc, 0x24, 0x54, 0x79, 0xd5, 0xf8, 0x7b, 0x57, 0xa4, 0xb9, 0x75, 0x4d, + 0x94, 0x63, 0x85, 0x81, 0x9e, 0x96, 0xef, 0x8d, 0x66, 0x5f, 0x12, 0x58, 0xaa, 0x1a, 0x4f, 0x8e, + 0x16, 0x7d, 0x05, 0xe4, 0x49, 0xe8, 0x6b, 0x86, 0xea, 0xf9, 0x68, 0xf5, 0x3d, 0xf1, 0x52, 0xb5, + 0x16, 0x86, 0x3e, 0x66, 0x40, 0xf4, 0x94, 0x18, 0x7d, 0xe6, 0xe6, 0x02, 0x3b, 0x6e, 0x18, 0x6b, + 0x53, 0xf0, 0x0c, 0x0c, 0xde, 0x25, 0xbb, 0x91, 0x17, 0x6c, 0x66, 0xef, 0x6d, 0xae, 0xf0, 0x62, + 0x2c, 0xe1, 0xe6, 0x4b, 0x1f, 0x83, 0xc7, 0xfc, 0xd2, 0xc7, 0x50, 0xee, 0x39, 0xf8, 0x1d, 0x0b, + 0xc6, 0x59, 0xb2, 0x51, 0x11, 0x9a, 0xef, 0x85, 0xc1, 0x09, 0xc8, 0x18, 0x4f, 0x42, 0x7f, 0x44, + 0x1b, 0xcd, 0xa6, 0xea, 0x67, 0x3d, 0xc1, 0x1c, 0x86, 0x1e, 0x83, 0x3e, 0xd6, 0x05, 0xfa, 0x19, + 0x47, 0x78, 0x4e, 0xf3, 0xaa, 0x93, 0x38, 0x98, 0x95, 0xb2, 0x28, 0x2b, 0x4c, 0x9a, 0xbe, 0xc7, + 0x3b, 0x9d, 0x9a, 0x5b, 0x1f, 0xb6, 0x28, 0xab, 0x8e, 0x9d, 0x7c, 0x50, 0x51, 0x56, 0x9d, 0x89, + 0x1f, 0x2e, 0xe7, 0xff, 0x8f, 0x12, 0x9c, 0xe9, 0x58, 0x2f, 0xbd, 0x01, 0x5e, 0x35, 0x6e, 0x80, + 0x2f, 0x64, 0x6e, 0x80, 0xed, 0xc3, 0x6b, 0x3f, 0x98, 0x3b, 0xe1, 0xce, 0x57, 0xb5, 0xe5, 0x13, + 0xbc, 0xaa, 0xed, 0x2b, 0x2a, 0xe2, 0xf4, 0xe7, 0x88, 0x38, 0x7f, 0x68, 0xc1, 0xa3, 0x1d, 0xa7, + 0xec, 0xa1, 0x0b, 0x6b, 0xeb, 0xd8, 0xcb, 0x2e, 0xda, 0xc9, 0x2f, 0x97, 0xbb, 0x8c, 0x8a, 0xe9, + 0x29, 0xe7, 0x28, 0x17, 0x62, 0xc0, 0x58, 0x08, 0x6f, 0x23, 0x9c, 0x03, 0xf1, 0x32, 0xac, 0xa0, + 0x28, 0xd6, 0xc2, 0xc2, 0x78, 0x27, 0x57, 0x8e, 0xb8, 0xa1, 0xe6, 0x4d, 0x3b, 0xb9, 0x9e, 0x6f, + 0x20, 0x1b, 0x2c, 0x76, 0x5b, 0xd3, 0x3c, 0xcb, 0x47, 0xd1, 0x3c, 0x47, 0x3a, 0x6b, 0x9d, 0x68, + 0x11, 0xc6, 0xb7, 0xbd, 0x80, 0x3d, 0x10, 0x6a, 0x4a, 0x4f, 0x2a, 0x36, 0xf7, 0x9a, 0x09, 0xc6, + 0x59, 0xfc, 0xd9, 0x57, 0x61, 0xf4, 0xe8, 0xd6, 0xb5, 0x1f, 0x97, 0xe1, 0x83, 0x87, 0x30, 0x05, + 0x7e, 0x3a, 0x18, 0xdf, 0x45, 0x3b, 0x1d, 0xda, 0xbe, 0x4d, 0x0d, 0xa6, 0x37, 0x5a, 0xbe, 0xbf, + 0xcb, 0xfc, 0xa7, 0x88, 0x2b, 0x31, 0x84, 0x50, 0xa3, 0x5e, 0x22, 0x5f, 0xed, 0x80, 0x83, 0x3b, + 0xd6, 0x44, 0x9f, 0x06, 0x14, 0xde, 0x61, 0xe9, 0x78, 0xdd, 0x34, 0x9f, 0x02, 0xfb, 0x04, 0xe5, + 0x74, 0xab, 0xde, 0x68, 0xc3, 0xc0, 0x1d, 0x6a, 0x51, 0x39, 0x95, 0x3d, 0x62, 0xae, 0xba, 0x95, + 0x91, 0x53, 0xb1, 0x0e, 0xc4, 0x26, 0x2e, 0xba, 0x04, 0x93, 0xce, 0x8e, 0xe3, 0xf1, 0xf4, 0x5a, + 0x92, 0x00, 0x17, 0x54, 0x95, 0xfd, 0x6a, 0x31, 0x8b, 0x80, 0xdb, 0xeb, 0xa0, 0xa6, 0x61, 0x90, + 0xe4, 0x89, 0xf8, 0x3f, 0x71, 0x84, 0x15, 0x5c, 0xd8, 0x44, 0x69, 0xff, 0x57, 0x8b, 0x1e, 0x7d, + 0x1d, 0xde, 0x92, 0xa4, 0x33, 0xa2, 0x0c, 0x6c, 0x5a, 0x98, 0x9b, 0x9a, 0x91, 0x65, 0x1d, 0x88, + 0x4d, 0x5c, 0xbe, 0x34, 0xe2, 0xd4, 0x9d, 0xdb, 0x90, 0x36, 0x45, 0x84, 0xa8, 0xc2, 0xa0, 0x12, + 0xb4, 0xeb, 0xed, 0x78, 0x71, 0x18, 0x89, 0x0d, 0xd4, 0xa3, 0x73, 0x6f, 0xca, 0x2f, 0xab, 0x9c, + 0x0c, 0x96, 0xf4, 0xec, 0x6f, 0x94, 0x60, 0x54, 0xb6, 0xf8, 0x7a, 0x2b, 0x4c, 0x9c, 0x13, 0x38, + 0xd2, 0x5f, 0x37, 0x8e, 0xf4, 0x85, 0x62, 0x01, 0xb3, 0xac, 0x73, 0x5d, 0x8f, 0xf2, 0xcf, 0x64, + 0x8e, 0xf2, 0x17, 0x7a, 0x21, 0x7a, 0xf8, 0x11, 0xfe, 0x6f, 0x2d, 0x98, 0x34, 0xf0, 0x4f, 0xe0, + 0x24, 0xa9, 0x99, 0x27, 0xc9, 0x73, 0x3d, 0x8c, 0xa6, 0xcb, 0x09, 0xf2, 0xed, 0x52, 0x66, 0x14, + 0xec, 0xe4, 0xf8, 0x02, 0xf4, 0x6d, 0x39, 0x91, 0x5b, 0x2c, 0xd7, 0x64, 0x5b, 0xf5, 0xf9, 0xcb, + 0x4e, 0xe4, 0x72, 0xfe, 0x7f, 0x5e, 0xbd, 0x74, 0xe5, 0x44, 0x6e, 0x6e, 0x94, 0x03, 0x6b, 0x14, + 0x5d, 0x84, 0x81, 0xb8, 0x11, 0x36, 0x95, 0x1f, 0xe8, 0x59, 0xfe, 0x0a, 0x16, 0x2d, 0x39, 0xd8, + 0x9b, 0x43, 0x66, 0x73, 0xb4, 0x18, 0x0b, 0xfc, 0xd9, 0x4d, 0xa8, 0xa8, 0xa6, 0x8f, 0xd5, 0x13, + 0xfe, 0xbf, 0x95, 0x61, 0xaa, 0xc3, 0x5a, 0x41, 0x5f, 0x34, 0xe6, 0xed, 0xd5, 0x9e, 0x17, 0xdb, + 0xfb, 0x9c, 0xb9, 0x2f, 0x32, 0x4d, 0xc9, 0x15, 0xab, 0xe3, 0x08, 0xcd, 0xdf, 0x8c, 0x49, 0xb6, + 0x79, 0x5a, 0x94, 0xdf, 0x3c, 0x6d, 0xf6, 0xc4, 0xa6, 0x9f, 0x36, 0xa4, 0x7a, 0x7a, 0xac, 0xdf, + 0xf9, 0xaf, 0xf5, 0xc1, 0x74, 0xa7, 0xc8, 0x7c, 0xf4, 0x15, 0x2b, 0xf3, 0xa0, 0xc4, 0x6b, 0xbd, + 0x87, 0xf7, 0xf3, 0x57, 0x26, 0x44, 0x36, 0x9b, 0x79, 0xf3, 0x89, 0x89, 0xdc, 0x19, 0x17, 0xad, + 0xb3, 0xf8, 0xa4, 0x88, 0x3f, 0x0e, 0x22, 0xb9, 0xc2, 0xa7, 0x8e, 0xd0, 0x15, 0xf1, 0xbe, 0x48, + 0x9c, 0x89, 0x4f, 0x92, 0xc5, 0xf9, 0xf1, 0x49, 0xb2, 0x0f, 0xb3, 0x1e, 0x0c, 0x6b, 0xe3, 0x3a, + 0xd6, 0x65, 0x70, 0x97, 0x1e, 0x51, 0x5a, 0xbf, 0x8f, 0x75, 0x29, 0xfc, 0x5d, 0x0b, 0x32, 0x4e, + 0x5b, 0xca, 0x2c, 0x63, 0x75, 0x35, 0xcb, 0x9c, 0x85, 0xbe, 0x28, 0xf4, 0x49, 0xf6, 0xb1, 0x03, + 0x1c, 0xfa, 0x04, 0x33, 0x88, 0x7a, 0xfc, 0xb6, 0xdc, 0xed, 0xf1, 0x5b, 0xaa, 0xa7, 0xfb, 0x64, + 0x87, 0x48, 0x23, 0x89, 0x62, 0xe3, 0x57, 0x69, 0x21, 0xe6, 0x30, 0xfb, 0xb7, 0xfa, 0x60, 0xaa, + 0x43, 0xb4, 0x1b, 0xd5, 0x90, 0x36, 0x9d, 0x84, 0xdc, 0x73, 0x76, 0xb3, 0x49, 0x57, 0x2f, 0xf1, + 0x62, 0x2c, 0xe1, 0xcc, 0xd9, 0x94, 0x27, 0x6e, 0xcb, 0x98, 0xae, 0x44, 0xbe, 0x36, 0x01, 0x3d, + 0xfe, 0x67, 0x52, 0x2f, 0x00, 0xc4, 0xb1, 0xbf, 0x12, 0x50, 0x09, 0xcf, 0x15, 0x4e, 0xad, 0x69, + 0xbe, 0xbf, 0xfa, 0x55, 0x01, 0xc1, 0x1a, 0x16, 0xaa, 0xc2, 0x44, 0x33, 0x0a, 0x13, 0x6e, 0x18, + 0xac, 0x72, 0x47, 0x88, 0x7e, 0x33, 0x9a, 0xaa, 0x96, 0x81, 0xe3, 0xb6, 0x1a, 0xe8, 0x65, 0x18, + 0x16, 0x11, 0x56, 0xb5, 0x30, 0xf4, 0x85, 0x19, 0x49, 0x5d, 0xc7, 0xd7, 0x53, 0x10, 0xd6, 0xf1, + 0xb4, 0x6a, 0xcc, 0xda, 0x38, 0xd8, 0xb1, 0x1a, 0xb7, 0x38, 0x6a, 0x78, 0x99, 0xfc, 0x1d, 0x43, + 0x85, 0xf2, 0x77, 0xa4, 0x86, 0xb5, 0x4a, 0xe1, 0x8b, 0x18, 0xc8, 0x35, 0x40, 0xfd, 0x41, 0x19, + 0x06, 0xf8, 0xa7, 0x38, 0x01, 0x29, 0xaf, 0x26, 0x4c, 0x4a, 0x85, 0x72, 0x25, 0xf0, 0x5e, 0xcd, + 0x57, 0x9d, 0xc4, 0xe1, 0xac, 0x49, 0xed, 0x90, 0xd4, 0x0c, 0x85, 0xe6, 0x8d, 0x3d, 0x34, 0x9b, + 0xb1, 0x94, 0x00, 0xa7, 0xa1, 0xed, 0xa8, 0x2d, 0x80, 0x98, 0x3d, 0xd5, 0x49, 0x69, 0x88, 0x8c, + 0xb0, 0x2f, 0x15, 0xea, 0x47, 0x5d, 0x55, 0xe3, 0xbd, 0x49, 0x97, 0xa5, 0x02, 0x60, 0x8d, 0xf6, + 0xec, 0x2b, 0x50, 0x51, 0xc8, 0x79, 0x2a, 0xe4, 0x88, 0xce, 0xda, 0xfe, 0x3f, 0x18, 0xcf, 0xb4, + 0xd5, 0x93, 0x06, 0xfa, 0x3b, 0x16, 0x8c, 0xf3, 0x2e, 0xaf, 0x04, 0x3b, 0x82, 0x15, 0x7c, 0xd9, + 0x82, 0x69, 0xbf, 0xc3, 0x4e, 0x14, 0x9f, 0xf9, 0x28, 0x7b, 0x58, 0x29, 0x9f, 0x9d, 0xa0, 0xb8, + 0x63, 0x6b, 0xe8, 0x1c, 0x0c, 0xf1, 0x97, 0x87, 0x1d, 0x5f, 0x78, 0x50, 0x8f, 0xf0, 0x5c, 0xd8, + 0xbc, 0x0c, 0x2b, 0xa8, 0xfd, 0x13, 0x0b, 0x26, 0xdb, 0x1e, 0xb2, 0x7f, 0x58, 0x86, 0x21, 0xb2, + 0x7e, 0x97, 0xba, 0x64, 0xfd, 0xd6, 0x47, 0x59, 0x3e, 0x74, 0x94, 0xbf, 0x61, 0x81, 0x58, 0xa1, + 0x27, 0xa0, 0x3f, 0xac, 0x99, 0xfa, 0xc3, 0x87, 0x8a, 0x2c, 0xfa, 0x2e, 0x8a, 0xc3, 0x2f, 0x95, + 0x60, 0x82, 0x23, 0xa4, 0x37, 0x32, 0x0f, 0xcb, 0xc7, 0xe9, 0xed, 0x35, 0x1a, 0xf5, 0x04, 0x68, + 0xe7, 0x91, 0x1a, 0xdf, 0xb2, 0xef, 0xd0, 0x6f, 0xf9, 0x17, 0x16, 0x20, 0x3e, 0x27, 0xd9, 0x67, + 0x9b, 0xf9, 0xe9, 0xa6, 0x99, 0x03, 0x52, 0xce, 0xa1, 0x20, 0x58, 0xc3, 0x7a, 0xc0, 0x43, 0xc8, + 0xdc, 0x87, 0x95, 0xf3, 0xef, 0xc3, 0x7a, 0x18, 0xf5, 0xef, 0x96, 0x21, 0xeb, 0x4a, 0x89, 0xde, + 0x81, 0x91, 0x86, 0xd3, 0x74, 0xee, 0x78, 0xbe, 0x97, 0x78, 0x24, 0x2e, 0x76, 0xe1, 0xbe, 0xac, + 0xd5, 0x10, 0xd7, 0x50, 0x5a, 0x09, 0x36, 0x28, 0xa2, 0x79, 0x80, 0x66, 0xe4, 0xed, 0x78, 0x3e, + 0xd9, 0x64, 0x1a, 0x0f, 0x8b, 0xc5, 0xe0, 0x77, 0xc7, 0xb2, 0x14, 0x6b, 0x18, 0x1d, 0x7c, 0xf7, + 0xcb, 0x27, 0xe1, 0xbb, 0xdf, 0xd7, 0xa3, 0xef, 0x7e, 0x7f, 0x21, 0xdf, 0x7d, 0x0c, 0xa7, 0xe5, + 0xe1, 0x4d, 0xff, 0xaf, 0x7a, 0x3e, 0x11, 0xb2, 0x1b, 0x8f, 0xd5, 0x98, 0xdd, 0xdf, 0x9b, 0x3b, + 0x8d, 0x3b, 0x62, 0xe0, 0x2e, 0x35, 0xed, 0x16, 0x4c, 0xd5, 0x49, 0xe4, 0xb1, 0x9c, 0x94, 0x6e, + 0xba, 0x97, 0x3e, 0x07, 0x95, 0x28, 0xb3, 0x8d, 0x7b, 0x0c, 0xc8, 0xd7, 0xb2, 0x98, 0xc9, 0x6d, + 0x9b, 0x92, 0xb4, 0xff, 0x46, 0x09, 0x06, 0x85, 0x13, 0xe5, 0x09, 0x08, 0x1f, 0x57, 0x0c, 0x13, + 0xd3, 0x33, 0x79, 0xfc, 0x8f, 0x75, 0xab, 0xab, 0x71, 0xa9, 0x9e, 0x31, 0x2e, 0x3d, 0x57, 0x8c, + 0xdc, 0xe1, 0x66, 0xa5, 0x7f, 0x5a, 0x86, 0x31, 0xd3, 0xa9, 0xf4, 0x04, 0xa6, 0xe5, 0x0d, 0x18, + 0x8c, 0x85, 0x7f, 0x73, 0xa9, 0x88, 0xcf, 0x5e, 0xf6, 0x13, 0xa7, 0x37, 0xf1, 0xc2, 0xa3, 0x59, + 0x92, 0xeb, 0xe8, 0x42, 0x5d, 0x3e, 0x11, 0x17, 0xea, 0x3c, 0x5f, 0xdf, 0xbe, 0x07, 0xe1, 0xeb, + 0x6b, 0xff, 0x80, 0xb1, 0x7c, 0xbd, 0xfc, 0x04, 0x8e, 0xf1, 0xd7, 0xcd, 0xc3, 0xe1, 0x7c, 0xa1, + 0x75, 0x27, 0xba, 0xd7, 0xe5, 0x38, 0xff, 0xae, 0x05, 0xc3, 0x02, 0xf1, 0x04, 0x06, 0xf0, 0x69, + 0x73, 0x00, 0x4f, 0x15, 0x1a, 0x40, 0x97, 0x9e, 0x7f, 0xa3, 0xa4, 0x7a, 0x5e, 0x13, 0x4f, 0xed, + 0xe7, 0x66, 0xe0, 0x1e, 0xa2, 0xaa, 0x5f, 0xd8, 0x08, 0x7d, 0x21, 0xc0, 0x3d, 0x96, 0x86, 0xe6, + 0xf1, 0xf2, 0x03, 0xed, 0x37, 0x56, 0xd8, 0x2c, 0x72, 0x2c, 0x8c, 0x12, 0x71, 0x80, 0x76, 0x7a, + 0xe8, 0xdf, 0x05, 0x48, 0x5f, 0x57, 0x17, 0x51, 0xad, 0xdd, 0x77, 0x6b, 0x2b, 0xf1, 0xfc, 0x79, + 0x2f, 0x48, 0xe2, 0x24, 0x9a, 0x5f, 0x0b, 0x92, 0x1b, 0x11, 0x17, 0xfa, 0xb5, 0x58, 0x3b, 0x45, + 0x0b, 0x6b, 0x74, 0x65, 0x10, 0x07, 0x6b, 0xa3, 0xdf, 0xbc, 0x41, 0xba, 0x2e, 0xca, 0xb1, 0xc2, + 0xb0, 0x5f, 0x61, 0x9c, 0x9d, 0x4d, 0x50, 0x6f, 0x61, 0x70, 0xbf, 0x38, 0xa0, 0xa6, 0x96, 0x99, + 0x85, 0xaf, 0xeb, 0xc1, 0x76, 0x45, 0xd9, 0x27, 0xed, 0x82, 0xee, 0x47, 0x9d, 0xc6, 0xe6, 0x21, + 0xd2, 0x76, 0xed, 0xf8, 0x4a, 0x61, 0x8e, 0xdc, 0xc3, 0x45, 0x23, 0x4b, 0x3a, 0xc8, 0x32, 0xad, + 0xad, 0xd5, 0xb2, 0x79, 0xd3, 0x97, 0x25, 0x00, 0xa7, 0x38, 0x68, 0x41, 0x28, 0x94, 0xdc, 0xe2, + 0xf2, 0xc1, 0x8c, 0x42, 0x29, 0xa7, 0x44, 0xd3, 0x28, 0x5f, 0x80, 0x61, 0xf5, 0x14, 0x4d, 0x8d, + 0x3f, 0x02, 0x52, 0xe1, 0xf2, 0xd5, 0x4a, 0x5a, 0x8c, 0x75, 0x1c, 0xb4, 0x06, 0x53, 0xae, 0x8a, + 0xd9, 0xa9, 0xb5, 0xee, 0xf8, 0x5e, 0x83, 0x56, 0xe5, 0xf1, 0xb6, 0x8f, 0xec, 0xef, 0xcd, 0x4d, + 0x55, 0xdb, 0xc1, 0xb8, 0x53, 0x1d, 0xb4, 0x0e, 0xe3, 0x31, 0x7f, 0x72, 0x47, 0x06, 0x66, 0x08, + 0x1b, 0xc4, 0xb3, 0xf2, 0xbe, 0xb3, 0x6e, 0x82, 0x0f, 0x58, 0x11, 0xe7, 0x0a, 0x32, 0x94, 0x23, + 0x4b, 0x02, 0xbd, 0x06, 0x63, 0xbe, 0xfe, 0x9e, 0x68, 0x4d, 0x98, 0x28, 0x94, 0x07, 0x9b, 0xf1, + 0xda, 0x68, 0x0d, 0x67, 0xb0, 0xd1, 0x1b, 0x30, 0xa3, 0x97, 0x88, 0x3c, 0x42, 0x4e, 0xb0, 0x49, + 0x62, 0xf1, 0x3c, 0xc7, 0x63, 0xfb, 0x7b, 0x73, 0x33, 0x57, 0xbb, 0xe0, 0xe0, 0xae, 0xb5, 0xd1, + 0x45, 0x18, 0x91, 0x33, 0xa9, 0x85, 0x31, 0xa5, 0xbe, 0x93, 0x1a, 0x0c, 0x1b, 0x98, 0xef, 0xef, + 0x5a, 0xf7, 0x0b, 0xb4, 0xb2, 0x76, 0x84, 0xa3, 0x77, 0x61, 0x44, 0xef, 0x63, 0xf6, 0x6c, 0xce, + 0x7f, 0xa3, 0x55, 0x88, 0x02, 0xaa, 0xe7, 0x3a, 0x0c, 0x1b, 0xb4, 0xed, 0x1b, 0x30, 0x50, 0xdf, + 0x8d, 0x1b, 0x89, 0x5f, 0x80, 0xbf, 0x3d, 0x69, 0x0c, 0x21, 0xdd, 0x7b, 0xec, 0xbd, 0x28, 0x31, + 0x22, 0x9b, 0xc0, 0xf8, 0xfa, 0x72, 0xad, 0x1e, 0x36, 0xee, 0x92, 0x64, 0x91, 0x6b, 0x6f, 0x58, + 0x70, 0x37, 0xeb, 0x88, 0x5c, 0xab, 0x03, 0x3f, 0xb4, 0xff, 0xd4, 0x82, 0x7e, 0xf6, 0xd6, 0x51, + 0xde, 0x3b, 0x59, 0x45, 0x3a, 0x8d, 0x5e, 0x86, 0x01, 0xb2, 0xb1, 0x41, 0x1a, 0x89, 0xd8, 0xc6, + 0x32, 0x56, 0x60, 0x60, 0x85, 0x95, 0xd2, 0xcd, 0xc9, 0x1a, 0xe3, 0x7f, 0xb1, 0x40, 0x46, 0x9f, + 0x85, 0x4a, 0xe2, 0x6d, 0x93, 0x45, 0xd7, 0x15, 0x06, 0xc5, 0xde, 0xdc, 0x57, 0x14, 0xb3, 0x58, + 0x97, 0x44, 0x70, 0x4a, 0xcf, 0xfe, 0x5a, 0x09, 0x20, 0x8d, 0xd4, 0xc9, 0x1b, 0xe6, 0x52, 0xdb, + 0x73, 0x60, 0x4f, 0x77, 0x78, 0x0e, 0x0c, 0xa5, 0x04, 0x3b, 0x3c, 0x06, 0xa6, 0xa6, 0xaa, 0x5c, + 0x68, 0xaa, 0xfa, 0x7a, 0x99, 0xaa, 0x65, 0x98, 0x4c, 0x23, 0x8d, 0xcc, 0x90, 0x4d, 0x96, 0x1c, + 0x74, 0x3d, 0x0b, 0xc4, 0xed, 0xf8, 0xf6, 0xd7, 0x2c, 0x10, 0x0e, 0x8f, 0x05, 0x56, 0xab, 0x2b, + 0x9f, 0xee, 0x31, 0xb2, 0x98, 0x3d, 0x5b, 0xc4, 0x17, 0x54, 0xe4, 0x2e, 0x53, 0xfb, 0xc7, 0xc8, + 0x58, 0x66, 0x50, 0xb5, 0x7f, 0xd3, 0x82, 0x61, 0x0e, 0xbe, 0xc6, 0x64, 0xea, 0xfc, 0x7e, 0xf5, + 0x94, 0x79, 0x96, 0xbd, 0x6a, 0x43, 0x09, 0xab, 0x0c, 0xa4, 0xfa, 0xab, 0x36, 0x12, 0x80, 0x53, + 0x1c, 0xf4, 0x0c, 0x0c, 0xc6, 0xad, 0x3b, 0x0c, 0x3d, 0xe3, 0xfd, 0x58, 0xe7, 0xc5, 0x58, 0xc2, + 0xed, 0x7f, 0x5e, 0x82, 0x89, 0xac, 0xf3, 0x2b, 0xc2, 0x30, 0xc0, 0x65, 0xec, 0xac, 0x78, 0x76, + 0x98, 0x2d, 0x47, 0x73, 0x9e, 0x05, 0xfe, 0x36, 0x33, 0x33, 0xba, 0x0b, 0x4a, 0x68, 0x03, 0x86, + 0xdd, 0xf0, 0x5e, 0x70, 0xcf, 0x89, 0xdc, 0xc5, 0xda, 0x9a, 0xf8, 0x12, 0x39, 0xee, 0x4a, 0xd5, + 0xb4, 0x82, 0xee, 0x9a, 0xcb, 0x6c, 0x0b, 0x29, 0x08, 0xeb, 0x84, 0xa9, 0x4e, 0xd9, 0x08, 0x83, + 0x0d, 0x6f, 0xf3, 0x9a, 0xd3, 0x2c, 0x76, 0x31, 0xbf, 0x2c, 0xd1, 0xb5, 0x36, 0x46, 0x45, 0x8e, + 0x06, 0x0e, 0xc0, 0x29, 0x49, 0xfb, 0xd7, 0xa7, 0xc1, 0x58, 0x0b, 0x46, 0x7a, 0x58, 0xeb, 0x81, + 0xa7, 0x87, 0x7d, 0x0b, 0x86, 0xc8, 0x76, 0x33, 0xd9, 0xad, 0x7a, 0x51, 0xb1, 0x64, 0xdf, 0x2b, + 0x02, 0xbb, 0x9d, 0xba, 0x84, 0x60, 0x45, 0xb1, 0x4b, 0xb2, 0xdf, 0xf2, 0x43, 0x91, 0xec, 0xb7, + 0xef, 0x2f, 0x25, 0xd9, 0xef, 0x1b, 0x30, 0xb8, 0xe9, 0x25, 0x98, 0x34, 0x43, 0x91, 0xf4, 0x22, + 0x67, 0xf1, 0x5c, 0xe2, 0xc8, 0xed, 0x69, 0x20, 0x05, 0x00, 0x4b, 0x72, 0x68, 0x5d, 0x6d, 0xaa, + 0x81, 0x22, 0x67, 0x79, 0xbb, 0xad, 0xaf, 0xe3, 0xb6, 0x12, 0xc9, 0x7d, 0x07, 0xdf, 0x7f, 0x72, + 0x5f, 0x95, 0x92, 0x77, 0xe8, 0x41, 0xa5, 0xe4, 0x35, 0x52, 0x1b, 0x57, 0x8e, 0x23, 0xb5, 0xf1, + 0xd7, 0x2c, 0x38, 0xd5, 0xec, 0x94, 0x18, 0x5c, 0x24, 0xd7, 0xfd, 0xe4, 0x11, 0x52, 0xa5, 0x1b, + 0x4d, 0xb3, 0x54, 0x02, 0x1d, 0xd1, 0x70, 0xe7, 0x86, 0x65, 0x8e, 0xe4, 0xe1, 0xf7, 0x9f, 0x23, + 0xf9, 0xb8, 0xb3, 0xf0, 0xa6, 0x19, 0x93, 0x47, 0x8f, 0x25, 0x63, 0xf2, 0xd8, 0x03, 0xcc, 0x98, + 0xac, 0xe5, 0x3a, 0x1e, 0x7f, 0xb0, 0xb9, 0x8e, 0xb7, 0xcc, 0x73, 0x89, 0xa7, 0xd6, 0x7d, 0xb9, + 0xf0, 0xb9, 0x64, 0xb4, 0x70, 0xf8, 0xc9, 0xc4, 0xb3, 0x3e, 0x4f, 0xbe, 0xcf, 0xac, 0xcf, 0x46, + 0xee, 0x64, 0x74, 0x1c, 0xb9, 0x93, 0xdf, 0xd1, 0x4f, 0xd0, 0xa9, 0x22, 0x2d, 0xa8, 0x83, 0xb2, + 0xbd, 0x85, 0x4e, 0x67, 0x68, 0x7b, 0x76, 0xe6, 0xe9, 0x93, 0xce, 0xce, 0x7c, 0xea, 0x18, 0xb3, + 0x33, 0x9f, 0x3e, 0xd1, 0xec, 0xcc, 0x8f, 0x3c, 0x24, 0xd9, 0x99, 0x67, 0x4e, 0x2a, 0x3b, 0xf3, + 0xa3, 0x0f, 0x34, 0x3b, 0x33, 0xfd, 0x74, 0x4d, 0x19, 0x42, 0x36, 0x33, 0x5b, 0xe4, 0xd3, 0x75, + 0x8c, 0x38, 0xe3, 0x9f, 0x4e, 0x81, 0x70, 0x4a, 0xd4, 0xfe, 0x2b, 0x70, 0xe6, 0xf0, 0xa5, 0x9b, + 0x7a, 0x6b, 0xd4, 0x52, 0x9b, 0x59, 0xc6, 0x5b, 0x83, 0x89, 0x85, 0x1a, 0x56, 0xe1, 0xf4, 0xb1, + 0xdf, 0xb6, 0xe0, 0x91, 0x2e, 0xd9, 0x15, 0x0b, 0xc7, 0x5f, 0x36, 0x61, 0xbc, 0x69, 0x56, 0x2d, + 0x1c, 0xce, 0x6d, 0x64, 0x73, 0x54, 0x3e, 0xf2, 0x19, 0x00, 0xce, 0x92, 0x5f, 0xfa, 0xd0, 0x0f, + 0x7f, 0x7c, 0xe6, 0x03, 0x3f, 0xfa, 0xf1, 0x99, 0x0f, 0xfc, 0xf1, 0x8f, 0xcf, 0x7c, 0xe0, 0xe7, + 0xf6, 0xcf, 0x58, 0x3f, 0xdc, 0x3f, 0x63, 0xfd, 0x68, 0xff, 0x8c, 0xf5, 0x67, 0xfb, 0x67, 0xac, + 0xaf, 0xfd, 0xe4, 0xcc, 0x07, 0xde, 0x2c, 0xed, 0xbc, 0xf0, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, + 0x5f, 0x32, 0x87, 0xa4, 0xbe, 0xc8, 0x00, 0x00, } diff --git a/pkg/api/v1/generated.proto b/pkg/api/v1/generated.proto index cc52ea4c9c4..6fa50557c88 100644 --- a/pkg/api/v1/generated.proto +++ b/pkg/api/v1/generated.proto @@ -2140,6 +2140,10 @@ message PersistentVolumeSource { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional optional PortworxVolumeSource portworxVolume = 18; + + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + optional ScaleIOVolumeSource scaleIO = 19; } // PersistentVolumeSpec is the specification of a persistent volume. @@ -3210,6 +3214,50 @@ message SELinuxOptions { optional string level = 4; } +// ScaleIOVolumeSource represents a persistent ScaleIO volume +message ScaleIOVolumeSource { + // The host address of the ScaleIO API Gateway. + optional string gateway = 1; + + // The name of the storage system as configured in ScaleIO. + optional string system = 2; + + // SecretRef references to the secret for ScaleIO user and other + // sensitive information. If this is not provided, Login operation will fail. + optional LocalObjectReference secretRef = 3; + + // Flag to enable/disable SSL communication with Gateway, default false + // +optional + optional bool sslEnabled = 4; + + // The name of the Protection Domain for the configured storage (defaults to "default"). + // +optional + optional string protectionDomain = 5; + + // The Storage Pool associated with the protection domain (defaults to "default"). + // +optional + optional string storagePool = 6; + + // Indicates whether the storage for a volume should be thick or thin (defaults to "thin"). + // +optional + optional string storageMode = 7; + + // The name of a volume already created in the ScaleIO system + // that is associated with this volume source. + optional string volumeName = 8; + + // Filesystem type to mount. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // +optional + optional string fsType = 9; + + // Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + optional bool readOnly = 10; +} + // Secret holds secret data of a certain type. The total bytes of the values in // the Data field must be less than MaxSecretSize bytes. message Secret { @@ -3840,11 +3888,15 @@ message VolumeSource { optional PhotonPersistentDiskVolumeSource photonPersistentDisk = 23; // Items for all in one resources secrets, configmaps, and downward API - optional ProjectedVolumeSource projected = 25; + optional ProjectedVolumeSource projected = 26; // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional optional PortworxVolumeSource portworxVolume = 24; + + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + optional ScaleIOVolumeSource scaleIO = 25; } // Represents a vSphere volume resource. diff --git a/pkg/api/v1/pod/util.go b/pkg/api/v1/pod/util.go index 172ef5185e6..4e091f6f34a 100644 --- a/pkg/api/v1/pod/util.go +++ b/pkg/api/v1/pod/util.go @@ -172,6 +172,11 @@ func VisitPodSecretNames(pod *v1.Pod, visitor func(string) bool) bool { if !visitor(source.Secret.SecretName) { return false } + case source.ScaleIO != nil: + if source.ScaleIO.SecretRef != nil && !visitor(source.ScaleIO.SecretRef.Name) { + return false + } + } } return true diff --git a/pkg/api/v1/pod/util_test.go b/pkg/api/v1/pod/util_test.go index 7599f5ca42b..7227efa72ee 100644 --- a/pkg/api/v1/pod/util_test.go +++ b/pkg/api/v1/pod/util_test.go @@ -249,7 +249,11 @@ func TestPodSecrets(t *testing.T) { SecretName: "Spec.Volumes[*].VolumeSource.Secret.SecretName"}}}, { VolumeSource: v1.VolumeSource{ Secret: &v1.SecretVolumeSource{ - SecretName: "Spec.Volumes[*].VolumeSource.Secret"}}}}, + SecretName: "Spec.Volumes[*].VolumeSource.Secret"}}}, { + VolumeSource: v1.VolumeSource{ + ScaleIO: &v1.ScaleIOVolumeSource{ + SecretRef: &v1.LocalObjectReference{ + Name: "Spec.Volumes[*].VolumeSource.ScaleIO.SecretRef"}}}}}, }, } extractedNames := sets.NewString() @@ -277,6 +281,7 @@ func TestPodSecrets(t *testing.T) { "Spec.Volumes[*].VolumeSource.RBD.SecretRef", "Spec.Volumes[*].VolumeSource.Secret", "Spec.Volumes[*].VolumeSource.Secret.SecretName", + "Spec.Volumes[*].VolumeSource.ScaleIO.SecretRef", ) secretPaths := collectSecretPaths(t, nil, "", reflect.TypeOf(&v1.Pod{})) secretPaths = secretPaths.Difference(excludedSecretPaths) diff --git a/pkg/api/v1/types.generated.go b/pkg/api/v1/types.generated.go index 6fbb85a603e..8eefc7c906c 100644 --- a/pkg/api/v1/types.generated.go +++ b/pkg/api/v1/types.generated.go @@ -1222,7 +1222,7 @@ func (x *Volume) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [26]bool + var yyq2 [27]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[1] = x.VolumeSource.HostPath != nil && x.HostPath != nil @@ -1250,9 +1250,10 @@ func (x *Volume) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[23] = x.VolumeSource.PhotonPersistentDisk != nil && x.PhotonPersistentDisk != nil yyq2[24] = x.VolumeSource.Projected != nil && x.Projected != nil yyq2[25] = x.VolumeSource.PortworxVolume != nil && x.PortworxVolume != nil + yyq2[26] = x.VolumeSource.ScaleIO != nil && x.ScaleIO != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(26) + r.EncodeArrayStart(27) } else { yynn2 = 1 for _, b := range yyq2 { @@ -2207,6 +2208,43 @@ func (x *Volume) CodecEncodeSelf(e *codec1978.Encoder) { } } } + var yyn81 bool + if x.VolumeSource.ScaleIO == nil { + yyn81 = true + goto LABEL81 + } + LABEL81: + if yyr2 || yy2arr2 { + if yyn81 { + r.EncodeNil() + } else { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[26] { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } + } else { + if yyq2[26] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("scaleIO")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if yyn81 { + r.EncodeNil() + } else { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -2630,6 +2668,20 @@ func (x *Volume) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } x.PortworxVolume.CodecDecodeSelf(d) } + case "scaleIO": + if x.VolumeSource.ScaleIO == nil { + x.VolumeSource.ScaleIO = new(ScaleIOVolumeSource) + } + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -2641,16 +2693,16 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj31 int - var yyb31 bool - var yyhl31 bool = l >= 0 - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + var yyj32 int + var yyb32 bool + var yyhl32 bool = l >= 0 + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2658,24 +2710,24 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Name = "" } else { - yyv32 := &x.Name - yym33 := z.DecBinary() - _ = yym33 + yyv33 := &x.Name + yym34 := z.DecBinary() + _ = yym34 if false { } else { - *((*string)(yyv32)) = r.DecodeString() + *((*string)(yyv33)) = r.DecodeString() } } if x.VolumeSource.HostPath == nil { x.VolumeSource.HostPath = new(HostPathVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2693,13 +2745,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.EmptyDir == nil { x.VolumeSource.EmptyDir = new(EmptyDirVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2717,13 +2769,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.GCEPersistentDisk == nil { x.VolumeSource.GCEPersistentDisk = new(GCEPersistentDiskVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2741,13 +2793,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.AWSElasticBlockStore == nil { x.VolumeSource.AWSElasticBlockStore = new(AWSElasticBlockStoreVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2765,13 +2817,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.GitRepo == nil { x.VolumeSource.GitRepo = new(GitRepoVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2789,13 +2841,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Secret == nil { x.VolumeSource.Secret = new(SecretVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2813,13 +2865,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.NFS == nil { x.VolumeSource.NFS = new(NFSVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2837,13 +2889,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.ISCSI == nil { x.VolumeSource.ISCSI = new(ISCSIVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2861,13 +2913,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Glusterfs == nil { x.VolumeSource.Glusterfs = new(GlusterfsVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2885,13 +2937,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.PersistentVolumeClaim == nil { x.VolumeSource.PersistentVolumeClaim = new(PersistentVolumeClaimVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2909,13 +2961,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.RBD == nil { x.VolumeSource.RBD = new(RBDVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2933,13 +2985,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.FlexVolume == nil { x.VolumeSource.FlexVolume = new(FlexVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2957,13 +3009,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Cinder == nil { x.VolumeSource.Cinder = new(CinderVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2981,13 +3033,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.CephFS == nil { x.VolumeSource.CephFS = new(CephFSVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3005,13 +3057,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Flocker == nil { x.VolumeSource.Flocker = new(FlockerVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3029,13 +3081,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.DownwardAPI == nil { x.VolumeSource.DownwardAPI = new(DownwardAPIVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3053,13 +3105,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.FC == nil { x.VolumeSource.FC = new(FCVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3077,13 +3129,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.AzureFile == nil { x.VolumeSource.AzureFile = new(AzureFileVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3101,13 +3153,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.ConfigMap == nil { x.VolumeSource.ConfigMap = new(ConfigMapVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3125,13 +3177,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.VsphereVolume == nil { x.VolumeSource.VsphereVolume = new(VsphereVirtualDiskVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3149,13 +3201,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Quobyte == nil { x.VolumeSource.Quobyte = new(QuobyteVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3173,13 +3225,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.AzureDisk == nil { x.VolumeSource.AzureDisk = new(AzureDiskVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3197,13 +3249,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.PhotonPersistentDisk == nil { x.VolumeSource.PhotonPersistentDisk = new(PhotonPersistentDiskVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3221,13 +3273,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Projected == nil { x.VolumeSource.Projected = new(ProjectedVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3245,13 +3297,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.PortworxVolume == nil { x.VolumeSource.PortworxVolume = new(PortworxVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3266,18 +3318,42 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PortworxVolume.CodecDecodeSelf(d) } - for { - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l - } else { - yyb31 = r.CheckBreak() + if x.VolumeSource.ScaleIO == nil { + x.VolumeSource.ScaleIO = new(ScaleIOVolumeSource) + } + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l + } else { + yyb32 = r.CheckBreak() + } + if yyb32 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil } - if yyb31 { + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } + for { + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l + } else { + yyb32 = r.CheckBreak() + } + if yyb32 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj31-1, "") + z.DecStructFieldNotFound(yyj32-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -3296,7 +3372,7 @@ func (x *VolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [25]bool + var yyq2 [26]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.HostPath != nil @@ -3324,9 +3400,10 @@ func (x *VolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[22] = x.PhotonPersistentDisk != nil yyq2[23] = x.Projected != nil yyq2[24] = x.PortworxVolume != nil + yyq2[25] = x.ScaleIO != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(25) + r.EncodeArrayStart(26) } else { yynn2 = 0 for _, b := range yyq2 { @@ -3912,6 +3989,29 @@ func (x *VolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[25] { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[25] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("scaleIO")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -4248,6 +4348,17 @@ func (x *VolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } x.PortworxVolume.CodecDecodeSelf(d) } + case "scaleIO": + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -4259,16 +4370,16 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj29 int - var yyb29 bool - var yyhl29 bool = l >= 0 - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + var yyj30 int + var yyb30 bool + var yyhl30 bool = l >= 0 + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4283,13 +4394,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.HostPath.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4304,13 +4415,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.EmptyDir.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4325,13 +4436,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.GCEPersistentDisk.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4346,13 +4457,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.AWSElasticBlockStore.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4367,13 +4478,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.GitRepo.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4388,13 +4499,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Secret.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4409,13 +4520,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.NFS.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4430,13 +4541,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.ISCSI.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4451,13 +4562,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Glusterfs.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4472,13 +4583,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PersistentVolumeClaim.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4493,13 +4604,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.RBD.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4514,13 +4625,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.FlexVolume.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4535,13 +4646,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Cinder.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4556,13 +4667,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.CephFS.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4577,13 +4688,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Flocker.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4598,13 +4709,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.DownwardAPI.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4619,13 +4730,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.FC.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4640,13 +4751,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.AzureFile.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4661,13 +4772,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.ConfigMap.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4682,13 +4793,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.VsphereVolume.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4703,13 +4814,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Quobyte.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4724,13 +4835,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.AzureDisk.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4745,13 +4856,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PhotonPersistentDisk.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4766,13 +4877,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Projected.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4787,18 +4898,39 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PortworxVolume.CodecDecodeSelf(d) } - for { - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l - } else { - yyb29 = r.CheckBreak() + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil } - if yyb29 { + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } + for { + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj29-1, "") + z.DecStructFieldNotFound(yyj30-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -5051,7 +5183,7 @@ func (x *PersistentVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [18]bool + var yyq2 [19]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.GCEPersistentDisk != nil @@ -5072,9 +5204,10 @@ func (x *PersistentVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[15] = x.AzureDisk != nil yyq2[16] = x.PhotonPersistentDisk != nil yyq2[17] = x.PortworxVolume != nil + yyq2[18] = x.ScaleIO != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(18) + r.EncodeArrayStart(19) } else { yynn2 = 0 for _, b := range yyq2 { @@ -5499,6 +5632,29 @@ func (x *PersistentVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[18] { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[18] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("scaleIO")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -5758,6 +5914,17 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Deco } x.PortworxVolume.CodecDecodeSelf(d) } + case "scaleIO": + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -5769,16 +5936,16 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj22 int - var yyb22 bool - var yyhl22 bool = l >= 0 - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + var yyj23 int + var yyb23 bool + var yyhl23 bool = l >= 0 + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5793,13 +5960,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.GCEPersistentDisk.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5814,13 +5981,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.AWSElasticBlockStore.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5835,13 +6002,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.HostPath.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5856,13 +6023,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.Glusterfs.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5877,13 +6044,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.NFS.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5898,13 +6065,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.RBD.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5919,13 +6086,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.ISCSI.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5940,13 +6107,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.Cinder.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5961,13 +6128,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.CephFS.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5982,13 +6149,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.FC.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6003,13 +6170,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.Flocker.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6024,13 +6191,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.FlexVolume.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6045,13 +6212,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.AzureFile.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6066,13 +6233,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.VsphereVolume.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6087,13 +6254,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.Quobyte.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6108,13 +6275,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.AzureDisk.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6129,13 +6296,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.PhotonPersistentDisk.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6150,18 +6317,39 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.PortworxVolume.CodecDecodeSelf(d) } - for { - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil } - if yyb22 { + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } + for { + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj22-1, "") + z.DecStructFieldNotFound(yyj23-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -6571,7 +6759,7 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [23]bool + var yyq2 [24]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = len(x.Capacity) != 0 @@ -6593,13 +6781,14 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[16] = x.PersistentVolumeSource.AzureDisk != nil && x.AzureDisk != nil yyq2[17] = x.PersistentVolumeSource.PhotonPersistentDisk != nil && x.PhotonPersistentDisk != nil yyq2[18] = x.PersistentVolumeSource.PortworxVolume != nil && x.PortworxVolume != nil - yyq2[19] = len(x.AccessModes) != 0 - yyq2[20] = x.ClaimRef != nil - yyq2[21] = x.PersistentVolumeReclaimPolicy != "" - yyq2[22] = x.StorageClassName != "" + yyq2[19] = x.PersistentVolumeSource.ScaleIO != nil && x.ScaleIO != nil + yyq2[20] = len(x.AccessModes) != 0 + yyq2[21] = x.ClaimRef != nil + yyq2[22] = x.PersistentVolumeReclaimPolicy != "" + yyq2[23] = x.StorageClassName != "" var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(23) + r.EncodeArrayStart(24) } else { yynn2 = 0 for _, b := range yyq2 { @@ -7299,14 +7488,51 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } } } + var yyn60 bool + if x.PersistentVolumeSource.ScaleIO == nil { + yyn60 = true + goto LABEL60 + } + LABEL60: + if yyr2 || yy2arr2 { + if yyn60 { + r.EncodeNil() + } else { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[19] { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } + } else { + if yyq2[19] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("scaleIO")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if yyn60 { + r.EncodeNil() + } else { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[19] { + if yyq2[20] { if x.AccessModes == nil { r.EncodeNil() } else { - yym61 := z.EncBinary() - _ = yym61 + yym64 := z.EncBinary() + _ = yym64 if false { } else { h.encSlicePersistentVolumeAccessMode(([]PersistentVolumeAccessMode)(x.AccessModes), e) @@ -7316,15 +7542,15 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { r.EncodeNil() } } else { - if yyq2[19] { + if yyq2[20] { z.EncSendContainerState(codecSelfer_containerMapKey1234) r.EncodeString(codecSelferC_UTF81234, string("accessModes")) z.EncSendContainerState(codecSelfer_containerMapValue1234) if x.AccessModes == nil { r.EncodeNil() } else { - yym62 := z.EncBinary() - _ = yym62 + yym65 := z.EncBinary() + _ = yym65 if false { } else { h.encSlicePersistentVolumeAccessMode(([]PersistentVolumeAccessMode)(x.AccessModes), e) @@ -7334,7 +7560,7 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[20] { + if yyq2[21] { if x.ClaimRef == nil { r.EncodeNil() } else { @@ -7344,7 +7570,7 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { r.EncodeNil() } } else { - if yyq2[20] { + if yyq2[21] { z.EncSendContainerState(codecSelfer_containerMapKey1234) r.EncodeString(codecSelferC_UTF81234, string("claimRef")) z.EncSendContainerState(codecSelfer_containerMapValue1234) @@ -7357,13 +7583,13 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[21] { + if yyq2[22] { x.PersistentVolumeReclaimPolicy.CodecEncodeSelf(e) } else { r.EncodeString(codecSelferC_UTF81234, "") } } else { - if yyq2[21] { + if yyq2[22] { z.EncSendContainerState(codecSelfer_containerMapKey1234) r.EncodeString(codecSelferC_UTF81234, string("persistentVolumeReclaimPolicy")) z.EncSendContainerState(codecSelfer_containerMapValue1234) @@ -7372,9 +7598,9 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[22] { - yym70 := z.EncBinary() - _ = yym70 + if yyq2[23] { + yym73 := z.EncBinary() + _ = yym73 if false { } else { r.EncodeString(codecSelferC_UTF81234, string(x.StorageClassName)) @@ -7383,12 +7609,12 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { r.EncodeString(codecSelferC_UTF81234, "") } } else { - if yyq2[22] { + if yyq2[23] { z.EncSendContainerState(codecSelfer_containerMapKey1234) r.EncodeString(codecSelferC_UTF81234, string("storageClassName")) z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym71 := z.EncBinary() - _ = yym71 + yym74 := z.EncBinary() + _ = yym74 if false { } else { r.EncodeString(codecSelferC_UTF81234, string(x.StorageClassName)) @@ -7715,16 +7941,30 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decode } x.PortworxVolume.CodecDecodeSelf(d) } + case "scaleIO": + if x.PersistentVolumeSource.ScaleIO == nil { + x.PersistentVolumeSource.ScaleIO = new(ScaleIOVolumeSource) + } + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } case "accessModes": if r.TryDecodeAsNil() { x.AccessModes = nil } else { - yyv23 := &x.AccessModes - yym24 := z.DecBinary() - _ = yym24 + yyv24 := &x.AccessModes + yym25 := z.DecBinary() + _ = yym25 if false { } else { - h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv23), d) + h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv24), d) } } case "claimRef": @@ -7742,19 +7982,19 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decode if r.TryDecodeAsNil() { x.PersistentVolumeReclaimPolicy = "" } else { - yyv26 := &x.PersistentVolumeReclaimPolicy - yyv26.CodecDecodeSelf(d) + yyv27 := &x.PersistentVolumeReclaimPolicy + yyv27.CodecDecodeSelf(d) } case "storageClassName": if r.TryDecodeAsNil() { x.StorageClassName = "" } else { - yyv27 := &x.StorageClassName - yym28 := z.DecBinary() - _ = yym28 + yyv28 := &x.StorageClassName + yym29 := z.DecBinary() + _ = yym29 if false { } else { - *((*string)(yyv27)) = r.DecodeString() + *((*string)(yyv28)) = r.DecodeString() } } default: @@ -7768,16 +8008,16 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj29 int - var yyb29 bool - var yyhl29 bool = l >= 0 - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + var yyj30 int + var yyb30 bool + var yyhl30 bool = l >= 0 + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7785,19 +8025,19 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if r.TryDecodeAsNil() { x.Capacity = nil } else { - yyv30 := &x.Capacity - yyv30.CodecDecodeSelf(d) + yyv31 := &x.Capacity + yyv31.CodecDecodeSelf(d) } if x.PersistentVolumeSource.GCEPersistentDisk == nil { x.PersistentVolumeSource.GCEPersistentDisk = new(GCEPersistentDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7815,13 +8055,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.AWSElasticBlockStore == nil { x.PersistentVolumeSource.AWSElasticBlockStore = new(AWSElasticBlockStoreVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7839,13 +8079,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.HostPath == nil { x.PersistentVolumeSource.HostPath = new(HostPathVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7863,13 +8103,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.Glusterfs == nil { x.PersistentVolumeSource.Glusterfs = new(GlusterfsVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7887,13 +8127,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.NFS == nil { x.PersistentVolumeSource.NFS = new(NFSVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7911,13 +8151,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.RBD == nil { x.PersistentVolumeSource.RBD = new(RBDVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7935,13 +8175,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.ISCSI == nil { x.PersistentVolumeSource.ISCSI = new(ISCSIVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7959,13 +8199,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.Cinder == nil { x.PersistentVolumeSource.Cinder = new(CinderVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7983,13 +8223,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.CephFS == nil { x.PersistentVolumeSource.CephFS = new(CephFSVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8007,13 +8247,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.FC == nil { x.PersistentVolumeSource.FC = new(FCVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8031,13 +8271,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.Flocker == nil { x.PersistentVolumeSource.Flocker = new(FlockerVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8055,13 +8295,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.FlexVolume == nil { x.PersistentVolumeSource.FlexVolume = new(FlexVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8079,13 +8319,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.AzureFile == nil { x.PersistentVolumeSource.AzureFile = new(AzureFileVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8103,13 +8343,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.VsphereVolume == nil { x.PersistentVolumeSource.VsphereVolume = new(VsphereVirtualDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8127,13 +8367,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.Quobyte == nil { x.PersistentVolumeSource.Quobyte = new(QuobyteVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8151,13 +8391,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.AzureDisk == nil { x.PersistentVolumeSource.AzureDisk = new(AzureDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8175,13 +8415,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.PhotonPersistentDisk == nil { x.PersistentVolumeSource.PhotonPersistentDisk = new(PhotonPersistentDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8199,13 +8439,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.PortworxVolume == nil { x.PersistentVolumeSource.PortworxVolume = new(PortworxVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8220,13 +8460,37 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco } x.PortworxVolume.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l - } else { - yyb29 = r.CheckBreak() + if x.PersistentVolumeSource.ScaleIO == nil { + x.PersistentVolumeSource.ScaleIO = new(ScaleIOVolumeSource) } - if yyb29 { + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8234,21 +8498,21 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if r.TryDecodeAsNil() { x.AccessModes = nil } else { - yyv49 := &x.AccessModes - yym50 := z.DecBinary() - _ = yym50 + yyv51 := &x.AccessModes + yym52 := z.DecBinary() + _ = yym52 if false { } else { - h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv49), d) + h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv51), d) } } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8263,13 +8527,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco } x.ClaimRef.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8277,16 +8541,16 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if r.TryDecodeAsNil() { x.PersistentVolumeReclaimPolicy = "" } else { - yyv52 := &x.PersistentVolumeReclaimPolicy - yyv52.CodecDecodeSelf(d) + yyv54 := &x.PersistentVolumeReclaimPolicy + yyv54.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8294,26 +8558,26 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if r.TryDecodeAsNil() { x.StorageClassName = "" } else { - yyv53 := &x.StorageClassName - yym54 := z.DecBinary() - _ = yym54 + yyv55 := &x.StorageClassName + yym56 := z.DecBinary() + _ = yym56 if false { } else { - *((*string)(yyv53)) = r.DecodeString() + *((*string)(yyv55)) = r.DecodeString() } } for { - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj29-1, "") + z.DecStructFieldNotFound(yyj30-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -18097,6 +18361,702 @@ func (x *PortworxVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Deco z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x *ScaleIOVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [10]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[3] = x.SSLEnabled != false + yyq2[4] = x.ProtectionDomain != "" + yyq2[5] = x.StoragePool != "" + yyq2[6] = x.StorageMode != "" + yyq2[7] = x.VolumeName != "" + yyq2[8] = x.FSType != "" + yyq2[9] = x.ReadOnly != false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(10) + } else { + yynn2 = 3 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Gateway)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("gateway")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Gateway)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.System)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("system")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.System)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.SecretRef == nil { + r.EncodeNil() + } else { + x.SecretRef.CodecEncodeSelf(e) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("secretRef")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.SecretRef == nil { + r.EncodeNil() + } else { + x.SecretRef.CodecEncodeSelf(e) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[3] { + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeBool(bool(x.SSLEnabled)) + } + } else { + r.EncodeBool(false) + } + } else { + if yyq2[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("sslEnabled")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + r.EncodeBool(bool(x.SSLEnabled)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[4] { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.ProtectionDomain)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[4] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("protectionDomain")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym17 := z.EncBinary() + _ = yym17 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.ProtectionDomain)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[5] { + yym19 := z.EncBinary() + _ = yym19 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StoragePool)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[5] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("storagePool")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym20 := z.EncBinary() + _ = yym20 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StoragePool)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[6] { + yym22 := z.EncBinary() + _ = yym22 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StorageMode)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[6] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("storageMode")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym23 := z.EncBinary() + _ = yym23 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StorageMode)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[7] { + yym25 := z.EncBinary() + _ = yym25 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[7] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("volumeName")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym26 := z.EncBinary() + _ = yym26 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[8] { + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.FSType)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[8] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("fsType")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym29 := z.EncBinary() + _ = yym29 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.FSType)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[9] { + yym31 := z.EncBinary() + _ = yym31 + if false { + } else { + r.EncodeBool(bool(x.ReadOnly)) + } + } else { + r.EncodeBool(false) + } + } else { + if yyq2[9] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("readOnly")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym32 := z.EncBinary() + _ = yym32 + if false { + } else { + r.EncodeBool(bool(x.ReadOnly)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *ScaleIOVolumeSource) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *ScaleIOVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "gateway": + if r.TryDecodeAsNil() { + x.Gateway = "" + } else { + yyv4 := &x.Gateway + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "system": + if r.TryDecodeAsNil() { + x.System = "" + } else { + yyv6 := &x.System + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "secretRef": + if r.TryDecodeAsNil() { + if x.SecretRef != nil { + x.SecretRef = nil + } + } else { + if x.SecretRef == nil { + x.SecretRef = new(LocalObjectReference) + } + x.SecretRef.CodecDecodeSelf(d) + } + case "sslEnabled": + if r.TryDecodeAsNil() { + x.SSLEnabled = false + } else { + yyv9 := &x.SSLEnabled + yym10 := z.DecBinary() + _ = yym10 + if false { + } else { + *((*bool)(yyv9)) = r.DecodeBool() + } + } + case "protectionDomain": + if r.TryDecodeAsNil() { + x.ProtectionDomain = "" + } else { + yyv11 := &x.ProtectionDomain + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*string)(yyv11)) = r.DecodeString() + } + } + case "storagePool": + if r.TryDecodeAsNil() { + x.StoragePool = "" + } else { + yyv13 := &x.StoragePool + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + case "storageMode": + if r.TryDecodeAsNil() { + x.StorageMode = "" + } else { + yyv15 := &x.StorageMode + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + case "volumeName": + if r.TryDecodeAsNil() { + x.VolumeName = "" + } else { + yyv17 := &x.VolumeName + yym18 := z.DecBinary() + _ = yym18 + if false { + } else { + *((*string)(yyv17)) = r.DecodeString() + } + } + case "fsType": + if r.TryDecodeAsNil() { + x.FSType = "" + } else { + yyv19 := &x.FSType + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + *((*string)(yyv19)) = r.DecodeString() + } + } + case "readOnly": + if r.TryDecodeAsNil() { + x.ReadOnly = false + } else { + yyv21 := &x.ReadOnly + yym22 := z.DecBinary() + _ = yym22 + if false { + } else { + *((*bool)(yyv21)) = r.DecodeBool() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *ScaleIOVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj23 int + var yyb23 bool + var yyhl23 bool = l >= 0 + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Gateway = "" + } else { + yyv24 := &x.Gateway + yym25 := z.DecBinary() + _ = yym25 + if false { + } else { + *((*string)(yyv24)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.System = "" + } else { + yyv26 := &x.System + yym27 := z.DecBinary() + _ = yym27 + if false { + } else { + *((*string)(yyv26)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.SecretRef != nil { + x.SecretRef = nil + } + } else { + if x.SecretRef == nil { + x.SecretRef = new(LocalObjectReference) + } + x.SecretRef.CodecDecodeSelf(d) + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.SSLEnabled = false + } else { + yyv29 := &x.SSLEnabled + yym30 := z.DecBinary() + _ = yym30 + if false { + } else { + *((*bool)(yyv29)) = r.DecodeBool() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ProtectionDomain = "" + } else { + yyv31 := &x.ProtectionDomain + yym32 := z.DecBinary() + _ = yym32 + if false { + } else { + *((*string)(yyv31)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.StoragePool = "" + } else { + yyv33 := &x.StoragePool + yym34 := z.DecBinary() + _ = yym34 + if false { + } else { + *((*string)(yyv33)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.StorageMode = "" + } else { + yyv35 := &x.StorageMode + yym36 := z.DecBinary() + _ = yym36 + if false { + } else { + *((*string)(yyv35)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.VolumeName = "" + } else { + yyv37 := &x.VolumeName + yym38 := z.DecBinary() + _ = yym38 + if false { + } else { + *((*string)(yyv37)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.FSType = "" + } else { + yyv39 := &x.FSType + yym40 := z.DecBinary() + _ = yym40 + if false { + } else { + *((*string)(yyv39)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ReadOnly = false + } else { + yyv41 := &x.ReadOnly + yym42 := z.DecBinary() + _ = yym42 + if false { + } else { + *((*bool)(yyv41)) = r.DecodeBool() + } + } + for { + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj23-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x *ConfigMapVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -66063,7 +67023,7 @@ func (x codecSelfer1234) decSlicePersistentVolume(v *[]PersistentVolume, d *code yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 520) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 528) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] @@ -67842,7 +68802,7 @@ func (x codecSelfer1234) decSliceVolume(v *[]Volume, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 216) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 224) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/api/v1/types.go b/pkg/api/v1/types.go index acbb1dfe1f2..12adc933495 100644 --- a/pkg/api/v1/types.go +++ b/pkg/api/v1/types.go @@ -331,6 +331,9 @@ type VolumeSource struct { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional PortworxVolume *PortworxVolumeSource `json:"portworxVolume,omitempty" protobuf:"bytes,24,opt,name=portworxVolume"` + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + ScaleIO *ScaleIOVolumeSource `json:"scaleIO,omitempty" protobuf:"bytes,25,opt,name=scaleIO"` } // PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. @@ -419,6 +422,9 @@ type PersistentVolumeSource struct { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional PortworxVolume *PortworxVolumeSource `json:"portworxVolume,omitempty" protobuf:"bytes,18,opt,name=portworxVolume"` + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + ScaleIO *ScaleIOVolumeSource `json:"scaleIO,omitempty" protobuf:"bytes,19,opt,name=scaleIO"` } const ( @@ -1138,6 +1144,41 @@ type PortworxVolumeSource struct { ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,3,opt,name=readOnly"` } +// ScaleIOVolumeSource represents a persistent ScaleIO volume +type ScaleIOVolumeSource struct { + // The host address of the ScaleIO API Gateway. + Gateway string `json:"gateway" protobuf:"bytes,1,opt,name=gateway"` + // The name of the storage system as configured in ScaleIO. + System string `json:"system" protobuf:"bytes,2,opt,name=system"` + // SecretRef references to the secret for ScaleIO user and other + // sensitive information. If this is not provided, Login operation will fail. + SecretRef *LocalObjectReference `json:"secretRef" protobuf:"bytes,3,opt,name=secretRef"` + // Flag to enable/disable SSL communication with Gateway, default false + // +optional + SSLEnabled bool `json:"sslEnabled,omitempty" protobuf:"varint,4,opt,name=sslEnabled"` + // The name of the Protection Domain for the configured storage (defaults to "default"). + // +optional + ProtectionDomain string `json:"protectionDomain,omitempty" protobuf:"bytes,5,opt,name=protectionDomain"` + // The Storage Pool associated with the protection domain (defaults to "default"). + // +optional + StoragePool string `json:"storagePool,omitempty" protobuf:"bytes,6,opt,name=storagePool"` + // Indicates whether the storage for a volume should be thick or thin (defaults to "thin"). + // +optional + StorageMode string `json:"storageMode,omitempty" protobuf:"bytes,7,opt,name=storageMode"` + // The name of a volume already created in the ScaleIO system + // that is associated with this volume source. + VolumeName string `json:"volumeName,omitempty" protobuf:"bytes,8,opt,name=volumeName"` + // Filesystem type to mount. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // +optional + FSType string `json:"fsType,omitempty" protobuf:"bytes,9,opt,name=fsType"` + // Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,10,opt,name=readOnly"` +} + // Adapts a ConfigMap into a volume. // // The contents of the target ConfigMap's Data field will be presented in a diff --git a/pkg/api/v1/types_swagger_doc_generated.go b/pkg/api/v1/types_swagger_doc_generated.go index 3a12a42e4e5..36740cc8817 100644 --- a/pkg/api/v1/types_swagger_doc_generated.go +++ b/pkg/api/v1/types_swagger_doc_generated.go @@ -1124,6 +1124,7 @@ var map_PersistentVolumeSource = map[string]string{ "azureDisk": "AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.", "photonPersistentDisk": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine", "portworxVolume": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine", + "scaleIO": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", } func (PersistentVolumeSource) SwaggerDoc() map[string]string { @@ -1640,6 +1641,24 @@ func (SELinuxOptions) SwaggerDoc() map[string]string { return map_SELinuxOptions } +var map_ScaleIOVolumeSource = map[string]string{ + "": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "gateway": "The host address of the ScaleIO API Gateway.", + "system": "The name of the storage system as configured in ScaleIO.", + "secretRef": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.", + "sslEnabled": "Flag to enable/disable SSL communication with Gateway, default false", + "protectionDomain": "The name of the Protection Domain for the configured storage (defaults to \"default\").", + "storagePool": "The Storage Pool associated with the protection domain (defaults to \"default\").", + "storageMode": "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\").", + "volumeName": "The name of a volume already created in the ScaleIO system that is associated with this volume source.", + "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "readOnly": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", +} + +func (ScaleIOVolumeSource) SwaggerDoc() map[string]string { + return map_ScaleIOVolumeSource +} + var map_Secret = map[string]string{ "": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", "metadata": "Standard object's metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", @@ -1911,6 +1930,7 @@ var map_VolumeSource = map[string]string{ "photonPersistentDisk": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine", "projected": "Items for all in one resources secrets, configmaps, and downward API", "portworxVolume": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine", + "scaleIO": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", } func (VolumeSource) SwaggerDoc() map[string]string { diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 47305c9e9f9..4a574f5c4a9 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -317,6 +317,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_ResourceRequirements_To_v1_ResourceRequirements, Convert_v1_SELinuxOptions_To_api_SELinuxOptions, Convert_api_SELinuxOptions_To_v1_SELinuxOptions, + Convert_v1_ScaleIOVolumeSource_To_api_ScaleIOVolumeSource, + Convert_api_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource, Convert_v1_Secret_To_api_Secret, Convert_api_Secret_To_v1_Secret, Convert_v1_SecretEnvSource_To_api_SecretEnvSource, @@ -2711,6 +2713,7 @@ func autoConvert_v1_PersistentVolumeSource_To_api_PersistentVolumeSource(in *Per out.AzureDisk = (*api.AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk)) out.PhotonPersistentDisk = (*api.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) out.PortworxVolume = (*api.PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume)) + out.ScaleIO = (*api.ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO)) return nil } @@ -2737,6 +2740,7 @@ func autoConvert_api_PersistentVolumeSource_To_v1_PersistentVolumeSource(in *api out.AzureDisk = (*AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk)) out.PhotonPersistentDisk = (*PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) out.PortworxVolume = (*PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume)) + out.ScaleIO = (*ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO)) return nil } @@ -3887,6 +3891,42 @@ func Convert_api_SELinuxOptions_To_v1_SELinuxOptions(in *api.SELinuxOptions, out return autoConvert_api_SELinuxOptions_To_v1_SELinuxOptions(in, out, s) } +func autoConvert_v1_ScaleIOVolumeSource_To_api_ScaleIOVolumeSource(in *ScaleIOVolumeSource, out *api.ScaleIOVolumeSource, s conversion.Scope) error { + out.Gateway = in.Gateway + out.System = in.System + out.SecretRef = (*api.LocalObjectReference)(unsafe.Pointer(in.SecretRef)) + out.SSLEnabled = in.SSLEnabled + out.ProtectionDomain = in.ProtectionDomain + out.StoragePool = in.StoragePool + out.StorageMode = in.StorageMode + out.VolumeName = in.VolumeName + out.FSType = in.FSType + out.ReadOnly = in.ReadOnly + return nil +} + +func Convert_v1_ScaleIOVolumeSource_To_api_ScaleIOVolumeSource(in *ScaleIOVolumeSource, out *api.ScaleIOVolumeSource, s conversion.Scope) error { + return autoConvert_v1_ScaleIOVolumeSource_To_api_ScaleIOVolumeSource(in, out, s) +} + +func autoConvert_api_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in *api.ScaleIOVolumeSource, out *ScaleIOVolumeSource, s conversion.Scope) error { + out.Gateway = in.Gateway + out.System = in.System + out.SecretRef = (*LocalObjectReference)(unsafe.Pointer(in.SecretRef)) + out.SSLEnabled = in.SSLEnabled + out.ProtectionDomain = in.ProtectionDomain + out.StoragePool = in.StoragePool + out.StorageMode = in.StorageMode + out.VolumeName = in.VolumeName + out.FSType = in.FSType + out.ReadOnly = in.ReadOnly + return nil +} + +func Convert_api_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in *api.ScaleIOVolumeSource, out *ScaleIOVolumeSource, s conversion.Scope) error { + return autoConvert_api_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in, out, s) +} + func autoConvert_v1_Secret_To_api_Secret(in *Secret, out *api.Secret, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.Data = *(*map[string][]byte)(unsafe.Pointer(&in.Data)) @@ -4487,6 +4527,7 @@ func autoConvert_v1_VolumeSource_To_api_VolumeSource(in *VolumeSource, out *api. out.PhotonPersistentDisk = (*api.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) out.Projected = (*api.ProjectedVolumeSource)(unsafe.Pointer(in.Projected)) out.PortworxVolume = (*api.PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume)) + out.ScaleIO = (*api.ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO)) return nil } @@ -4520,6 +4561,7 @@ func autoConvert_api_VolumeSource_To_v1_VolumeSource(in *api.VolumeSource, out * out.PhotonPersistentDisk = (*PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) out.Projected = (*ProjectedVolumeSource)(unsafe.Pointer(in.Projected)) out.PortworxVolume = (*PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume)) + out.ScaleIO = (*ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO)) return nil } diff --git a/pkg/api/v1/zz_generated.deepcopy.go b/pkg/api/v1/zz_generated.deepcopy.go index 76fa388827c..463e946800d 100644 --- a/pkg/api/v1/zz_generated.deepcopy.go +++ b/pkg/api/v1/zz_generated.deepcopy.go @@ -176,6 +176,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ResourceQuotaStatus, InType: reflect.TypeOf(&ResourceQuotaStatus{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ResourceRequirements, InType: reflect.TypeOf(&ResourceRequirements{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SELinuxOptions, InType: reflect.TypeOf(&SELinuxOptions{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ScaleIOVolumeSource, InType: reflect.TypeOf(&ScaleIOVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_Secret, InType: reflect.TypeOf(&Secret{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecretEnvSource, InType: reflect.TypeOf(&SecretEnvSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecretKeySelector, InType: reflect.TypeOf(&SecretKeySelector{})}, @@ -2026,6 +2027,13 @@ func DeepCopy_v1_PersistentVolumeSource(in interface{}, out interface{}, c *conv *out = new(PortworxVolumeSource) **out = **in } + if in.ScaleIO != nil { + in, out := &in.ScaleIO, &out.ScaleIO + *out = new(ScaleIOVolumeSource) + if err := DeepCopy_v1_ScaleIOVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } @@ -2872,6 +2880,20 @@ func DeepCopy_v1_SELinuxOptions(in interface{}, out interface{}, c *conversion.C } } +func DeepCopy_v1_ScaleIOVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*ScaleIOVolumeSource) + out := out.(*ScaleIOVolumeSource) + *out = *in + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + *out = new(LocalObjectReference) + **out = **in + } + return nil + } +} + func DeepCopy_v1_Secret(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*Secret) @@ -3445,6 +3467,13 @@ func DeepCopy_v1_VolumeSource(in interface{}, out interface{}, c *conversion.Clo *out = new(PortworxVolumeSource) **out = **in } + if in.ScaleIO != nil { + in, out := &in.ScaleIO, &out.ScaleIO + *out = new(ScaleIOVolumeSource) + if err := DeepCopy_v1_ScaleIOVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } diff --git a/pkg/api/v1/zz_generated.defaults.go b/pkg/api/v1/zz_generated.defaults.go index 981734f1902..121b39185c1 100644 --- a/pkg/api/v1/zz_generated.defaults.go +++ b/pkg/api/v1/zz_generated.defaults.go @@ -137,6 +137,9 @@ func SetObjectDefaults_PersistentVolume(in *PersistentVolume) { if in.Spec.PersistentVolumeSource.AzureDisk != nil { SetDefaults_AzureDiskVolumeSource(in.Spec.PersistentVolumeSource.AzureDisk) } + if in.Spec.PersistentVolumeSource.ScaleIO != nil { + SetDefaults_ScaleIOVolumeSource(in.Spec.PersistentVolumeSource.ScaleIO) + } } func SetObjectDefaults_PersistentVolumeClaim(in *PersistentVolumeClaim) { @@ -204,6 +207,9 @@ func SetObjectDefaults_Pod(in *Pod) { } } } + if a.VolumeSource.ScaleIO != nil { + SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.InitContainers { a := &in.Spec.InitContainers[i] @@ -349,6 +355,9 @@ func SetObjectDefaults_PodTemplate(in *PodTemplate) { } } } + if a.VolumeSource.ScaleIO != nil { + SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Template.Spec.InitContainers { a := &in.Template.Spec.InitContainers[i] @@ -488,6 +497,9 @@ func SetObjectDefaults_ReplicationController(in *ReplicationController) { } } } + if a.VolumeSource.ScaleIO != nil { + SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 1f4d681f29f..498118222e4 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -540,6 +540,14 @@ func validateVolumeSource(source *api.VolumeSource, fldPath *field.Path) field.E allErrs = append(allErrs, validateProjectedVolumeSource(source.Projected, fldPath.Child("projected"))...) } } + if source.ScaleIO != nil { + if numVolumes > 0 { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("scaleIO"), "may not specify more than 1 volume type")) + } else { + numVolumes++ + allErrs = append(allErrs, validateScaleIOVolumeSource(source.ScaleIO, fldPath.Child("scaleIO"))...) + } + } if numVolumes == 0 { allErrs = append(allErrs, field.Required(fldPath, "must specify a volume type")) @@ -1004,6 +1012,20 @@ func validatePortworxVolumeSource(pwx *api.PortworxVolumeSource, fldPath *field. return allErrs } +func validateScaleIOVolumeSource(sio *api.ScaleIOVolumeSource, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if sio.Gateway == "" { + allErrs = append(allErrs, field.Required(fldPath.Child("gateway"), "")) + } + if sio.System == "" { + allErrs = append(allErrs, field.Required(fldPath.Child("system"), "")) + } + if sio.VolumeName == "" { + allErrs = append(allErrs, field.Required(fldPath.Child("volumeName"), "")) + } + return allErrs +} + // ValidatePersistentVolumeName checks that a name is appropriate for a // PersistentVolumeName object. var ValidatePersistentVolumeName = NameIsDNSSubdomain @@ -1189,6 +1211,14 @@ func ValidatePersistentVolume(pv *api.PersistentVolume) field.ErrorList { numVolumes++ allErrs = append(allErrs, validateAzureDisk(pv.Spec.AzureDisk, specPath.Child("azureDisk"))...) } + if pv.Spec.ScaleIO != nil { + if numVolumes > 0 { + allErrs = append(allErrs, field.Forbidden(specPath.Child("scaleIO"), "may not specify more than 1 volume type")) + } else { + numVolumes++ + allErrs = append(allErrs, validateScaleIOVolumeSource(pv.Spec.ScaleIO, specPath.Child("scaleIO"))...) + } + } if numVolumes == 0 { allErrs = append(allErrs, field.Required(specPath, "must specify a volume type")) diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 6d22077cd1c..dc64a4e071c 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -1968,6 +1968,65 @@ func TestValidateVolumes(t *testing.T) { errtype: field.ErrorTypeRequired, errfield: "azureDisk.diskURI", }, + // ScaleIO + { + name: "valid scaleio volume", + vol: api.Volume{ + Name: "scaleio-volume", + VolumeSource: api.VolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{ + Gateway: "http://abcd/efg", + System: "test-system", + VolumeName: "test-vol-1", + }, + }, + }, + }, + { + name: "ScaleIO with empty name", + vol: api.Volume{ + Name: "scaleio-volume", + VolumeSource: api.VolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{ + Gateway: "http://abcd/efg", + System: "test-system", + VolumeName: "", + }, + }, + }, + errtype: field.ErrorTypeRequired, + errfield: "scaleIO.volumeName", + }, + { + name: "ScaleIO with empty gateway", + vol: api.Volume{ + Name: "scaleio-volume", + VolumeSource: api.VolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{ + Gateway: "", + System: "test-system", + VolumeName: "test-vol-1", + }, + }, + }, + errtype: field.ErrorTypeRequired, + errfield: "scaleIO.gateway", + }, + { + name: "ScaleIO with empty system", + vol: api.Volume{ + Name: "scaleio-volume", + VolumeSource: api.VolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{ + Gateway: "http://agc/efg/gateway", + System: "", + VolumeName: "test-vol-1", + }, + }, + }, + errtype: field.ErrorTypeRequired, + errfield: "scaleIO.system", + }, } for i, tc := range testCases { diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index 2d56e395184..c018bcc4eef 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -179,6 +179,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ResourceQuotaStatus, InType: reflect.TypeOf(&ResourceQuotaStatus{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ResourceRequirements, InType: reflect.TypeOf(&ResourceRequirements{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SELinuxOptions, InType: reflect.TypeOf(&SELinuxOptions{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ScaleIOVolumeSource, InType: reflect.TypeOf(&ScaleIOVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_Secret, InType: reflect.TypeOf(&Secret{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecretEnvSource, InType: reflect.TypeOf(&SecretEnvSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecretKeySelector, InType: reflect.TypeOf(&SecretKeySelector{})}, @@ -2070,6 +2071,13 @@ func DeepCopy_api_PersistentVolumeSource(in interface{}, out interface{}, c *con *out = new(PortworxVolumeSource) **out = **in } + if in.ScaleIO != nil { + in, out := &in.ScaleIO, &out.ScaleIO + *out = new(ScaleIOVolumeSource) + if err := DeepCopy_api_ScaleIOVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } @@ -2911,6 +2919,20 @@ func DeepCopy_api_SELinuxOptions(in interface{}, out interface{}, c *conversion. } } +func DeepCopy_api_ScaleIOVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*ScaleIOVolumeSource) + out := out.(*ScaleIOVolumeSource) + *out = *in + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + *out = new(LocalObjectReference) + **out = **in + } + return nil + } +} + func DeepCopy_api_Secret(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*Secret) @@ -3472,6 +3494,13 @@ func DeepCopy_api_VolumeSource(in interface{}, out interface{}, c *conversion.Cl *out = new(PortworxVolumeSource) **out = **in } + if in.ScaleIO != nil { + in, out := &in.ScaleIO, &out.ScaleIO + *out = new(ScaleIOVolumeSource) + if err := DeepCopy_api_ScaleIOVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } diff --git a/pkg/apis/apps/v1beta1/zz_generated.defaults.go b/pkg/apis/apps/v1beta1/zz_generated.defaults.go index 7a622474bc4..7d83113c8e2 100644 --- a/pkg/apis/apps/v1beta1/zz_generated.defaults.go +++ b/pkg/apis/apps/v1beta1/zz_generated.defaults.go @@ -80,6 +80,9 @@ func SetObjectDefaults_Deployment(in *Deployment) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -218,6 +221,9 @@ func SetObjectDefaults_StatefulSet(in *StatefulSet) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/apis/batch/v1/zz_generated.defaults.go b/pkg/apis/batch/v1/zz_generated.defaults.go index 21f1d0aa2df..b291d5f896a 100644 --- a/pkg/apis/batch/v1/zz_generated.defaults.go +++ b/pkg/apis/batch/v1/zz_generated.defaults.go @@ -78,6 +78,9 @@ func SetObjectDefaults_Job(in *Job) { } } } + if a.VolumeSource.ScaleIO != nil { + api_v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/apis/batch/v2alpha1/zz_generated.defaults.go b/pkg/apis/batch/v2alpha1/zz_generated.defaults.go index 2a84512fb8e..aa6e1bb8e19 100644 --- a/pkg/apis/batch/v2alpha1/zz_generated.defaults.go +++ b/pkg/apis/batch/v2alpha1/zz_generated.defaults.go @@ -81,6 +81,9 @@ func SetObjectDefaults_CronJob(in *CronJob) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.JobTemplate.Spec.Template.Spec.InitContainers { a := &in.Spec.JobTemplate.Spec.Template.Spec.InitContainers[i] @@ -219,6 +222,9 @@ func SetObjectDefaults_Job(in *Job) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -356,6 +362,9 @@ func SetObjectDefaults_JobTemplate(in *JobTemplate) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Template.Spec.Template.Spec.InitContainers { a := &in.Template.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/apis/extensions/types.go b/pkg/apis/extensions/types.go index ac4c6f7e772..3873cd1f631 100644 --- a/pkg/apis/extensions/types.go +++ b/pkg/apis/extensions/types.go @@ -918,6 +918,7 @@ var ( PhotonPersistentDisk FSType = "photonPersistentDisk" Projected FSType = "projected" PortworxVolume FSType = "portworxVolume" + ScaleIO FSType = "scaleIO" All FSType = "*" ) diff --git a/pkg/apis/extensions/v1beta1/zz_generated.defaults.go b/pkg/apis/extensions/v1beta1/zz_generated.defaults.go index 7eefc9d30b4..9869016d792 100644 --- a/pkg/apis/extensions/v1beta1/zz_generated.defaults.go +++ b/pkg/apis/extensions/v1beta1/zz_generated.defaults.go @@ -84,6 +84,9 @@ func SetObjectDefaults_DaemonSet(in *DaemonSet) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -222,6 +225,9 @@ func SetObjectDefaults_Deployment(in *Deployment) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -371,6 +377,9 @@ func SetObjectDefaults_ReplicaSet(in *ReplicaSet) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/apis/settings/v1alpha1/zz_generated.defaults.go b/pkg/apis/settings/v1alpha1/zz_generated.defaults.go index ccf1df95f96..6e117b33ab7 100644 --- a/pkg/apis/settings/v1alpha1/zz_generated.defaults.go +++ b/pkg/apis/settings/v1alpha1/zz_generated.defaults.go @@ -84,6 +84,9 @@ func SetObjectDefaults_PodPreset(in *PodPreset) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } } diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index e3b367e4cac..4d45303e490 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -5592,11 +5592,17 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Ref: ref("k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource"), }, }, + "scaleIO": { + SchemaProps: spec.SchemaProps{ + Description: "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.ScaleIOVolumeSource"), + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, + "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ScaleIOVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, }, "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeSpec": { Schema: spec.Schema{ @@ -5724,6 +5730,12 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Ref: ref("k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource"), }, }, + "scaleIO": { + SchemaProps: spec.SchemaProps{ + Description: "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.ScaleIOVolumeSource"), + }, + }, "accessModes": { SchemaProps: spec.SchemaProps{ Description: "AccessModes contains all ways the volume can be mounted. More info: http://kubernetes.io/docs/user-guide/persistent-volumes#access-modes", @@ -5762,7 +5774,7 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope }, }, Dependencies: []string{ - "k8s.io/apimachinery/pkg/api/resource.Quantity", "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ObjectReference", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, + "k8s.io/apimachinery/pkg/api/resource.Quantity", "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ObjectReference", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ScaleIOVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, }, "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeStatus": { Schema: spec.Schema{ @@ -7731,6 +7743,87 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope }, Dependencies: []string{}, }, + "k8s.io/kubernetes/pkg/api/v1.ScaleIOVolumeSource": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ScaleIOVolumeSource represents a persistent ScaleIO volume", + Properties: map[string]spec.Schema{ + "gateway": { + SchemaProps: spec.SchemaProps{ + Description: "The host address of the ScaleIO API Gateway.", + Type: []string{"string"}, + Format: "", + }, + }, + "system": { + SchemaProps: spec.SchemaProps{ + Description: "The name of the storage system as configured in ScaleIO.", + Type: []string{"string"}, + Format: "", + }, + }, + "secretRef": { + SchemaProps: spec.SchemaProps{ + Description: "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.LocalObjectReference"), + }, + }, + "sslEnabled": { + SchemaProps: spec.SchemaProps{ + Description: "Flag to enable/disable SSL communication with Gateway, default false", + Type: []string{"boolean"}, + Format: "", + }, + }, + "protectionDomain": { + SchemaProps: spec.SchemaProps{ + Description: "The name of the Protection Domain for the configured storage (defaults to \"default\").", + Type: []string{"string"}, + Format: "", + }, + }, + "storagePool": { + SchemaProps: spec.SchemaProps{ + Description: "The Storage Pool associated with the protection domain (defaults to \"default\").", + Type: []string{"string"}, + Format: "", + }, + }, + "storageMode": { + SchemaProps: spec.SchemaProps{ + Description: "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\").", + Type: []string{"string"}, + Format: "", + }, + }, + "volumeName": { + SchemaProps: spec.SchemaProps{ + Description: "The name of a volume already created in the ScaleIO system that is associated with this volume source.", + Type: []string{"string"}, + Format: "", + }, + }, + "fsType": { + SchemaProps: spec.SchemaProps{ + Description: "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + Type: []string{"string"}, + Format: "", + }, + }, + "readOnly": { + SchemaProps: spec.SchemaProps{ + Description: "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + Required: []string{"gateway", "system", "secretRef"}, + }, + }, + Dependencies: []string{ + "k8s.io/kubernetes/pkg/api/v1.LocalObjectReference"}, + }, "k8s.io/kubernetes/pkg/api/v1.Secret": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -8755,12 +8848,18 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Ref: ref("k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource"), }, }, + "scaleIO": { + SchemaProps: spec.SchemaProps{ + Description: "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.ScaleIOVolumeSource"), + }, + }, }, Required: []string{"name"}, }, }, Dependencies: []string{ - "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ConfigMapVolumeSource", "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.EmptyDirVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GitRepoVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeClaimVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ProjectedVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.SecretVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, + "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ConfigMapVolumeSource", "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.EmptyDirVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GitRepoVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeClaimVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ProjectedVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ScaleIOVolumeSource", "k8s.io/kubernetes/pkg/api/v1.SecretVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, }, "k8s.io/kubernetes/pkg/api/v1.VolumeMount": { Schema: spec.Schema{ @@ -8985,11 +9084,17 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Ref: ref("k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource"), }, }, + "scaleIO": { + SchemaProps: spec.SchemaProps{ + Description: "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.ScaleIOVolumeSource"), + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ConfigMapVolumeSource", "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.EmptyDirVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GitRepoVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeClaimVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ProjectedVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.SecretVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, + "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ConfigMapVolumeSource", "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.EmptyDirVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GitRepoVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeClaimVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PortworxVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ProjectedVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ScaleIOVolumeSource", "k8s.io/kubernetes/pkg/api/v1.SecretVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, }, "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource": { Schema: spec.Schema{ diff --git a/pkg/printers/internalversion/describe.go b/pkg/printers/internalversion/describe.go index f8d21128f61..ad19bc4d55f 100644 --- a/pkg/printers/internalversion/describe.go +++ b/pkg/printers/internalversion/describe.go @@ -626,6 +626,8 @@ func describeVolumes(volumes []api.Volume, w *PrefixWriter, space string) { printPhotonPersistentDiskVolumeSource(volume.VolumeSource.PhotonPersistentDisk, w) case volume.VolumeSource.PortworxVolume != nil: printPortworxVolumeSource(volume.VolumeSource.PortworxVolume, w) + case volume.VolumeSource.ScaleIO != nil: + printScaleIOVolumeSource(volume.VolumeSource.ScaleIO, w) default: w.Write(LEVEL_1, "\n") } @@ -788,6 +790,19 @@ func printCinderVolumeSource(cinder *api.CinderVolumeSource, w *PrefixWriter) { cinder.VolumeID, cinder.FSType, cinder.ReadOnly) } +func printScaleIOVolumeSource(sio *api.ScaleIOVolumeSource, w *PrefixWriter) { + w.Write(LEVEL_2, "Type:\tScaleIO (a persistent volume backed by a block device in ScaleIO)\n"+ + " Gateway:\t%v\n"+ + " System:\t%v\n"+ + " Protection Domain:\t%v\n"+ + " Storage Pool:\t%v\n"+ + " Storage Mode:\t%v\n"+ + " VolumeName:\t%v\n"+ + " FSType:\t%v\n"+ + " ReadOnly:\t%v\n", + sio.Gateway, sio.System, sio.ProtectionDomain, sio.StoragePool, sio.StorageMode, sio.VolumeName, sio.FSType, sio.ReadOnly) +} + type PersistentVolumeDescriber struct { clientset.Interface } @@ -852,6 +867,8 @@ func (d *PersistentVolumeDescriber) Describe(namespace, name string, describerSe printPhotonPersistentDiskVolumeSource(pv.Spec.PhotonPersistentDisk, w) case pv.Spec.PortworxVolume != nil: printPortworxVolumeSource(pv.Spec.PortworxVolume, w) + case pv.Spec.ScaleIO != nil: + printScaleIOVolumeSource(pv.Spec.ScaleIO, w) } if events != nil { diff --git a/pkg/security/podsecuritypolicy/util/util.go b/pkg/security/podsecuritypolicy/util/util.go index 237104c8fb4..7417821c102 100644 --- a/pkg/security/podsecuritypolicy/util/util.go +++ b/pkg/security/podsecuritypolicy/util/util.go @@ -64,6 +64,7 @@ func GetAllFSTypesAsSet() sets.String { string(extensions.PhotonPersistentDisk), string(extensions.Projected), string(extensions.PortworxVolume), + string(extensions.ScaleIO), ) return fstypes } @@ -121,6 +122,8 @@ func GetVolumeFSType(v api.Volume) (extensions.FSType, error) { return extensions.Projected, nil case v.PortworxVolume != nil: return extensions.PortworxVolume, nil + case v.ScaleIO != nil: + return extensions.ScaleIO, nil } return "", fmt.Errorf("unknown volume type for volume: %#v", v) diff --git a/pkg/volume/BUILD b/pkg/volume/BUILD index 6e71453e1df..b111fe14b51 100644 --- a/pkg/volume/BUILD +++ b/pkg/volume/BUILD @@ -114,6 +114,7 @@ filegroup( "//pkg/volume/projected:all-srcs", "//pkg/volume/quobyte:all-srcs", "//pkg/volume/rbd:all-srcs", + "//pkg/volume/scaleio:all-srcs", "//pkg/volume/secret:all-srcs", "//pkg/volume/testing:all-srcs", "//pkg/volume/util:all-srcs", diff --git a/pkg/volume/scaleio/BUILD b/pkg/volume/scaleio/BUILD new file mode 100644 index 00000000000..4d9fa8ed979 --- /dev/null +++ b/pkg/volume/scaleio/BUILD @@ -0,0 +1,72 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = [ + "sio_mgr_test.go", + "sio_util_test.go", + "sio_volume_test.go", + ], + library = ":go_default_library", + tags = ["automanaged"], + deps = [ + "//pkg/api/v1:go_default_library", + "//pkg/client/clientset_generated/clientset/fake:go_default_library", + "//pkg/util/mount:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/testing:go_default_library", + "//vendor:github.com/codedellemc/goscaleio/types/v1", + "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", + "//vendor:k8s.io/apimachinery/pkg/types", + "//vendor:k8s.io/client-go/util/testing", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "sio_client.go", + "sio_mgr.go", + "sio_plugin.go", + "sio_util.go", + "sio_volume.go", + ], + tags = ["automanaged"], + deps = [ + "//pkg/api/v1:go_default_library", + "//pkg/util/exec:go_default_library", + "//pkg/util/keymutex:go_default_library", + "//pkg/util/mount:go_default_library", + "//pkg/util/strings:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/util:go_default_library", + "//vendor:github.com/codedellemc/goscaleio", + "//vendor:github.com/codedellemc/goscaleio/types/v1", + "//vendor:github.com/golang/glog", + "//vendor:k8s.io/apimachinery/pkg/api/resource", + "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", + "//vendor:k8s.io/apimachinery/pkg/types", + "//vendor:k8s.io/apimachinery/pkg/util/uuid", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/volume/scaleio/sio_client.go b/pkg/volume/scaleio/sio_client.go new file mode 100644 index 00000000000..bfcb6f0d062 --- /dev/null +++ b/pkg/volume/scaleio/sio_client.go @@ -0,0 +1,539 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package scaleio + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path" + "path/filepath" + "regexp" + "strconv" + "strings" + "sync" + "time" + + sio "github.com/codedellemc/goscaleio" + siotypes "github.com/codedellemc/goscaleio/types/v1" + "github.com/golang/glog" +) + +var ( + sioDiskIDPath = "/dev/disk/by-id" +) + +type sioVolumeID string + +type sioInterface interface { + FindVolume(name string) (*siotypes.Volume, error) + Volume(sioVolumeID) (*siotypes.Volume, error) + CreateVolume(name string, sizeGB int64) (*siotypes.Volume, error) + AttachVolume(sioVolumeID) error + DetachVolume(sioVolumeID) error + DeleteVolume(sioVolumeID) error + IID() (string, error) + Devs() (map[string]string, error) + WaitForAttachedDevice(token string) (string, error) + WaitForDetachedDevice(token string) error + GetVolumeRefs(sioVolumeID) (int, error) +} + +type sioClient struct { + client *sio.Client + gateway string + username string + password string + insecure bool + certsEnabled bool + system *siotypes.System + sysName string + sysClient *sio.System + protectionDomain *siotypes.ProtectionDomain + pdName string + pdClient *sio.ProtectionDomain + storagePool *siotypes.StoragePool + spName string + spClient *sio.StoragePool + provisionMode string + sdcPath string + instanceID string + inited bool + diskRegex *regexp.Regexp + mtx sync.Mutex +} + +func newSioClient(gateway, username, password string, sslEnabled bool) (*sioClient, error) { + client := new(sioClient) + client.gateway = gateway + client.username = username + client.password = password + if sslEnabled { + client.insecure = false + client.certsEnabled = true + } else { + client.insecure = true + client.certsEnabled = false + } + r, err := regexp.Compile(`^emc-vol-\w*-\w*$`) + if err != nil { + glog.Error(log("failed to compile regex: %v", err)) + return nil, err + } + client.diskRegex = r + + // delay client setup/login until init() + return client, nil +} + +// init setups client and authenticate +func (c *sioClient) init() error { + c.mtx.Lock() + defer c.mtx.Unlock() + if c.inited { + return nil + } + glog.V(4).Infoln(log("initializing scaleio client")) + client, err := sio.NewClientWithArgs(c.gateway, "", c.insecure, c.certsEnabled) + if err != nil { + glog.Error(log("failed to create client: %v", err)) + return err + } + c.client = client + if _, err = c.client.Authenticate( + &sio.ConfigConnect{ + Endpoint: c.gateway, + Version: "", + Username: c.username, + Password: c.password}, + ); err != nil { + glog.Error(log("client authentication failed: %v", err)) + return err + } + + // retrieve system + if c.system, err = c.findSystem(c.sysName); err != nil { + glog.Error(log("unable to find system %s: %v", c.sysName, err)) + return err + } + + // retrieve protection domain + if c.protectionDomain, err = c.findProtectionDomain(c.pdName); err != nil { + glog.Error(log("unable to find protection domain %s: %v", c.protectionDomain, err)) + return err + } + // retrieve storage pool + if c.storagePool, err = c.findStoragePool(c.spName); err != nil { + glog.Error(log("unable to find storage pool %s: %v", c.storagePool, err)) + return err + } + c.inited = true + return nil +} + +func (c *sioClient) Volumes() ([]*siotypes.Volume, error) { + if err := c.init(); err != nil { + return nil, err + } + vols, err := c.getVolumes() + if err != nil { + glog.Error(log("failed to retrieve volumes: %v", err)) + return nil, err + } + return vols, nil +} + +func (c *sioClient) Volume(id sioVolumeID) (*siotypes.Volume, error) { + if err := c.init(); err != nil { + return nil, err + } + + vols, err := c.getVolumesByID(id) + if err != nil { + glog.Error(log("failed to retrieve volume by id: %v", err)) + return nil, err + } + vol := vols[0] + if vol == nil { + glog.V(4).Info(log("volume not found, id %s", id)) + return nil, errors.New("volume not found") + } + return vol, nil +} + +func (c *sioClient) FindVolume(name string) (*siotypes.Volume, error) { + if err := c.init(); err != nil { + return nil, err + } + + glog.V(4).Info(log("searching for volume %s", name)) + volumes, err := c.getVolumesByName(name) + if err != nil { + glog.Error(log("failed to find volume by name %v", err)) + return nil, err + } + + for _, volume := range volumes { + if volume.Name == name { + glog.V(4).Info(log("found volume %s", name)) + return volume, nil + } + } + glog.V(4).Info(log("volume not found, name %s", name)) + return nil, errors.New("volume not found") +} + +func (c *sioClient) CreateVolume(name string, sizeGB int64) (*siotypes.Volume, error) { + if err := c.init(); err != nil { + return nil, err + } + + params := &siotypes.VolumeParam{ + Name: name, + VolumeSizeInKb: strconv.Itoa(int(sizeGB) * 1024 * 1024), + VolumeType: c.provisionMode, + } + createResponse, err := c.client.CreateVolume(params, c.storagePool.Name) + if err != nil { + glog.Error(log("failed to create volume %s: %v", name, err)) + return nil, err + } + return c.Volume(sioVolumeID(createResponse.ID)) +} + +// AttachVolume maps the scaleio volume to an sdc node. +func (c *sioClient) AttachVolume(id sioVolumeID) error { + if err := c.init(); err != nil { + glog.Error(log("failed to init'd client in attach volume: %v", err)) + return err + } + + iid, err := c.IID() + if err != nil { + glog.Error(log("failed to get instanceIID for attach volume: %v", err)) + return err + } + + params := &siotypes.MapVolumeSdcParam{ + SdcID: iid, + AllowMultipleMappings: "false", + AllSdcs: "", + } + volClient := sio.NewVolume(c.client) + volClient.Volume = &siotypes.Volume{ID: string(id)} + + if err := volClient.MapVolumeSdc(params); err != nil { + glog.Error(log("failed to attach volume id %s: %v", id, err)) + return err + } + + glog.V(4).Info(log("volume %s attached successfully", id)) + return nil +} + +// DetachVolume detaches the volume with specified id. +func (c *sioClient) DetachVolume(id sioVolumeID) error { + if err := c.init(); err != nil { + return err + } + + iid, err := c.IID() + if err != nil { + return err + } + params := &siotypes.UnmapVolumeSdcParam{ + SdcID: "", + IgnoreScsiInitiators: "true", + AllSdcs: iid, + } + volClient := sio.NewVolume(c.client) + volClient.Volume = &siotypes.Volume{ID: string(id)} + if err := volClient.UnmapVolumeSdc(params); err != nil { + return err + } + return nil +} + +// DeleteVolume deletes the volume with the specified id +func (c *sioClient) DeleteVolume(id sioVolumeID) error { + if err := c.init(); err != nil { + return err + } + + vol, err := c.Volume(id) + if err != nil { + return err + } + volClient := sio.NewVolume(c.client) + volClient.Volume = vol + if err := volClient.RemoveVolume("ONLY_ME"); err != nil { + return err + } + return nil +} + +func (c *sioClient) IID() (string, error) { + if err := c.init(); err != nil { + return "", err + } + + if c.instanceID == "" { + cmd := c.getSdcCmd() + output, err := exec.Command(cmd, "--query_guid").Output() + if err != nil { + glog.Error(log("drv_cfg --query_guid failed: %v", err)) + return "", err + } + guid := strings.TrimSpace(string(output)) + sdc, err := c.sysClient.FindSdc("SdcGuid", guid) + if err != nil { + glog.Error(log("failed to get sdc info %s", err)) + return "", err + } + c.instanceID = sdc.Sdc.ID + glog.V(4).Info(log("got instanceID %s", c.instanceID)) + } + return c.instanceID, nil +} + +// getSioDiskPaths traverse local disk devices to retrieve device path +// The path is extracted from /dev/disk/by-id; each sio device path has format: +// emc-vol- e.g.: +// emc-vol-788d9efb0a8f20cb-a2b8419300000000 +func (c *sioClient) getSioDiskPaths() ([]os.FileInfo, error) { + files, err := ioutil.ReadDir(sioDiskIDPath) + if err != nil { + glog.Error(log("failed to ReadDir %s: %v", sioDiskIDPath, err)) + return nil, err + } + + result := []os.FileInfo{} + for _, file := range files { + if c.diskRegex.MatchString(file.Name()) { + result = append(result, file) + } + } + + return result, nil + +} + +// GetVolumeRefs counts the number of references an SIO volume has a disk device. +// This is useful in preventing premature detach. +func (c *sioClient) GetVolumeRefs(volId sioVolumeID) (refs int, err error) { + files, err := c.getSioDiskPaths() + if err != nil { + return 0, err + } + for _, file := range files { + if strings.Contains(file.Name(), string(volId)) { + refs++ + } + } + return +} + +// Devs returns a map of local devices as map[] +func (c *sioClient) Devs() (map[string]string, error) { + volumeMap := make(map[string]string) + + // grab the sdc tool output + out, err := exec.Command(c.getSdcCmd(), "--query_vols").Output() + if err != nil { + glog.Error(log("sdc --query_vols failed: %v", err)) + return nil, err + } + + // --query_vols output is a heading followed by list of attached vols as follows: + // Retrieve ? volume(s) + // VOL-ID a2b8419300000000 MDM-ID 788d9efb0a8f20cb + // ... + // parse output and store it in a map as map[]volID + // that map is used later to retrieve device path (next section) + result := string(out) + mdmMap := make(map[string]string) + lines := strings.Split(result, "\n") + for _, line := range lines { + //line e.g.: "VOL-ID a2b8419300000000 MDM-ID 788d9efb0a8f20cb" + if strings.HasPrefix(line, "VOL-ID") { + //split[1] = volID; split[3] = mdmID + split := strings.Split(line, " ") + key := fmt.Sprintf("%s-%s", split[3], split[1]) + mdmMap[key] = split[1] + } + } + + files, err := c.getSioDiskPaths() + if err != nil { + return nil, err + } + + for _, f := range files { + // remove emec-vol- prefix to be left with concated mdmID-volID + mdmVolumeID := strings.Replace(f.Name(), "emc-vol-", "", 1) + devPath, err := filepath.EvalSymlinks(fmt.Sprintf("%s/%s", sioDiskIDPath, f.Name())) + if err != nil { + glog.Error(log("devicepath-to-volID mapping error: %v", err)) + return nil, err + } + // map volID to devicePath + if volumeID, ok := mdmMap[mdmVolumeID]; ok { + volumeMap[volumeID] = devPath + } + } + return volumeMap, nil +} + +// WaitForAttachedDevice sets up a timer to wait for an attached device to appear in the instance's list. +func (c *sioClient) WaitForAttachedDevice(token string) (string, error) { + if token == "" { + return "", fmt.Errorf("invalid attach token") + } + + // wait for device to show up in local device list + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + timer := time.NewTimer(30 * time.Second) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + devMap, err := c.Devs() + if err != nil { + glog.Error(log("failed while waiting for volume to attach: %v", err)) + return "", err + } + go func() { + glog.V(4).Infof(log("waiting for volume %s to be mapped/attached", token)) + }() + if path, ok := devMap[token]; ok { + glog.V(4).Info(log("device %s mapped to vol %s", path, token)) + return path, nil + } + case <-timer.C: + glog.Error(log("timed out while waiting for volume to be mapped to a device")) + return "", fmt.Errorf("volume attach timeout") + } + } +} + +// waitForDetachedDevice waits for device to be detached +func (c *sioClient) WaitForDetachedDevice(token string) error { + if token == "" { + return fmt.Errorf("invalid detach token") + } + + // wait for attach.Token to show up in local device list + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + timer := time.NewTimer(30 * time.Second) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + devMap, err := c.Devs() + if err != nil { + glog.Error(log("failed while waiting for volume to unmap/detach: %v", err)) + return err + } + go func() { + glog.V(4).Infof(log("waiting for volume %s to be unmapped/detached", token)) + }() + // cant find vol id, then ok. + if _, ok := devMap[token]; !ok { + return nil + } + case <-timer.C: + glog.Error(log("timed out while waiting for volume %s to be unmapped/detached", token)) + return fmt.Errorf("volume detach timeout") + } + } +} + +// *********************************************************************** +// Little Helpers! +// *********************************************************************** +func (c *sioClient) findSystem(sysname string) (sys *siotypes.System, err error) { + if c.sysClient, err = c.client.FindSystem("", sysname, ""); err != nil { + return nil, err + } + systems, err := c.client.GetInstance("") + if err != nil { + glog.Error(log("failed to retrieve instances: %v", err)) + return nil, err + } + for _, sys = range systems { + if sys.Name == sysname { + return sys, nil + } + } + glog.Error(log("system %s not found", sysname)) + return nil, errors.New("system not found") +} + +func (c *sioClient) findProtectionDomain(pdname string) (*siotypes.ProtectionDomain, error) { + c.pdClient = sio.NewProtectionDomain(c.client) + if c.sysClient != nil { + protectionDomain, err := c.sysClient.FindProtectionDomain("", pdname, "") + if err != nil { + glog.Error(log("failed to retrieve protection domains: %v", err)) + return nil, err + } + c.pdClient.ProtectionDomain = protectionDomain + return protectionDomain, nil + } + glog.Error(log("protection domain %s not set", pdname)) + return nil, errors.New("protection domain not set") +} + +func (c *sioClient) findStoragePool(spname string) (*siotypes.StoragePool, error) { + c.spClient = sio.NewStoragePool(c.client) + if c.pdClient != nil { + sp, err := c.pdClient.FindStoragePool("", spname, "") + if err != nil { + glog.Error(log("failed to retrieve storage pool: %v", err)) + return nil, err + } + c.spClient.StoragePool = sp + return sp, nil + } + glog.Error(log("storage pool %s not set", spname)) + return nil, errors.New("storage pool not set") +} + +func (c *sioClient) getVolumes() ([]*siotypes.Volume, error) { + return c.client.GetVolume("", "", "", "", true) +} +func (c *sioClient) getVolumesByID(id sioVolumeID) ([]*siotypes.Volume, error) { + return c.client.GetVolume("", string(id), "", "", true) +} + +func (c *sioClient) getVolumesByName(name string) ([]*siotypes.Volume, error) { + return c.client.GetVolume("", "", "", name, true) +} + +func (c *sioClient) getSdcPath() string { + return sdcRootPath +} + +func (c *sioClient) getSdcCmd() string { + return path.Join(c.getSdcPath(), "drv_cfg") +} diff --git a/pkg/volume/scaleio/sio_mgr.go b/pkg/volume/scaleio/sio_mgr.go new file mode 100644 index 00000000000..4164f81d4b6 --- /dev/null +++ b/pkg/volume/scaleio/sio_mgr.go @@ -0,0 +1,258 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package scaleio + +import ( + "errors" + "strconv" + + "github.com/golang/glog" + + siotypes "github.com/codedellemc/goscaleio/types/v1" +) + +type storageInterface interface { + CreateVolume(string, int64) (*siotypes.Volume, error) + AttachVolume(string) (string, error) + IsAttached(string) (bool, error) + DetachVolume(string) error + DeleteVolume(string) error +} + +type sioMgr struct { + client sioInterface + configData map[string]string +} + +func newSioMgr(configs map[string]string) (*sioMgr, error) { + if configs == nil { + return nil, errors.New("missing configuration data") + } + configs[confKey.protectionDomain] = defaultString(configs[confKey.protectionDomain], "default") + configs[confKey.storagePool] = defaultString(configs[confKey.storagePool], "default") + configs[confKey.sdcRootPath] = defaultString(configs[confKey.sdcRootPath], sdcRootPath) + configs[confKey.storageMode] = defaultString(configs[confKey.storageMode], "ThinProvisioned") + + mgr := &sioMgr{configData: configs} + return mgr, nil +} + +// getClient safely returns an sioInterface +func (m *sioMgr) getClient() (sioInterface, error) { + if m.client == nil { + glog.V(4).Info(log("creating scaleio client")) + configs := m.configData + username := configs[confKey.username] + password := configs[confKey.password] + gateway := configs[confKey.gateway] + b, err := strconv.ParseBool(configs[confKey.sslEnabled]) + if err != nil { + glog.Error(log("failed to parse sslEnabled, must be either \"true\" or \"false\"")) + return nil, err + } + certsEnabled := b + + glog.V(4).Info(log("creating new client for gateway %s", gateway)) + client, err := newSioClient(gateway, username, password, certsEnabled) + if err != nil { + glog.Error(log("failed to create scaleio client: %v", err)) + return nil, err + } + + client.sysName = configs[confKey.system] + client.pdName = configs[confKey.protectionDomain] + client.spName = configs[confKey.storagePool] + client.sdcPath = configs[confKey.sdcRootPath] + client.provisionMode = configs[confKey.storageMode] + + m.client = client + + glog.V(4).Info(log("client created successfully [gateway=%s]", gateway)) + } + return m.client, nil +} + +// CreateVolume creates a new ScaleIO volume +func (m *sioMgr) CreateVolume(volName string, sizeGB int64) (*siotypes.Volume, error) { + client, err := m.getClient() + if err != nil { + return nil, err + } + + glog.V(4).Infof("scaleio: creating volume %s", volName) + vol, err := client.CreateVolume(volName, sizeGB) + if err != nil { + glog.V(4).Infof("scaleio: failed creating volume %s: %v", volName, err) + return nil, err + } + glog.V(4).Infof("scaleio: created volume %s successfully", volName) + return vol, nil +} + +// AttachVolume maps a ScaleIO volume to the running node +func (m *sioMgr) AttachVolume(volName string) (string, error) { + client, err := m.getClient() + if err != nil { + glog.Error(log("attach volume failed: %v", err)) + return "", err + } + + glog.V(4).Infoln(log("attaching volume %s", volName)) + iid, err := client.IID() + if err != nil { + glog.Error(log("failed to get instanceID")) + return "", err + } + glog.V(4).Info(log("attaching volume %s to host instance %s", volName, iid)) + + devs, err := client.Devs() + if err != nil { + return "", err + } + + vol, err := client.FindVolume(volName) + if err != nil { + glog.Error(log("failed to find volume %s: %v", volName, err)) + return "", err + } + + // handle vol if already attached + if len(vol.MappedSdcInfo) > 0 { + if m.isSdcMappedToVol(iid, vol) { + glog.V(4).Info(log("skippping attachment, volume %s already attached to sdc %s", volName, iid)) + return devs[vol.ID], nil + } + } + + // attach volume, get deviceName + if err := client.AttachVolume(sioVolumeID(vol.ID)); err != nil { + glog.Error(log("attachment for volume %s failed :%v", volName, err)) + return "", err + } + device, err := client.WaitForAttachedDevice(vol.ID) + if err != nil { + glog.Error(log("failed while waiting for device to attach: %v", err)) + return "", err + } + glog.V(4).Info(log("volume %s attached succesfully as %s to instance %s", volName, device, iid)) + return device, nil +} + +// IsAttached verifies that the named ScaleIO volume is still attached +func (m *sioMgr) IsAttached(volName string) (bool, error) { + client, err := m.getClient() + if err != nil { + return false, err + } + iid, err := client.IID() + if err != nil { + glog.Error("scaleio: failed to get instanceID") + return false, err + } + + vol, err := client.FindVolume(volName) + if err != nil { + return false, err + } + return m.isSdcMappedToVol(iid, vol), nil +} + +// DetachVolume detaches the name ScaleIO volume from an instance +func (m *sioMgr) DetachVolume(volName string) error { + client, err := m.getClient() + if err != nil { + return err + } + iid, err := client.IID() + if err != nil { + glog.Error(log("failed to get instanceID: %v", err)) + return err + } + + vol, err := client.FindVolume(volName) + if err != nil { + return err + } + if !m.isSdcMappedToVol(iid, vol) { + glog.Warning(log( + "skipping detached, vol %s not attached to instance %s", + volName, iid, + )) + return nil + } + + if err := client.DetachVolume(sioVolumeID(vol.ID)); err != nil { + glog.Error(log("failed to detach vol %s: %v", volName, err)) + return err + } + + glog.V(4).Info(log("volume %s detached successfully", volName)) + + return nil +} + +// DeleteVolumes removes the ScaleIO volume +func (m *sioMgr) DeleteVolume(volName string) error { + client, err := m.getClient() + if err != nil { + return err + } + iid, err := client.IID() + if err != nil { + glog.Error(log("failed to get instanceID: %v", err)) + return err + } + + vol, err := client.FindVolume(volName) + if err != nil { + return err + } + + // if still attached, stop + if m.isSdcMappedToVol(iid, vol) { + glog.Error(log("volume %s still attached, unable to delete", volName)) + return errors.New("volume still attached") + } + + if err := client.DeleteVolume(sioVolumeID(vol.ID)); err != nil { + glog.Error(log("failed to delete volume %s: %v", volName, err)) + return err + } + + glog.V(4).Info(log("deleted volume %s successfully", volName)) + return nil + +} + +//***************************************************************** +// Helpers +//***************************************************************** + +// isSdcMappedToVol returns true if the sdc is mapped to the volume +func (m *sioMgr) isSdcMappedToVol(sdcID string, vol *siotypes.Volume) bool { + if len(vol.MappedSdcInfo) == 0 { + glog.V(4).Info(log("no attachment found")) + return false + } + + for _, sdcInfo := range vol.MappedSdcInfo { + if sdcInfo.SdcID == sdcID { + return true + } + } + return false +} diff --git a/pkg/volume/scaleio/sio_mgr_test.go b/pkg/volume/scaleio/sio_mgr_test.go new file mode 100644 index 00000000000..c8f4b44927b --- /dev/null +++ b/pkg/volume/scaleio/sio_mgr_test.go @@ -0,0 +1,333 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package scaleio + +import ( + "errors" + "testing" + "time" + + siotypes "github.com/codedellemc/goscaleio/types/v1" +) + +var ( + fakeSdcID = "test-sdc-123456789" + fakeVolumeName = "test-vol-0001" + fakeVolumeID = "1234567890" + fakeDev = "/dev/testABC" + + fakeConfig = map[string]string{ + confKey.gateway: "http://sio.gateway:1234", + confKey.sslEnabled: "false", + confKey.system: "scaleio", + confKey.volumeName: "sio-0001", + confKey.secretRef: "sio-secret", + confKey.username: "c2lvdXNlcgo=", // siouser + confKey.password: "c2lvcGFzc3dvcmQK", // siopassword + } +) + +func newTestMgr(t *testing.T) *sioMgr { + mgr, err := newSioMgr(fakeConfig) + if err != nil { + t.Error(err) + } + mgr.client = newFakeSio() + return mgr +} + +func TestMgrNew(t *testing.T) { + mgr, err := newSioMgr(fakeConfig) + if err != nil { + t.Fatal(err) + } + if mgr.configData == nil { + t.Fatal("configuration data not set") + } + if mgr.configData[confKey.volumeName] != "sio-0001" { + t.Errorf("expecting %s, got %s", "sio-0001", mgr.configData[confKey.volumeName]) + } + + // check defaults + if mgr.configData[confKey.protectionDomain] != "default" { + t.Errorf("unexpected value for confData[protectionDomain] %s", mgr.configData[confKey.protectionDomain]) + } + if mgr.configData[confKey.storagePool] != "default" { + t.Errorf("unexpected value for confData[storagePool] %s", mgr.configData[confKey.storagePool]) + } + if mgr.configData[confKey.storageMode] != "ThinProvisioned" { + t.Errorf("unexpected value for confData[storageMode] %s", mgr.configData[confKey.storageMode]) + } +} + +func TestMgrGetClient(t *testing.T) { + mgr := newTestMgr(t) + _, err := mgr.getClient() + if err != nil { + t.Fatal(err) + } + if mgr.client == nil { + t.Fatal("mgr.client not set") + } +} + +func TestMgrCreateVolume(t *testing.T) { + mgr := newTestMgr(t) + vol, err := mgr.CreateVolume("test-vol-0001", 8*1024*1024) + if err != nil { + t.Fatal(err) + } + if vol.Name != "test-vol-0001" { + t.Errorf("unexpected vol.Name %s", vol.Name) + } +} + +func TestMgrAttachVolume(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + device, err := mgr.AttachVolume("test-vol-0001") + if err != nil { + t.Fatal(err) + } + if device != "/dev/testABC" { + t.Errorf("unexpected value for mapped device %s", device) + } +} + +func TestMgrAttachVolume_AlreadyAttached(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + mgr.AttachVolume("test-vol-0001") + dev, err := mgr.AttachVolume("test-vol-0001") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if dev != "/dev/testABC" { + t.Errorf("unexpected value for mapped device %s", dev) + } +} + +func TestMgrAttachVolume_VolumeNotFoundError(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + _, err := mgr.AttachVolume("test-vol-0002") + if err == nil { + t.Error("attachVolume should fail with volume not found error") + } +} + +func TestMgrAttachVolume_WaitForAttachError(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + go func() { + c := mgr.client.(*fakeSio) + close(c.waitAttachCtrl) + }() + _, err := mgr.AttachVolume("test-vol-0001") + if err == nil { + t.Error("attachVolume should fail with attach timeout error") + } +} + +func TestMgrDetachVolume(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + mgr.AttachVolume("test-vol-0001") + if err := mgr.DetachVolume("test-vol-0001"); err != nil { + t.Fatal(err) + } + fakeSio := mgr.client.(*fakeSio) + if len(fakeSio.volume.MappedSdcInfo) != 0 { + t.Errorf("expecting attached sdc to 0, got %d", len(fakeSio.volume.MappedSdcInfo)) + } + if len(fakeSio.devs) != 0 { + t.Errorf("expecting local devs to be 0, got %d", len(fakeSio.devs)) + } + +} +func TestMgrDetachVolume_VolumeNotFound(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + mgr.AttachVolume("test-vol-0001") + err := mgr.DetachVolume("test-vol-0002") + if err == nil { + t.Fatal("expected a volume not found failure") + } +} + +func TestMgrDetachVolume_VolumeNotAttached(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + err := mgr.DetachVolume("test-vol-0001") + if err != nil { + t.Fatal(err) + } +} + +func TestMgrDetachVolume_VolumeAlreadyDetached(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + mgr.AttachVolume("test-vol-0001") + mgr.DetachVolume("test-vol-0001") + err := mgr.DetachVolume("test-vol-0001") + if err != nil { + t.Fatal("failed detaching a volume already detached") + } +} + +func TestMgrDetachVolume_WaitForDetachError(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + mgr.AttachVolume("test-vol-0001") + err := mgr.DetachVolume("test-vol-0001") + if err != nil { + t.Error("detachVolume failed") + } +} +func TestMgrDeleteVolume(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + err := mgr.DeleteVolume("test-vol-0001") + if err != nil { + t.Fatal(err) + } + sio := mgr.client.(*fakeSio) + if sio.volume != nil { + t.Errorf("volume not nil after delete operation") + } +} +func TestMgrDeleteVolume_VolumeNotFound(t *testing.T) { + mgr := newTestMgr(t) + mgr.CreateVolume("test-vol-0001", 8*1024*1024) + err := mgr.DeleteVolume("test-vol-0002") + if err == nil { + t.Fatal("expected volume not found error") + } +} + +// ************************************************************ +// Helper Test Types +// ************************************************************ +type fakeSio struct { + volume *siotypes.Volume + waitAttachCtrl chan struct{} + waitDetachCtrl chan struct{} + devs map[string]string +} + +func newFakeSio() *fakeSio { + return &fakeSio{ + waitAttachCtrl: make(chan struct{}), + waitDetachCtrl: make(chan struct{}), + } +} + +func (f *fakeSio) FindVolume(volumeName string) (*siotypes.Volume, error) { + if f.volume == nil || f.volume.Name != volumeName { + return nil, errors.New("volume not found") + } + return f.volume, nil +} + +func (f *fakeSio) Volume(id sioVolumeID) (*siotypes.Volume, error) { + if f.volume == nil || f.volume.ID != string(id) { + return nil, errors.New("volume not found") + } + return f.volume, nil +} + +func (f *fakeSio) CreateVolume(volName string, sizeGB int64) (*siotypes.Volume, error) { + f.volume = &siotypes.Volume{ + ID: fakeVolumeID, + Name: volName, + SizeInKb: int(sizeGB), + VolumeType: "test", + } + + return f.volume, nil +} + +func (f *fakeSio) AttachVolume(id sioVolumeID) error { + _, err := f.Volume(id) + if err != nil { + return err + } + f.volume.MappedSdcInfo = []*siotypes.MappedSdcInfo{ + {SdcID: fakeSdcID}, + } + + return nil +} + +func (f *fakeSio) DetachVolume(id sioVolumeID) error { + if _, err := f.Volume(id); err != nil { + return err + } + f.volume.MappedSdcInfo = nil + delete(f.devs, f.volume.ID) + + return nil +} + +func (f *fakeSio) DeleteVolume(id sioVolumeID) error { + if _, err := f.Volume(id); err != nil { + return err + } + f.volume = nil + return nil +} + +func (f *fakeSio) IID() (string, error) { + return fakeSdcID, nil +} + +func (f *fakeSio) Devs() (map[string]string, error) { + if f.volume == nil { + return nil, errors.New("volume not found") + } + f.devs = map[string]string{ + f.volume.ID: fakeDev, + } + + return f.devs, nil +} + +func (f *fakeSio) GetVolumeRefs(volId sioVolumeID) (int, error) { + if f.volume == nil { + return 0, nil + } + return 1, nil +} + +func (f *fakeSio) WaitForAttachedDevice(token string) (string, error) { + select { + case <-time.After(500 * time.Millisecond): + return fakeDev, nil + case <-f.waitAttachCtrl: + return "", errors.New("attached device timeout") + } +} + +func (f *fakeSio) WaitForDetachedDevice(token string) error { + select { + case <-time.After(500 * time.Millisecond): + delete(f.devs, f.volume.ID) + return nil + case <-f.waitDetachCtrl: + return errors.New("detach device timeout") + } +} diff --git a/pkg/volume/scaleio/sio_plugin.go b/pkg/volume/scaleio/sio_plugin.go new file mode 100644 index 00000000000..ff45c41b022 --- /dev/null +++ b/pkg/volume/scaleio/sio_plugin.go @@ -0,0 +1,203 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package scaleio + +import ( + "errors" + + "github.com/golang/glog" + "k8s.io/apimachinery/pkg/types" + api "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/util/keymutex" + "k8s.io/kubernetes/pkg/util/mount" + "k8s.io/kubernetes/pkg/volume" +) + +const ( + sioName = "scaleio" + sioPluginName = "kubernetes.io/scaleio" + sioConfigFileName = "sioconf.dat" +) + +type sioPlugin struct { + host volume.VolumeHost + mounter mount.Interface + volumeMtx keymutex.KeyMutex +} + +func ProbeVolumePlugins() []volume.VolumePlugin { + p := &sioPlugin{ + host: nil, + } + return []volume.VolumePlugin{p} +} + +// ******************* +// VolumePlugin Impl +// ******************* +var _ volume.VolumePlugin = &sioPlugin{} + +func (p *sioPlugin) Init(host volume.VolumeHost) error { + p.host = host + p.mounter = host.GetMounter() + p.volumeMtx = keymutex.NewKeyMutex() + return nil +} + +func (p *sioPlugin) GetPluginName() string { + return sioPluginName +} + +func (p *sioPlugin) GetVolumeName(spec *volume.Spec) (string, error) { + source, err := getVolumeSourceFromSpec(spec) + if err != nil { + return "", err + } + + return source.VolumeName, nil +} + +func (p *sioPlugin) CanSupport(spec *volume.Spec) bool { + return (spec.PersistentVolume != nil && spec.PersistentVolume.Spec.ScaleIO != nil) || + (spec.Volume != nil && spec.Volume.ScaleIO != nil) +} + +func (p *sioPlugin) RequiresRemount() bool { + return false +} + +func (p *sioPlugin) NewMounter( + spec *volume.Spec, + pod *api.Pod, + _ volume.VolumeOptions) (volume.Mounter, error) { + sioSource, err := getVolumeSourceFromSpec(spec) + if err != nil { + glog.Error(log("failed to extract ScaleIOVolumeSource from spec: %v", err)) + return nil, err + } + + return &sioVolume{ + pod: pod, + spec: spec, + source: sioSource, + namespace: pod.Namespace, + volSpecName: spec.Name(), + volName: sioSource.VolumeName, + podUID: pod.UID, + readOnly: sioSource.ReadOnly, + fsType: sioSource.FSType, + plugin: p, + }, nil +} + +// NewUnmounter creates a representation of the volume to unmount +// The specName param can be used to carry the namespace value (if needed) using format: +// specName = [nsSep] where the specname is pre-pended with the namespace +func (p *sioPlugin) NewUnmounter(specName string, podUID types.UID) (volume.Unmounter, error) { + glog.V(4).Info(log("Unmounter for %s", specName)) + + return &sioVolume{ + podUID: podUID, + volSpecName: specName, + plugin: p, + }, nil +} + +func (p *sioPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { + sioVol := &api.Volume{ + Name: volumeName, + VolumeSource: api.VolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{}, + }, + } + return volume.NewSpecFromVolume(sioVol), nil +} + +// SupportsMountOption returns true if volume plugins supports Mount options +// Specifying mount options in a volume plugin that doesn't support +// user specified mount options will result in error creating persistent volumes +func (p *sioPlugin) SupportsMountOption() bool { + return false +} + +// SupportsBulkVolumeVerification checks if volume plugin type is capable +// of enabling bulk polling of all nodes. This can speed up verification of +// attached volumes by quite a bit, but underlying pluging must support it. +func (p *sioPlugin) SupportsBulkVolumeVerification() bool { + return false +} + +//****************************** +// PersistentVolumePlugin Impl +// ***************************** +var _ volume.PersistentVolumePlugin = &sioPlugin{} + +func (p *sioPlugin) GetAccessModes() []api.PersistentVolumeAccessMode { + return []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + } +} + +// *************************** +// DeletableVolumePlugin Impl +//**************************** +var _ volume.DeletableVolumePlugin = &sioPlugin{} + +func (p *sioPlugin) NewDeleter(spec *volume.Spec) (volume.Deleter, error) { + sioSource, err := getVolumeSourceFromSpec(spec) + if err != nil { + glog.Error(log("deleter failed to extract source from spec: %v", err)) + return nil, err + } + + namespace := spec.PersistentVolume.Spec.ClaimRef.Namespace + + return &sioVolume{ + spec: spec, + source: sioSource, + namespace: namespace, + volSpecName: spec.Name(), + volName: sioSource.VolumeName, + plugin: p, + readOnly: sioSource.ReadOnly, + }, nil +} + +// ********************************* +// ProvisionableVolumePlugin Impl +// ********************************* +var _ volume.ProvisionableVolumePlugin = &sioPlugin{} + +func (p *sioPlugin) NewProvisioner(options volume.VolumeOptions) (volume.Provisioner, error) { + glog.V(4).Info(log("creating Provisioner")) + + configData := options.Parameters + if configData == nil { + glog.Error(log("provisioner missing parameters, unable to continue")) + return nil, errors.New("option parameters missing") + } + + namespace := options.PVC.Namespace + + return &sioVolume{ + configData: configData, + plugin: p, + options: options, + namespace: namespace, + volSpecName: options.PVName, + }, nil +} diff --git a/pkg/volume/scaleio/sio_util.go b/pkg/volume/scaleio/sio_util.go new file mode 100644 index 00000000000..380d507442d --- /dev/null +++ b/pkg/volume/scaleio/sio_util.go @@ -0,0 +1,227 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package scaleio + +import ( + "encoding/gob" + "errors" + "fmt" + "os" + "path" + "strconv" + + "github.com/golang/glog" + + api "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/volume" + volutil "k8s.io/kubernetes/pkg/volume/util" +) + +var ( + confKey = struct { + gateway, + sslEnabled, + secretRef, + system, + protectionDomain, + storagePool, + storageMode, + sdcRootPath, + volumeName, + volSpecName, + fsType, + readOnly, + username, + password, + namespace string + }{ + gateway: "gateway", + sslEnabled: "sslEnabled", + secretRef: "secretRef", + system: "system", + protectionDomain: "protectionDomain", + storagePool: "storagePool", + storageMode: "storageMode", + sdcRootPath: "sdcRootPath", + volumeName: "volumeName", + volSpecName: "volSpecName", + fsType: "fsType", + readOnly: "readOnly", + username: "username", + password: "password", + namespace: "namespace", + } + nsSep = "%" + sdcRootPath = "/opt/emc/scaleio/sdc/bin" + + secretNotFoundErr = errors.New("secret not found") + configMapNotFoundErr = errors.New("configMap not found") + gatewayNotProvidedErr = errors.New("gateway not provided") + secretRefNotProvidedErr = errors.New("secret ref not provided") + systemNotProvidedErr = errors.New("secret not provided") +) + +// mapScaleIOVolumeSource maps attributes from a ScaleIOVolumeSource to config +func mapVolumeSource(config map[string]string, source *api.ScaleIOVolumeSource) { + config[confKey.gateway] = source.Gateway + config[confKey.secretRef] = func() string { + if source.SecretRef != nil { + return string(source.SecretRef.Name) + } + return "" + }() + config[confKey.system] = source.System + config[confKey.volumeName] = source.VolumeName + config[confKey.sslEnabled] = strconv.FormatBool(source.SSLEnabled) + config[confKey.protectionDomain] = source.ProtectionDomain + config[confKey.storagePool] = source.StoragePool + config[confKey.storageMode] = source.StorageMode + config[confKey.fsType] = source.FSType + config[confKey.readOnly] = strconv.FormatBool(source.ReadOnly) + + //optionals + applyConfigDefaults(config) +} + +func validateConfigs(config map[string]string) error { + if config[confKey.gateway] == "" { + return gatewayNotProvidedErr + } + if config[confKey.secretRef] == "" { + return secretRefNotProvidedErr + } + if config[confKey.system] == "" { + return systemNotProvidedErr + } + + return nil +} + +// applyConfigDefaults apply known defaults to incoming spec for dynamic PVCs. +func applyConfigDefaults(config map[string]string) { + b, err := strconv.ParseBool(config[confKey.sslEnabled]) + if err != nil { + glog.Warning(log("failed to parse param sslEnabled, setting it to false")) + b = false + } + config[confKey.sslEnabled] = strconv.FormatBool(b) + config[confKey.protectionDomain] = defaultString(config[confKey.protectionDomain], "default") + config[confKey.storagePool] = defaultString(config[confKey.storagePool], "default") + config[confKey.storageMode] = defaultString(config[confKey.storageMode], "ThinProvisioned") + config[confKey.fsType] = defaultString(config[confKey.fsType], "xfs") + b, err = strconv.ParseBool(config[confKey.readOnly]) + if err != nil { + glog.Warning(log("failed to parse param readOnly, setting it to true")) + b = true + } + config[confKey.readOnly] = strconv.FormatBool(b) +} + +func defaultString(val, defVal string) string { + if val == "" { + return defVal + } + return val +} + +// loadConfig loads configuration data from a file on disk +func loadConfig(configName string) (map[string]string, error) { + glog.V(4).Info(log("loading config file %s", configName)) + file, err := os.Open(configName) + if err != nil { + glog.Error(log("failed to open config file %s: %v", configName, err)) + return nil, err + } + defer file.Close() + data := map[string]string{} + if err := gob.NewDecoder(file).Decode(&data); err != nil { + glog.Error(log("failed to parse config data %s: %v", configName, err)) + return nil, err + } + applyConfigDefaults(data) + if err := validateConfigs(data); err != nil { + glog.Error(log("failed to load ConfigMap %s: %v", err)) + return nil, err + } + + return data, nil +} + +// saveConfig saves the configuration data to local disk +func saveConfig(configName string, data map[string]string) error { + glog.V(4).Info(log("saving config file %s", configName)) + + dir := path.Dir(configName) + if _, err := os.Stat(dir); err != nil { + if !os.IsNotExist(err) { + return err + } + glog.V(4).Info(log("creating config dir for config data: %s", dir)) + if err := os.MkdirAll(dir, 0750); err != nil { + glog.Error(log("failed to create config data dir %v", err)) + return err + } + } + + file, err := os.Create(configName) + if err != nil { + glog.V(4).Info(log("failed to save config data file %s: %v", configName, err)) + return err + } + defer file.Close() + if err := gob.NewEncoder(file).Encode(data); err != nil { + glog.Error(log("failed to save config %s: %v", configName, err)) + return err + } + glog.V(4).Info(log("config data file saved successfully as %s", configName)) + return nil +} + +// attachSecret loads secret object and attaches to configData +func attachSecret(plug *sioPlugin, namespace string, configData map[string]string) error { + // load secret + secretRefName := configData[confKey.secretRef] + kubeClient := plug.host.GetKubeClient() + secretMap, err := volutil.GetSecretForPV(namespace, secretRefName, sioPluginName, kubeClient) + if err != nil { + glog.Error(log("failed to get secret: %v", err)) + return secretNotFoundErr + } + // merge secret data + for key, val := range secretMap { + configData[key] = val + } + + return nil +} + +// getVolumeSourceFromSpec safely extracts ScaleIOVolumeSource from spec +func getVolumeSourceFromSpec(spec *volume.Spec) (*api.ScaleIOVolumeSource, error) { + if spec.Volume != nil && spec.Volume.ScaleIO != nil { + return spec.Volume.ScaleIO, nil + } + if spec.PersistentVolume != nil && + spec.PersistentVolume.Spec.ScaleIO != nil { + return spec.PersistentVolume.Spec.ScaleIO, nil + } + + return nil, fmt.Errorf("ScaleIO not defined in spec") +} + +func log(msg string, parts ...interface{}) string { + return fmt.Sprintf(fmt.Sprintf("scaleio: %s", msg), parts...) +} diff --git a/pkg/volume/scaleio/sio_util_test.go b/pkg/volume/scaleio/sio_util_test.go new file mode 100644 index 00000000000..85d24b43703 --- /dev/null +++ b/pkg/volume/scaleio/sio_util_test.go @@ -0,0 +1,222 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package scaleio + +import ( + "encoding/gob" + "os" + "path" + "reflect" + "testing" + + utiltesting "k8s.io/client-go/util/testing" + api "k8s.io/kubernetes/pkg/api/v1" +) + +var ( + vol = &api.Volume{ + Name: testSioVolName, + VolumeSource: api.VolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{ + Gateway: "http://test.scaleio:1111", + System: "sio", + ProtectionDomain: "defaultPD", + StoragePool: "defaultSP", + VolumeName: "test-vol", + FSType: "ext4", + SecretRef: &api.LocalObjectReference{Name: "test-secret"}, + }, + }, + } + + config = map[string]string{ + confKey.system: "sio", + confKey.gateway: "http://sio/", + confKey.volSpecName: testSioVolName, + confKey.volumeName: "sio-vol", + confKey.secretRef: "sio-secret", + confKey.protectionDomain: "defaultPD", + confKey.storagePool: "deraultSP", + confKey.fsType: "xfs", + confKey.readOnly: "true", + } + + testConfigFile = "conf.dat" +) + +func TestUtilMapVolumeSource(t *testing.T) { + data := make(map[string]string) + mapVolumeSource(data, vol.VolumeSource.ScaleIO) + if data[confKey.gateway] != "http://test.scaleio:1111" { + t.Error("Unexpected gateway value") + } + if data[confKey.system] != "sio" { + t.Error("Unexpected system value") + } + if data[confKey.protectionDomain] != "defaultPD" { + t.Error("Unexpected protection domain value") + } + if data[confKey.storagePool] != "defaultSP" { + t.Error("Unexpected storage pool value") + } + if data[confKey.volumeName] != "test-vol" { + t.Error("Unexpected volume name value") + } + if data[confKey.fsType] != "ext4" { + t.Error("Unexpected fstype value") + } + if data[confKey.secretRef] != "test-secret" { + t.Error("Unexpected secret ref value") + } + if data[confKey.sslEnabled] != "false" { + t.Error("Unexpected sslEnabled value") + } + if data[confKey.readOnly] != "false" { + t.Error("Unexpected readOnly value: ", data[confKey.readOnly]) + } +} + +func TestUtilValidateConfigs(t *testing.T) { + data := map[string]string{ + confKey.secretRef: "sio-secret", + confKey.system: "sio", + } + if err := validateConfigs(data); err != gatewayNotProvidedErr { + t.Error("Expecting error for missing gateway, but did not get it") + } +} + +func TestUtilApplyConfigDefaults(t *testing.T) { + data := map[string]string{ + confKey.system: "sio", + confKey.gateway: "http://sio/", + confKey.volumeName: "sio-vol", + confKey.secretRef: "test-secret", + } + applyConfigDefaults(data) + + if data[confKey.gateway] != "http://sio/" { + t.Error("Unexpected gateway value") + } + if data[confKey.system] != "sio" { + t.Error("Unexpected system value") + } + if data[confKey.protectionDomain] != "default" { + t.Error("Unexpected protection domain value") + } + if data[confKey.storagePool] != "default" { + t.Error("Unexpected storage pool value") + } + if data[confKey.volumeName] != "sio-vol" { + t.Error("Unexpected volume name value") + } + if data[confKey.fsType] != "xfs" { + t.Error("Unexpected fstype value") + } + if data[confKey.storageMode] != "ThinProvisioned" { + t.Error("Unexpected storage mode value") + } + if data[confKey.secretRef] != "test-secret" { + t.Error("Unexpected secret ref value") + } + if data[confKey.sslEnabled] != "false" { + t.Error("Unexpected sslEnabled value") + } + if data[confKey.readOnly] != "true" { + t.Error("Unexpected readOnly value: ", data[confKey.readOnly]) + } +} + +func TestUtilDefaultString(t *testing.T) { + if defaultString("", "foo") != "foo" { + t.Error("Unexpected value for default value") + } +} + +func TestUtilSaveConfig(t *testing.T) { + tmpDir, err := utiltesting.MkTmpdir("scaleio-test") + if err != nil { + t.Fatalf("can't make a temp dir: %v", err) + } + defer os.RemoveAll(tmpDir) + + config := path.Join(tmpDir, testConfigFile) + data := map[string]string{ + confKey.gateway: "https://test-gateway/", + confKey.secretRef: "sio-secret", + confKey.sslEnabled: "false", + } + if err := saveConfig(config, data); err != nil { + t.Fatal("failed while saving data", err) + } + file, err := os.Open(config) + if err != nil { + t.Fatal("failed to open conf file: ", file) + } + dataRcvd := map[string]string{} + if err := gob.NewDecoder(file).Decode(&dataRcvd); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(data, dataRcvd) { + t.Error("we got problem, config data not the same") + } +} + +func TestUtilAttachSecret(t *testing.T) { + plugMgr, tmpDir := newPluginMgr(t) + defer os.RemoveAll(tmpDir) + + plug, err := plugMgr.FindPluginByName(sioPluginName) + if err != nil { + t.Errorf("Can't find the plugin %v", sioPluginName) + } + sioPlug, ok := plug.(*sioPlugin) + if !ok { + t.Errorf("Cannot assert plugin to be type sioPlugin") + } + + data := make(map[string]string) + for k, v := range config { + data[k] = v + } + if err := attachSecret(sioPlug, "default", data); err != nil { + t.Errorf("failed to setupConfigData %v", err) + } + if data[confKey.username] == "" { + t.Errorf("failed to merge secret") + } +} + +func TestUtilLoadConfig(t *testing.T) { + tmpDir, err := utiltesting.MkTmpdir("scaleio-test") + if err != nil { + t.Fatalf("can't make a temp dir: %v", err) + } + defer os.RemoveAll(tmpDir) + + configFile := path.Join(tmpDir, sioConfigFileName) + + if err := saveConfig(configFile, config); err != nil { + t.Fatal("failed while saving data", err) + } + + dataRcvd, err := loadConfig(configFile) + if dataRcvd[confKey.gateway] != config[confKey.gateway] || + dataRcvd[confKey.system] != config[confKey.system] { + t.Fatal("loaded config data not matching saved config data") + } +} diff --git a/pkg/volume/scaleio/sio_volume.go b/pkg/volume/scaleio/sio_volume.go new file mode 100644 index 00000000000..31d231238b0 --- /dev/null +++ b/pkg/volume/scaleio/sio_volume.go @@ -0,0 +1,455 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package scaleio + +import ( + "fmt" + "os" + "path" + "strconv" + "strings" + + "github.com/golang/glog" + "k8s.io/apimachinery/pkg/api/resource" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/uuid" + api "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/util/exec" + "k8s.io/kubernetes/pkg/util/mount" + kstrings "k8s.io/kubernetes/pkg/util/strings" + "k8s.io/kubernetes/pkg/volume" + "k8s.io/kubernetes/pkg/volume/util" +) + +type sioVolume struct { + sioMgr *sioMgr + plugin *sioPlugin + pod *api.Pod + podUID types.UID + spec *volume.Spec + source *api.ScaleIOVolumeSource + namespace string + volSpecName string + volName string + readOnly bool + fsType string + options volume.VolumeOptions + configData map[string]string + + volume.MetricsNil +} + +// ******************* +// volume.Volume Impl +var _ volume.Volume = &sioVolume{} + +// GetPath returns the path where the volume will be mounted. +// The volumeName is prefixed with the pod's namespace a - +func (v *sioVolume) GetPath() string { + return v.plugin.host.GetPodVolumeDir( + v.podUID, + kstrings.EscapeQualifiedNameForDisk(sioPluginName), + v.volSpecName) +} + +// ************* +// Mounter Impl +// ************* +var _ volume.Mounter = &sioVolume{} + +// CanMount checks to verify that the volume can be mounted prior to Setup. +// A nil error indicates that the volume is ready for mounitnig. +func (v *sioVolume) CanMount() error { + return nil +} + +func (v *sioVolume) SetUp(fsGroup *int64) error { + return v.SetUpAt(v.GetPath(), fsGroup) +} + +// SetUp bind mounts the disk global mount to the volume path. +func (v *sioVolume) SetUpAt(dir string, fsGroup *int64) error { + v.plugin.volumeMtx.LockKey(v.volSpecName) + defer v.plugin.volumeMtx.UnlockKey(v.volSpecName) + + glog.V(4).Info(log("setting up volume %s", v.volSpecName)) + if err := v.setSioMgr(); err != nil { + glog.Error(log("setup failed to create scalio manager: %v", err)) + return err + } + + notDevMnt, err := v.plugin.mounter.IsLikelyNotMountPoint(dir) + if err != nil && !os.IsNotExist(err) { + glog.Error(log("IsLikelyNotMountPoint test failed for dir %v", dir)) + return err + } + if !notDevMnt { + glog.V(4).Info(log("skipping setup, dir %s already a mount point", v.volName)) + return nil + } + + // attach the volume and mount + volName := v.volName + devicePath, err := v.sioMgr.AttachVolume(volName) + if err != nil { + glog.Error(log("setup of volume %v: %v", v.volSpecName, err)) + return err + } + options := []string{} + if v.source.ReadOnly { + options = append(options, "ro") + } else { + options = append(options, "rw") + } + + glog.V(4).Info(log("mounting device %s -> %s", devicePath, dir)) + if err := os.MkdirAll(dir, 0750); err != nil { + glog.Error(log("failed to create dir %#v: %v", dir, err)) + return err + } + glog.V(4).Info(log("setup created mount point directory %s", dir)) + + diskMounter := &mount.SafeFormatAndMount{ + Interface: v.plugin.mounter, + Runner: exec.New(), + } + err = diskMounter.FormatAndMount(devicePath, dir, v.fsType, options) + + if err != nil { + glog.Error(log("mount operation failed during setup: %v", err)) + if err := os.Remove(dir); err != nil && !os.IsNotExist(err) { + glog.Error(log("failed to remove dir %s during a failed mount at setup: %v", dir, err)) + return err + } + return err + } + + glog.V(4).Info(log("successfully setup volume %s attached %s:%s as %s", v.volSpecName, v.volName, devicePath, dir)) + return nil +} + +func (v *sioVolume) GetAttributes() volume.Attributes { + return volume.Attributes{ + ReadOnly: v.readOnly, + Managed: !v.readOnly, + SupportsSELinux: true, + } +} + +// ********************** +// volume.Unmounter Impl +// ********************* +var _ volume.Unmounter = &sioVolume{} + +// TearDownAt unmounts the bind mount +func (v *sioVolume) TearDown() error { + return v.TearDownAt(v.GetPath()) +} + +// TearDown unmounts and remove the volume +func (v *sioVolume) TearDownAt(dir string) error { + v.plugin.volumeMtx.LockKey(v.volSpecName) + defer v.plugin.volumeMtx.UnlockKey(v.volSpecName) + + dev, _, err := mount.GetDeviceNameFromMount(v.plugin.mounter, dir) + if err != nil { + glog.Errorf(log("failed to get reference count for volume: %s", dir)) + return err + } + + glog.V(4).Info(log("attempting to unmount %s", dir)) + if err := util.UnmountPath(dir, v.plugin.mounter); err != nil { + glog.Error(log("teardown failed while unmounting dir %s: %v ", dir, err)) + return err + } + glog.V(4).Info(log("dir %s unmounted successfully", dir)) + + // detach/unmap + deviceBusy, err := v.plugin.mounter.DeviceOpened(dev) + if err != nil { + glog.Error(log("teardown unable to get status for device %s: %v", dev, err)) + return err + } + + // Detach volume from node: + // use "last attempt wins" strategy to detach volume from node + // only allow volume to detach when it is not busy (not being used by other pods) + if !deviceBusy { + glog.V(4).Info(log("teardown is attempting to detach/unmap volume for %s", v.volSpecName)) + if err := v.resetSioMgr(); err != nil { + glog.Error(log("teardown failed, unable to reset scalio mgr: %v", err)) + } + volName := v.volName + if err := v.sioMgr.DetachVolume(volName); err != nil { + glog.Warning(log("warning: detaching failed for volume %s: %v", volName, err)) + return nil + } + glog.V(4).Infof(log("teardown of volume %v detached successfully", volName)) + } + return nil +} + +// ******************** +// volume.Deleter Impl +// ******************** +var _ volume.Deleter = &sioVolume{} + +func (v *sioVolume) Delete() error { + glog.V(4).Info(log("deleting pvc %s", v.volSpecName)) + + if err := v.setSioMgrFromSpec(); err != nil { + glog.Error(log("delete failed while setting sio manager: %v", err)) + return err + } + + err := v.sioMgr.DeleteVolume(v.volName) + if err != nil { + glog.Error(log("failed to delete volume %s: %v", v.volName, err)) + return err + } + + glog.V(4).Info(log("successfully deleted pvc %s", v.volSpecName)) + return nil +} + +// ************************ +// volume.Provisioner Impl +// ************************ +var _ volume.Provisioner = &sioVolume{} + +func (v *sioVolume) Provision() (*api.PersistentVolume, error) { + glog.V(4).Info(log("attempting to dynamically provision pvc %v", v.options.PVName)) + + // setup volume attrributes + name := v.generateVolName() + capacity := v.options.PVC.Spec.Resources.Requests[api.ResourceName(api.ResourceStorage)] + volSizeBytes := capacity.Value() + volSizeGB := int64(volume.RoundUpSize(volSizeBytes, 1024*1024*1024)) + + // create sio manager + if err := v.setSioMgrFromConfig(); err != nil { + glog.Error(log("provision failed while setting up sio mgr: %v", err)) + return nil, err + } + + // create volume + vol, err := v.sioMgr.CreateVolume(name, volSizeGB) + if err != nil { + glog.Error(log("provision failed while creating volume: %v", err)) + return nil, err + } + + // prepare data for pv + v.configData[confKey.volumeName] = name + sslEnabled, err := strconv.ParseBool(v.configData[confKey.sslEnabled]) + if err != nil { + glog.Warning(log("failed to parse parameter sslEnabled, setting to false")) + sslEnabled = false + } + readOnly, err := strconv.ParseBool(v.configData[confKey.readOnly]) + if err != nil { + glog.Warning(log("failed to parse parameter readOnly, setting it to true")) + readOnly = true + } + + // describe created pv + pv := &api.PersistentVolume{ + ObjectMeta: meta.ObjectMeta{ + Name: v.options.PVName, + Namespace: v.options.PVC.Namespace, + Labels: map[string]string{}, + Annotations: map[string]string{ + "kubernetes.io/createdby": "scaleio-dynamic-provisioner", + }, + }, + Spec: api.PersistentVolumeSpec{ + PersistentVolumeReclaimPolicy: v.options.PersistentVolumeReclaimPolicy, + AccessModes: v.options.PVC.Spec.AccessModes, + Capacity: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse( + fmt.Sprintf("%dGi", volSizeGB), + ), + }, + PersistentVolumeSource: api.PersistentVolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{ + Gateway: v.configData[confKey.gateway], + SSLEnabled: sslEnabled, + SecretRef: &api.LocalObjectReference{Name: v.configData[confKey.secretRef]}, + System: v.configData[confKey.system], + ProtectionDomain: v.configData[confKey.protectionDomain], + StoragePool: v.configData[confKey.storagePool], + StorageMode: v.configData[confKey.storageMode], + VolumeName: name, + FSType: v.configData[confKey.fsType], + ReadOnly: readOnly, + }, + }, + }, + } + if len(v.options.PVC.Spec.AccessModes) == 0 { + pv.Spec.AccessModes = v.plugin.GetAccessModes() + } + + glog.V(4).Info(log("provisioner dynamically created pvc %v with volume %s successfully", pv.Name, vol.Name)) + return pv, nil +} + +// setSioMgr creates scaleio mgr from cached config data if found +// otherwise, setups new config data and create mgr +func (v *sioVolume) setSioMgr() error { + glog.V(4).Info(log("setting up sio mgr for vol %s", v.volSpecName)) + podDir := v.plugin.host.GetPodPluginDir(v.podUID, sioPluginName) + configName := path.Join(podDir, sioConfigFileName) + if v.sioMgr == nil { + configData, err := loadConfig(configName) // try to load config if exist + if err != nil { + if !os.IsNotExist(err) { + glog.Error(log("failed to load config %s : %v", configName, err)) + return err + } + glog.V(4).Info(log("previous config file not found, creating new one")) + // prepare config data + configData = make(map[string]string) + mapVolumeSource(configData, v.source) + if err := validateConfigs(configData); err != nil { + glog.Error(log("config setup failed: %s", err)) + return err + } + configData[confKey.namespace] = v.namespace + configData[confKey.volSpecName] = v.volSpecName + + // persist config + if err := saveConfig(configName, configData); err != nil { + glog.Error(log("failed to save config data: %v", err)) + return err + } + } + // merge in secret + if err := attachSecret(v.plugin, v.namespace, configData); err != nil { + glog.Error(log("failed to load secret: %v", err)) + return err + } + + mgr, err := newSioMgr(configData) + if err != nil { + glog.Error(log("failed to reset sio manager: %v", err)) + return err + } + + v.sioMgr = mgr + } + return nil +} + +// resetSioMgr creates scaleio manager from existing (cached) config data +func (v *sioVolume) resetSioMgr() error { + podDir := v.plugin.host.GetPodPluginDir(v.podUID, sioPluginName) + configName := path.Join(podDir, sioConfigFileName) + if v.sioMgr == nil { + // load config data from disk + configData, err := loadConfig(configName) + if err != nil { + glog.Error(log("failed to load config data: %v", err)) + return err + } + v.namespace = configData[confKey.namespace] + v.volName = configData[confKey.volumeName] + v.volSpecName = configData[confKey.volSpecName] + + // attach secret + if err := attachSecret(v.plugin, v.namespace, configData); err != nil { + glog.Error(log("failed to load secret: %v", err)) + return err + } + + mgr, err := newSioMgr(configData) + if err != nil { + glog.Error(log("failed to reset scaleio mgr: %v", err)) + return err + } + v.sioMgr = mgr + } + return nil +} + +// setSioFromConfig sets up scaleio mgr from an available config data map +// designed to be called from dynamic provisioner +func (v *sioVolume) setSioMgrFromConfig() error { + glog.V(4).Info(log("setting scaleio mgr from available config")) + if v.sioMgr == nil { + configData := v.configData + applyConfigDefaults(configData) + if err := validateConfigs(configData); err != nil { + glog.Error(log("config data setup failed: %s", err)) + return err + } + configData[confKey.namespace] = v.namespace + configData[confKey.volSpecName] = v.volSpecName + + // copy config and attach secret + data := map[string]string{} + for k, v := range configData { + data[k] = v + } + if err := attachSecret(v.plugin, v.namespace, data); err != nil { + glog.Error(log("failed to load secret: %v", err)) + return err + } + + mgr, err := newSioMgr(data) + if err != nil { + glog.Error(log("failed while setting scaleio mgr from config: %v", err)) + return err + } + v.sioMgr = mgr + } + return nil +} + +func (v *sioVolume) setSioMgrFromSpec() error { + glog.V(4).Info(log("setting sio manager from spec")) + if v.sioMgr == nil { + // get config data form spec volume source + configData := map[string]string{} + mapVolumeSource(configData, v.source) + if err := validateConfigs(configData); err != nil { + glog.Error(log("config setup failed: %s", err)) + return err + } + configData[confKey.namespace] = v.namespace + configData[confKey.volSpecName] = v.volSpecName + + // attach secret object to config data + if err := attachSecret(v.plugin, v.namespace, configData); err != nil { + glog.Error(log("failed to load secret: %v", err)) + return err + } + + mgr, err := newSioMgr(configData) + if err != nil { + glog.Error(log("failed to reset sio manager: %v", err)) + return err + } + v.sioMgr = mgr + } + return nil +} + +func (v *sioVolume) generateVolName() string { + return "sio-" + strings.Replace(string(uuid.NewUUID()), "-", "", -1)[0:25] +} diff --git a/pkg/volume/scaleio/sio_volume_test.go b/pkg/volume/scaleio/sio_volume_test.go new file mode 100644 index 00000000000..536a833304d --- /dev/null +++ b/pkg/volume/scaleio/sio_volume_test.go @@ -0,0 +1,353 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package scaleio + +import ( + "fmt" + "os" + "path" + "strings" + "testing" + + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + utiltesting "k8s.io/client-go/util/testing" + api "k8s.io/kubernetes/pkg/api/v1" + fakeclient "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake" + "k8s.io/kubernetes/pkg/util/mount" + "k8s.io/kubernetes/pkg/volume" + volumetest "k8s.io/kubernetes/pkg/volume/testing" +) + +var ( + testSioSystem = "sio" + testSioPD = "default" + testSioVol = "vol-0001" + testns = "default" + testSioVolName = fmt.Sprintf("%s%s%s", testns, "-", testSioVol) + podUID = types.UID("sio-pod") +) + +func newPluginMgr(t *testing.T) (*volume.VolumePluginMgr, string) { + tmpDir, err := utiltesting.MkTmpdir("scaleio-test") + if err != nil { + t.Fatalf("can't make a temp dir: %v", err) + } + config := &api.Secret{ + ObjectMeta: meta.ObjectMeta{ + Name: "sio-secret", + Namespace: testns, + UID: "1234567890", + }, + Type: api.SecretType("kubernetes.io/scaleio"), + Data: map[string][]byte{ + "username": []byte("username"), + "password": []byte("password"), + }, + } + fakeClient := fakeclient.NewSimpleClientset(config) + host := volumetest.NewFakeVolumeHost(tmpDir, fakeClient, nil) + plugMgr := &volume.VolumePluginMgr{} + plugMgr.InitPlugins(ProbeVolumePlugins(), host) + + return plugMgr, tmpDir +} + +func TestVolumeCanSupport(t *testing.T) { + plugMgr, tmpDir := newPluginMgr(t) + defer os.RemoveAll(tmpDir) + plug, err := plugMgr.FindPluginByName(sioPluginName) + if err != nil { + t.Errorf("Can't find the plugin %s by name", sioPluginName) + } + if plug.GetPluginName() != "kubernetes.io/scaleio" { + t.Errorf("Wrong name: %s", plug.GetPluginName()) + } + if !plug.CanSupport( + &volume.Spec{ + Volume: &api.Volume{ + VolumeSource: api.VolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{}, + }, + }, + }, + ) { + t.Errorf("Expected true for CanSupport LibStorage VolumeSource") + } + if !plug.CanSupport( + &volume.Spec{ + PersistentVolume: &api.PersistentVolume{ + Spec: api.PersistentVolumeSpec{ + PersistentVolumeSource: api.PersistentVolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{}, + }, + }, + }, + }, + ) { + t.Errorf("Expected true for CanSupport LibStorage PersistentVolumeSource") + } +} + +func TestVolumeGetAccessModes(t *testing.T) { + plugMgr, tmpDir := newPluginMgr(t) + defer os.RemoveAll(tmpDir) + plug, err := plugMgr.FindPersistentPluginByName(sioPluginName) + if err != nil { + t.Errorf("Can't find the plugin %v", sioPluginName) + } + if !containsMode(plug.GetAccessModes(), api.ReadWriteOnce) { + t.Errorf("Expected two AccessModeTypes: %s or %s", api.ReadWriteOnce, api.ReadOnlyMany) + } +} +func containsMode(modes []api.PersistentVolumeAccessMode, mode api.PersistentVolumeAccessMode) bool { + for _, m := range modes { + if m == mode { + return true + } + } + return false +} + +func TestVolumeMounterUnmounter(t *testing.T) { + plugMgr, tmpDir := newPluginMgr(t) + defer os.RemoveAll(tmpDir) + + plug, err := plugMgr.FindPluginByName(sioPluginName) + if err != nil { + t.Errorf("Can't find the plugin %v", sioPluginName) + } + sioPlug, ok := plug.(*sioPlugin) + if !ok { + t.Errorf("Cannot assert plugin to be type sioPlugin") + } + + sioPlug.mounter = &mount.FakeMounter{} + + vol := &api.Volume{ + Name: testSioVolName, + VolumeSource: api.VolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{ + Gateway: "http://test.scaleio:1111", + System: testSioSystem, + ProtectionDomain: testSioPD, + StoragePool: "default", + VolumeName: testSioVol, + FSType: "ext4", + SecretRef: &api.LocalObjectReference{Name: "sio-secret"}, + }, + }, + } + + sioMounter, err := sioPlug.NewMounter( + volume.NewSpecFromVolume(vol), + &api.Pod{ObjectMeta: meta.ObjectMeta{UID: podUID, Namespace: testns}}, + volume.VolumeOptions{}, + ) + if err != nil { + t.Fatalf("Failed to make a new Mounter: %v", err) + } + + if sioMounter == nil { + t.Fatal("Got a nil Mounter") + } + + sio := newFakeSio() + sioVol := sioMounter.(*sioVolume) + if err := sioVol.setSioMgr(); err != nil { + t.Fatalf("failed to create sio mgr: %v", err) + } + sioVol.sioMgr.client = sio + sioVol.sioMgr.CreateVolume(testSioVol, 8) //create vol ahead of time + + volPath := path.Join(tmpDir, fmt.Sprintf("pods/%s/volumes/kubernetes.io~scaleio/%s", podUID, testSioVolName)) + path := sioMounter.GetPath() + if path != volPath { + t.Errorf("Got unexpected path: %s", path) + } + + if err := sioMounter.SetUp(nil); err != nil { + t.Errorf("Expected success, got: %v", err) + } + if _, err := os.Stat(path); err != nil { + if os.IsNotExist(err) { + t.Errorf("SetUp() failed, volume path not created: %s", path) + } else { + t.Errorf("SetUp() failed: %v", err) + } + } + + // rebuild spec + builtSpec, err := sioPlug.ConstructVolumeSpec(volume.NewSpecFromVolume(vol).Name(), path) + if err != nil { + t.Errorf("ConstructVolumeSpec failed %v", err) + } + if builtSpec.Name() != vol.Name { + t.Errorf("Unexpected spec name %s", builtSpec.Name()) + } + + // unmount + sioUnmounter, err := sioPlug.NewUnmounter(volume.NewSpecFromVolume(vol).Name(), podUID) + if err != nil { + t.Fatalf("Failed to make a new Unmounter: %v", err) + } + if sioUnmounter == nil { + t.Fatal("Got a nil Unmounter") + } + sioVol = sioUnmounter.(*sioVolume) + if err := sioVol.resetSioMgr(); err != nil { + t.Fatalf("failed to reset sio mgr: %v", err) + } + sioVol.sioMgr.client = sio + + if err := sioUnmounter.TearDown(); err != nil { + t.Errorf("Expected success, got: %v", err) + } + // is mount point gone ? + if _, err := os.Stat(path); err == nil { + t.Errorf("TearDown() failed, volume path still exists: %s", path) + } else if !os.IsNotExist(err) { + t.Errorf("SetUp() failed: %v", err) + } + // are we still mapped + if sio.volume.MappedSdcInfo != nil { + t.Errorf("expected SdcMappedInfo to be nil, volume may still be mapped") + } +} + +func TestVolumeProvisioner(t *testing.T) { + plugMgr, tmpDir := newPluginMgr(t) + defer os.RemoveAll(tmpDir) + + plug, err := plugMgr.FindPluginByName(sioPluginName) + if err != nil { + t.Errorf("Can't find the plugin %v", sioPluginName) + } + sioPlug, ok := plug.(*sioPlugin) + if !ok { + t.Errorf("Cannot assert plugin to be type sioPlugin") + } + + options := volume.VolumeOptions{ + ClusterName: "testcluster", + PVName: "pvc-sio-dynamic-vol", + PVC: volumetest.CreateTestPVC("100Mi", []api.PersistentVolumeAccessMode{api.ReadWriteOnce}), + PersistentVolumeReclaimPolicy: api.PersistentVolumeReclaimDelete, + } + options.PVC.Namespace = testns + + // incomplete options, test should fail + _, err = sioPlug.NewProvisioner(options) + if err == nil { + t.Fatal("expected failure due to incomplete options") + } + + options.Parameters = map[string]string{ + confKey.gateway: "http://test.scaleio:11111", + confKey.system: "sio", + confKey.protectionDomain: testSioPD, + confKey.storagePool: "default", + confKey.secretRef: "sio-secret", + } + + provisioner, err := sioPlug.NewProvisioner(options) + if err != nil { + t.Fatalf("failed to create new provisioner: %v", err) + } + if provisioner == nil { + t.Fatal("got a nil provisioner") + } + sio := newFakeSio() + sioVol := provisioner.(*sioVolume) + if err := sioVol.setSioMgrFromConfig(); err != nil { + t.Fatalf("failed to create scaleio mgr from config: %v", err) + } + sioVol.sioMgr.client = sio + + spec, err := provisioner.Provision() + if err != nil { + t.Fatalf("call to Provision() failed: %v", err) + } + + spec.Spec.ClaimRef = &api.ObjectReference{Namespace: testns} + + // validate provision + actualSpecName := spec.Name + actualVolName := spec.Spec.PersistentVolumeSource.ScaleIO.VolumeName + if !strings.HasPrefix(actualSpecName, "pvc-") { + t.Errorf("expecting volume name to start with pov-, got %s", actualSpecName) + } + + vol, err := sio.FindVolume(actualVolName) + if err != nil { + t.Fatalf("failed getting volume %v: %v", actualVolName, err) + } + if vol.Name != actualVolName { + t.Errorf("expected volume name to be %s, got %s", actualVolName, vol.Name) + } + + // mount dynamic vol + sioMounter, err := sioPlug.NewMounter( + volume.NewSpecFromPersistentVolume(spec, false), + &api.Pod{ObjectMeta: meta.ObjectMeta{UID: podUID, Namespace: testns}}, + volume.VolumeOptions{}, + ) + if err != nil { + t.Fatalf("Failed to make a new Mounter: %v", err) + } + sioVol = sioMounter.(*sioVolume) + if err := sioVol.setSioMgr(); err != nil { + t.Fatalf("failed to create sio mgr: %v", err) + } + sioVol.sioMgr.client = sio + if err := sioMounter.SetUp(nil); err != nil { + t.Errorf("Expected success, got: %v", err) + } + // teardown dynamic vol + sioUnmounter, err := sioPlug.NewUnmounter(spec.Name, podUID) + if err != nil { + t.Fatalf("Failed to make a new Unmounter: %v", err) + } + sioVol = sioUnmounter.(*sioVolume) + if err := sioVol.resetSioMgr(); err != nil { + t.Fatalf("failed to reset sio mgr: %v", err) + } + sioVol.sioMgr.client = sio + if err := sioUnmounter.TearDown(); err != nil { + t.Errorf("Expected success, got: %v", err) + } + + // test deleter + deleter, err := sioPlug.NewDeleter(volume.NewSpecFromPersistentVolume(spec, false)) + if err != nil { + t.Fatalf("failed to create a deleter %v", err) + } + sioVol = deleter.(*sioVolume) + if err := sioVol.setSioMgrFromSpec(); err != nil { + t.Fatalf("failed to set sio mgr: %v", err) + } + sioVol.sioMgr.client = sio + if err := deleter.Delete(); err != nil { + t.Fatalf("failed while deleteing vol: %v", err) + } + path := deleter.GetPath() + if _, err := os.Stat(path); err == nil { + t.Errorf("TearDown() failed, volume path still exists: %s", path) + } else if !os.IsNotExist(err) { + t.Errorf("Deleter did not delete path %v: %v", path, err) + } +} diff --git a/staging/src/k8s.io/client-go/pkg/api/types.go b/staging/src/k8s.io/client-go/pkg/api/types.go index 1b910e3e4ac..f95c5337f0c 100644 --- a/staging/src/k8s.io/client-go/pkg/api/types.go +++ b/staging/src/k8s.io/client-go/pkg/api/types.go @@ -299,6 +299,9 @@ type VolumeSource struct { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional PortworxVolume *PortworxVolumeSource + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + ScaleIO *ScaleIOVolumeSource } // Similar to VolumeSource but meant for the administrator who creates PVs. @@ -364,6 +367,9 @@ type PersistentVolumeSource struct { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional PortworxVolume *PortworxVolumeSource + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + ScaleIO *ScaleIOVolumeSource } type PersistentVolumeClaimVolumeSource struct { @@ -1056,6 +1062,41 @@ type AzureDiskVolumeSource struct { ReadOnly *bool } +// ScaleIOVolumeSource represents a persistent ScaleIO volume +type ScaleIOVolumeSource struct { + // The host address of the ScaleIO API Gateway. + Gateway string + // The name of the storage system as configured in ScaleIO. + System string + // SecretRef references to the secret for ScaleIO user and other + // sensitive information. If this is not provided, Login operation will fail. + SecretRef *LocalObjectReference + // Flag to enable/disable SSL communication with Gateway, default false + // +optional + SSLEnabled bool + // The name of the Protection Domain for the configured storage (defaults to "default"). + // +optional + ProtectionDomain string + // The Storage Pool associated with the protection domain (defaults to "default"). + // +optional + StoragePool string + // Indicates whether the storage for a volume should be thick or thin (defaults to "thin"). + // +optional + StorageMode string + // The name of a volume already created in the ScaleIO system + // that is associated with this volume source. + VolumeName string + // Filesystem type to mount. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // +optional + FSType string + // Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + ReadOnly bool +} + // Adapts a ConfigMap into a volume. // // The contents of the target ConfigMap's Data field will be presented in a diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/defaults.go b/staging/src/k8s.io/client-go/pkg/api/v1/defaults.go index 188954e75fc..b7080d55335 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/defaults.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/defaults.go @@ -359,3 +359,18 @@ func SetDefaults_RBDVolumeSource(obj *RBDVolumeSource) { obj.Keyring = "/etc/ceph/keyring" } } + +func SetDefaults_ScaleIOVolumeSource(obj *ScaleIOVolumeSource) { + if obj.ProtectionDomain == "" { + obj.ProtectionDomain = "default" + } + if obj.StoragePool == "" { + obj.StoragePool = "default" + } + if obj.StorageMode == "" { + obj.StorageMode = "ThinProvisioned" + } + if obj.FSType == "" { + obj.FSType = "xfs" + } +} diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go b/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go index c07413e7d14..20f632dc992 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go @@ -165,6 +165,7 @@ limitations under the License. ResourceQuotaStatus ResourceRequirements SELinuxOptions + ScaleIOVolumeSource Secret SecretEnvSource SecretKeySelector @@ -809,112 +810,116 @@ func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } +func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } +func (*ScaleIOVolumeSource) ProtoMessage() {} +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } + func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{164} + return fileDescriptorGenerated, []int{165} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{165} + return fileDescriptorGenerated, []int{166} } func init() { @@ -1058,6 +1063,7 @@ func init() { proto.RegisterType((*ResourceQuotaStatus)(nil), "k8s.io.client-go.pkg.api.v1.ResourceQuotaStatus") proto.RegisterType((*ResourceRequirements)(nil), "k8s.io.client-go.pkg.api.v1.ResourceRequirements") proto.RegisterType((*SELinuxOptions)(nil), "k8s.io.client-go.pkg.api.v1.SELinuxOptions") + proto.RegisterType((*ScaleIOVolumeSource)(nil), "k8s.io.client-go.pkg.api.v1.ScaleIOVolumeSource") proto.RegisterType((*Secret)(nil), "k8s.io.client-go.pkg.api.v1.Secret") proto.RegisterType((*SecretEnvSource)(nil), "k8s.io.client-go.pkg.api.v1.SecretEnvSource") proto.RegisterType((*SecretKeySelector)(nil), "k8s.io.client-go.pkg.api.v1.SecretKeySelector") @@ -5482,6 +5488,18 @@ func (m *PersistentVolumeSource) MarshalTo(data []byte) (int, error) { } i += n110 } + if m.ScaleIO != nil { + data[i] = 0x9a + i++ + data[i] = 0x1 + i++ + i = encodeVarintGenerated(data, i, uint64(m.ScaleIO.Size())) + n111, err := m.ScaleIO.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n111 + } return i, nil } @@ -5515,21 +5533,21 @@ func (m *PersistentVolumeSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n111, err := (&v).MarshalTo(data[i:]) + n112, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n111 + i += n112 } } data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PersistentVolumeSource.Size())) - n112, err := m.PersistentVolumeSource.MarshalTo(data[i:]) + n113, err := m.PersistentVolumeSource.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n112 + i += n113 if len(m.AccessModes) > 0 { for _, s := range m.AccessModes { data[i] = 0x1a @@ -5549,11 +5567,11 @@ func (m *PersistentVolumeSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.ClaimRef.Size())) - n113, err := m.ClaimRef.MarshalTo(data[i:]) + n114, err := m.ClaimRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n113 + i += n114 } data[i] = 0x2a i++ @@ -5640,27 +5658,27 @@ func (m *Pod) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n114, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n114 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n115, err := m.Spec.MarshalTo(data[i:]) + n115, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n115 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n116, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n116, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n116 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n117, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n117 return i, nil } @@ -5725,11 +5743,11 @@ func (m *PodAffinityTerm) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LabelSelector.Size())) - n117, err := m.LabelSelector.MarshalTo(data[i:]) + n118, err := m.LabelSelector.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n117 + i += n118 } if len(m.Namespaces) > 0 { for _, s := range m.Namespaces { @@ -5875,19 +5893,19 @@ func (m *PodCondition) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.LastProbeTime.Size())) - n118, err := m.LastProbeTime.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n118 - data[i] = 0x22 - i++ - i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) - n119, err := m.LastTransitionTime.MarshalTo(data[i:]) + n119, err := m.LastProbeTime.MarshalTo(data[i:]) if err != nil { return 0, err } i += n119 + data[i] = 0x22 + i++ + i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) + n120, err := m.LastTransitionTime.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n120 data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -5986,11 +6004,11 @@ func (m *PodList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n120, err := m.ListMeta.MarshalTo(data[i:]) + n121, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n120 + i += n121 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -6050,11 +6068,11 @@ func (m *PodLogOptions) MarshalTo(data []byte) (int, error) { data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(m.SinceTime.Size())) - n121, err := m.SinceTime.MarshalTo(data[i:]) + n122, err := m.SinceTime.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n121 + i += n122 } data[i] = 0x30 i++ @@ -6143,11 +6161,11 @@ func (m *PodSecurityContext) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.SELinuxOptions.Size())) - n122, err := m.SELinuxOptions.MarshalTo(data[i:]) + n123, err := m.SELinuxOptions.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n122 + i += n123 } if m.RunAsUser != nil { data[i] = 0x10 @@ -6198,11 +6216,11 @@ func (m *PodSignature) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.PodController.Size())) - n123, err := m.PodController.MarshalTo(data[i:]) + n124, err := m.PodController.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n123 + i += n124 } return i, nil } @@ -6321,11 +6339,11 @@ func (m *PodSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x72 i++ i = encodeVarintGenerated(data, i, uint64(m.SecurityContext.Size())) - n124, err := m.SecurityContext.MarshalTo(data[i:]) + n125, err := m.SecurityContext.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n124 + i += n125 } if len(m.ImagePullSecrets) > 0 { for _, msg := range m.ImagePullSecrets { @@ -6357,11 +6375,11 @@ func (m *PodSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.Affinity.Size())) - n125, err := m.Affinity.MarshalTo(data[i:]) + n126, err := m.Affinity.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n125 + i += n126 } data[i] = 0x9a i++ @@ -6463,11 +6481,11 @@ func (m *PodStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x3a i++ i = encodeVarintGenerated(data, i, uint64(m.StartTime.Size())) - n126, err := m.StartTime.MarshalTo(data[i:]) + n127, err := m.StartTime.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n126 + i += n127 } if len(m.ContainerStatuses) > 0 { for _, msg := range m.ContainerStatuses { @@ -6518,19 +6536,19 @@ func (m *PodStatusResult) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n127, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n127 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n128, err := m.Status.MarshalTo(data[i:]) + n128, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n128 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n129, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n129 return i, nil } @@ -6552,19 +6570,19 @@ func (m *PodTemplate) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n129, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n129 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Template.Size())) - n130, err := m.Template.MarshalTo(data[i:]) + n130, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n130 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Template.Size())) + n131, err := m.Template.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n131 return i, nil } @@ -6586,11 +6604,11 @@ func (m *PodTemplateList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n131, err := m.ListMeta.MarshalTo(data[i:]) + n132, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n131 + i += n132 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -6624,19 +6642,19 @@ func (m *PodTemplateSpec) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n132, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n132 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n133, err := m.Spec.MarshalTo(data[i:]) + n133, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n133 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n134, err := m.Spec.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n134 return i, nil } @@ -6716,19 +6734,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.PodSignature.Size())) - n134, err := m.PodSignature.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n134 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.EvictionTime.Size())) - n135, err := m.EvictionTime.MarshalTo(data[i:]) + n135, err := m.PodSignature.MarshalTo(data[i:]) if err != nil { return 0, err } i += n135 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.EvictionTime.Size())) + n136, err := m.EvictionTime.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n136 data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -6761,11 +6779,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Preference.Size())) - n136, err := m.Preference.MarshalTo(data[i:]) + n137, err := m.Preference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n136 + i += n137 return i, nil } @@ -6787,11 +6805,11 @@ func (m *Probe) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Handler.Size())) - n137, err := m.Handler.MarshalTo(data[i:]) + n138, err := m.Handler.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n137 + i += n138 data[i] = 0x10 i++ i = encodeVarintGenerated(data, i, uint64(m.InitialDelaySeconds)) @@ -6941,11 +6959,11 @@ func (m *RBDVolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x3a i++ i = encodeVarintGenerated(data, i, uint64(m.SecretRef.Size())) - n138, err := m.SecretRef.MarshalTo(data[i:]) + n139, err := m.SecretRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n138 + i += n139 } data[i] = 0x40 i++ @@ -6976,11 +6994,11 @@ func (m *RangeAllocation) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n139, err := m.ObjectMeta.MarshalTo(data[i:]) + n140, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n139 + i += n140 data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Range))) @@ -7012,27 +7030,27 @@ func (m *ReplicationController) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n140, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n140 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n141, err := m.Spec.MarshalTo(data[i:]) + n141, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n141 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n142, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n142, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n142 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n143, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n143 return i, nil } @@ -7062,11 +7080,11 @@ func (m *ReplicationControllerCondition) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) - n143, err := m.LastTransitionTime.MarshalTo(data[i:]) + n144, err := m.LastTransitionTime.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n143 + i += n144 data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -7096,11 +7114,11 @@ func (m *ReplicationControllerList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n144, err := m.ListMeta.MarshalTo(data[i:]) + n145, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n144 + i += n145 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7157,11 +7175,11 @@ func (m *ReplicationControllerSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.Template.Size())) - n145, err := m.Template.MarshalTo(data[i:]) + n146, err := m.Template.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n145 + i += n146 } data[i] = 0x20 i++ @@ -7240,11 +7258,11 @@ func (m *ResourceFieldSelector) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.Divisor.Size())) - n146, err := m.Divisor.MarshalTo(data[i:]) + n147, err := m.Divisor.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n146 + i += n147 return i, nil } @@ -7266,27 +7284,27 @@ func (m *ResourceQuota) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n147, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n147 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n148, err := m.Spec.MarshalTo(data[i:]) + n148, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n148 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n149, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n149, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n149 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n150, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n150 return i, nil } @@ -7308,11 +7326,11 @@ func (m *ResourceQuotaList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n150, err := m.ListMeta.MarshalTo(data[i:]) + n151, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n150 + i += n151 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7358,11 +7376,11 @@ func (m *ResourceQuotaSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n151, err := (&v).MarshalTo(data[i:]) + n152, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n151 + i += n152 } } if len(m.Scopes) > 0 { @@ -7413,11 +7431,11 @@ func (m *ResourceQuotaStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n152, err := (&v).MarshalTo(data[i:]) + n153, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n152 + i += n153 } } if len(m.Used) > 0 { @@ -7435,11 +7453,11 @@ func (m *ResourceQuotaStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n153, err := (&v).MarshalTo(data[i:]) + n154, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n153 + i += n154 } } return i, nil @@ -7475,11 +7493,11 @@ func (m *ResourceRequirements) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n154, err := (&v).MarshalTo(data[i:]) + n155, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n154 + i += n155 } } if len(m.Requests) > 0 { @@ -7497,11 +7515,11 @@ func (m *ResourceRequirements) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n155, err := (&v).MarshalTo(data[i:]) + n156, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n155 + i += n156 } } return i, nil @@ -7541,6 +7559,78 @@ func (m *SELinuxOptions) MarshalTo(data []byte) (int, error) { return i, nil } +func (m *ScaleIOVolumeSource) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *ScaleIOVolumeSource) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.Gateway))) + i += copy(data[i:], m.Gateway) + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.System))) + i += copy(data[i:], m.System) + if m.SecretRef != nil { + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.SecretRef.Size())) + n157, err := m.SecretRef.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n157 + } + data[i] = 0x20 + i++ + if m.SSLEnabled { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + data[i] = 0x2a + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.ProtectionDomain))) + i += copy(data[i:], m.ProtectionDomain) + data[i] = 0x32 + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.StoragePool))) + i += copy(data[i:], m.StoragePool) + data[i] = 0x3a + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.StorageMode))) + i += copy(data[i:], m.StorageMode) + data[i] = 0x42 + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.VolumeName))) + i += copy(data[i:], m.VolumeName) + data[i] = 0x4a + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.FSType))) + i += copy(data[i:], m.FSType) + data[i] = 0x50 + i++ + if m.ReadOnly { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + return i, nil +} + func (m *Secret) Marshal() (data []byte, err error) { size := m.Size() data = make([]byte, size) @@ -7559,11 +7649,11 @@ func (m *Secret) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n156, err := m.ObjectMeta.MarshalTo(data[i:]) + n158, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n156 + i += n158 if len(m.Data) > 0 { for k := range m.Data { data[i] = 0x12 @@ -7623,11 +7713,11 @@ func (m *SecretEnvSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) - n157, err := m.LocalObjectReference.MarshalTo(data[i:]) + n159, err := m.LocalObjectReference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n157 + i += n159 if m.Optional != nil { data[i] = 0x10 i++ @@ -7659,11 +7749,11 @@ func (m *SecretKeySelector) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) - n158, err := m.LocalObjectReference.MarshalTo(data[i:]) + n160, err := m.LocalObjectReference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n158 + i += n160 data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Key))) @@ -7699,11 +7789,11 @@ func (m *SecretList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n159, err := m.ListMeta.MarshalTo(data[i:]) + n161, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n159 + i += n161 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7737,11 +7827,11 @@ func (m *SecretProjection) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) - n160, err := m.LocalObjectReference.MarshalTo(data[i:]) + n162, err := m.LocalObjectReference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n160 + i += n162 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7835,11 +7925,11 @@ func (m *SecurityContext) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Capabilities.Size())) - n161, err := m.Capabilities.MarshalTo(data[i:]) + n163, err := m.Capabilities.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n161 + i += n163 } if m.Privileged != nil { data[i] = 0x10 @@ -7855,11 +7945,11 @@ func (m *SecurityContext) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.SELinuxOptions.Size())) - n162, err := m.SELinuxOptions.MarshalTo(data[i:]) + n164, err := m.SELinuxOptions.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n162 + i += n164 } if m.RunAsUser != nil { data[i] = 0x20 @@ -7907,11 +7997,11 @@ func (m *SerializedReference) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Reference.Size())) - n163, err := m.Reference.MarshalTo(data[i:]) + n165, err := m.Reference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n163 + i += n165 return i, nil } @@ -7933,27 +8023,27 @@ func (m *Service) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n164, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n164 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n165, err := m.Spec.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n165 - data[i] = 0x1a - i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n166, err := m.Status.MarshalTo(data[i:]) + n166, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n166 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n167, err := m.Spec.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n167 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n168, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n168 return i, nil } @@ -7975,11 +8065,11 @@ func (m *ServiceAccount) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n167, err := m.ObjectMeta.MarshalTo(data[i:]) + n169, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n167 + i += n169 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { data[i] = 0x12 @@ -8035,11 +8125,11 @@ func (m *ServiceAccountList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n168, err := m.ListMeta.MarshalTo(data[i:]) + n170, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n168 + i += n170 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -8073,11 +8163,11 @@ func (m *ServiceList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n169, err := m.ListMeta.MarshalTo(data[i:]) + n171, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n169 + i += n171 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -8122,11 +8212,11 @@ func (m *ServicePort) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.TargetPort.Size())) - n170, err := m.TargetPort.MarshalTo(data[i:]) + n172, err := m.TargetPort.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n170 + i += n172 data[i] = 0x28 i++ i = encodeVarintGenerated(data, i, uint64(m.NodePort)) @@ -8285,11 +8375,11 @@ func (m *ServiceStatus) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LoadBalancer.Size())) - n171, err := m.LoadBalancer.MarshalTo(data[i:]) + n173, err := m.LoadBalancer.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n171 + i += n173 return i, nil } @@ -8337,11 +8427,11 @@ func (m *TCPSocketAction) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Port.Size())) - n172, err := m.Port.MarshalTo(data[i:]) + n174, err := m.Port.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n172 + i += n174 return i, nil } @@ -8375,11 +8465,11 @@ func (m *Taint) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.TimeAdded.Size())) - n173, err := m.TimeAdded.MarshalTo(data[i:]) + n175, err := m.TimeAdded.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n173 + i += n175 return i, nil } @@ -8444,11 +8534,11 @@ func (m *Volume) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.VolumeSource.Size())) - n174, err := m.VolumeSource.MarshalTo(data[i:]) + n176, err := m.VolumeSource.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n174 + i += n176 return i, nil } @@ -8509,31 +8599,31 @@ func (m *VolumeProjection) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) - n175, err := m.Secret.MarshalTo(data[i:]) + n177, err := m.Secret.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n175 + i += n177 } if m.DownwardAPI != nil { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.DownwardAPI.Size())) - n176, err := m.DownwardAPI.MarshalTo(data[i:]) + n178, err := m.DownwardAPI.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n176 + i += n178 } if m.ConfigMap != nil { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.ConfigMap.Size())) - n177, err := m.ConfigMap.MarshalTo(data[i:]) + n179, err := m.ConfigMap.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n177 + i += n179 } return i, nil } @@ -8557,163 +8647,163 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.HostPath.Size())) - n178, err := m.HostPath.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n178 - } - if m.EmptyDir != nil { - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.EmptyDir.Size())) - n179, err := m.EmptyDir.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n179 - } - if m.GCEPersistentDisk != nil { - data[i] = 0x1a - i++ - i = encodeVarintGenerated(data, i, uint64(m.GCEPersistentDisk.Size())) - n180, err := m.GCEPersistentDisk.MarshalTo(data[i:]) + n180, err := m.HostPath.MarshalTo(data[i:]) if err != nil { return 0, err } i += n180 } - if m.AWSElasticBlockStore != nil { - data[i] = 0x22 + if m.EmptyDir != nil { + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.AWSElasticBlockStore.Size())) - n181, err := m.AWSElasticBlockStore.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.EmptyDir.Size())) + n181, err := m.EmptyDir.MarshalTo(data[i:]) if err != nil { return 0, err } i += n181 } - if m.GitRepo != nil { - data[i] = 0x2a + if m.GCEPersistentDisk != nil { + data[i] = 0x1a i++ - i = encodeVarintGenerated(data, i, uint64(m.GitRepo.Size())) - n182, err := m.GitRepo.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.GCEPersistentDisk.Size())) + n182, err := m.GCEPersistentDisk.MarshalTo(data[i:]) if err != nil { return 0, err } i += n182 } - if m.Secret != nil { - data[i] = 0x32 + if m.AWSElasticBlockStore != nil { + data[i] = 0x22 i++ - i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) - n183, err := m.Secret.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.AWSElasticBlockStore.Size())) + n183, err := m.AWSElasticBlockStore.MarshalTo(data[i:]) if err != nil { return 0, err } i += n183 } - if m.NFS != nil { - data[i] = 0x3a + if m.GitRepo != nil { + data[i] = 0x2a i++ - i = encodeVarintGenerated(data, i, uint64(m.NFS.Size())) - n184, err := m.NFS.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.GitRepo.Size())) + n184, err := m.GitRepo.MarshalTo(data[i:]) if err != nil { return 0, err } i += n184 } - if m.ISCSI != nil { - data[i] = 0x42 + if m.Secret != nil { + data[i] = 0x32 i++ - i = encodeVarintGenerated(data, i, uint64(m.ISCSI.Size())) - n185, err := m.ISCSI.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) + n185, err := m.Secret.MarshalTo(data[i:]) if err != nil { return 0, err } i += n185 } - if m.Glusterfs != nil { - data[i] = 0x4a + if m.NFS != nil { + data[i] = 0x3a i++ - i = encodeVarintGenerated(data, i, uint64(m.Glusterfs.Size())) - n186, err := m.Glusterfs.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.NFS.Size())) + n186, err := m.NFS.MarshalTo(data[i:]) if err != nil { return 0, err } i += n186 } - if m.PersistentVolumeClaim != nil { - data[i] = 0x52 + if m.ISCSI != nil { + data[i] = 0x42 i++ - i = encodeVarintGenerated(data, i, uint64(m.PersistentVolumeClaim.Size())) - n187, err := m.PersistentVolumeClaim.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.ISCSI.Size())) + n187, err := m.ISCSI.MarshalTo(data[i:]) if err != nil { return 0, err } i += n187 } - if m.RBD != nil { - data[i] = 0x5a + if m.Glusterfs != nil { + data[i] = 0x4a i++ - i = encodeVarintGenerated(data, i, uint64(m.RBD.Size())) - n188, err := m.RBD.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Glusterfs.Size())) + n188, err := m.Glusterfs.MarshalTo(data[i:]) if err != nil { return 0, err } i += n188 } - if m.FlexVolume != nil { - data[i] = 0x62 + if m.PersistentVolumeClaim != nil { + data[i] = 0x52 i++ - i = encodeVarintGenerated(data, i, uint64(m.FlexVolume.Size())) - n189, err := m.FlexVolume.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.PersistentVolumeClaim.Size())) + n189, err := m.PersistentVolumeClaim.MarshalTo(data[i:]) if err != nil { return 0, err } i += n189 } - if m.Cinder != nil { - data[i] = 0x6a + if m.RBD != nil { + data[i] = 0x5a i++ - i = encodeVarintGenerated(data, i, uint64(m.Cinder.Size())) - n190, err := m.Cinder.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.RBD.Size())) + n190, err := m.RBD.MarshalTo(data[i:]) if err != nil { return 0, err } i += n190 } - if m.CephFS != nil { - data[i] = 0x72 + if m.FlexVolume != nil { + data[i] = 0x62 i++ - i = encodeVarintGenerated(data, i, uint64(m.CephFS.Size())) - n191, err := m.CephFS.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.FlexVolume.Size())) + n191, err := m.FlexVolume.MarshalTo(data[i:]) if err != nil { return 0, err } i += n191 } - if m.Flocker != nil { - data[i] = 0x7a + if m.Cinder != nil { + data[i] = 0x6a i++ - i = encodeVarintGenerated(data, i, uint64(m.Flocker.Size())) - n192, err := m.Flocker.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Cinder.Size())) + n192, err := m.Cinder.MarshalTo(data[i:]) if err != nil { return 0, err } i += n192 } + if m.CephFS != nil { + data[i] = 0x72 + i++ + i = encodeVarintGenerated(data, i, uint64(m.CephFS.Size())) + n193, err := m.CephFS.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n193 + } + if m.Flocker != nil { + data[i] = 0x7a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Flocker.Size())) + n194, err := m.Flocker.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n194 + } if m.DownwardAPI != nil { data[i] = 0x82 i++ data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.DownwardAPI.Size())) - n193, err := m.DownwardAPI.MarshalTo(data[i:]) + n195, err := m.DownwardAPI.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n193 + i += n195 } if m.FC != nil { data[i] = 0x8a @@ -8721,11 +8811,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.FC.Size())) - n194, err := m.FC.MarshalTo(data[i:]) + n196, err := m.FC.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n194 + i += n196 } if m.AzureFile != nil { data[i] = 0x92 @@ -8733,11 +8823,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.AzureFile.Size())) - n195, err := m.AzureFile.MarshalTo(data[i:]) + n197, err := m.AzureFile.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n195 + i += n197 } if m.ConfigMap != nil { data[i] = 0x9a @@ -8745,11 +8835,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.ConfigMap.Size())) - n196, err := m.ConfigMap.MarshalTo(data[i:]) + n198, err := m.ConfigMap.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n196 + i += n198 } if m.VsphereVolume != nil { data[i] = 0xa2 @@ -8757,11 +8847,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.VsphereVolume.Size())) - n197, err := m.VsphereVolume.MarshalTo(data[i:]) + n199, err := m.VsphereVolume.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n197 + i += n199 } if m.Quobyte != nil { data[i] = 0xaa @@ -8769,11 +8859,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.Quobyte.Size())) - n198, err := m.Quobyte.MarshalTo(data[i:]) + n200, err := m.Quobyte.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n198 + i += n200 } if m.AzureDisk != nil { data[i] = 0xb2 @@ -8781,11 +8871,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.AzureDisk.Size())) - n199, err := m.AzureDisk.MarshalTo(data[i:]) + n201, err := m.AzureDisk.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n199 + i += n201 } if m.PhotonPersistentDisk != nil { data[i] = 0xba @@ -8793,11 +8883,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.PhotonPersistentDisk.Size())) - n200, err := m.PhotonPersistentDisk.MarshalTo(data[i:]) + n202, err := m.PhotonPersistentDisk.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n200 + i += n202 } if m.PortworxVolume != nil { data[i] = 0xc2 @@ -8805,23 +8895,35 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.PortworxVolume.Size())) - n201, err := m.PortworxVolume.MarshalTo(data[i:]) + n203, err := m.PortworxVolume.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n201 + i += n203 } - if m.Projected != nil { + if m.ScaleIO != nil { data[i] = 0xca i++ data[i] = 0x1 i++ - i = encodeVarintGenerated(data, i, uint64(m.Projected.Size())) - n202, err := m.Projected.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.ScaleIO.Size())) + n204, err := m.ScaleIO.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n202 + i += n204 + } + if m.Projected != nil { + data[i] = 0xd2 + i++ + data[i] = 0x1 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Projected.Size())) + n205, err := m.Projected.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n205 } return i, nil } @@ -8873,11 +8975,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PodAffinityTerm.Size())) - n203, err := m.PodAffinityTerm.MarshalTo(data[i:]) + n206, err := m.PodAffinityTerm.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n203 + i += n206 return i, nil } @@ -10550,6 +10652,10 @@ func (m *PersistentVolumeSource) Size() (n int) { l = m.PortworxVolume.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.ScaleIO != nil { + l = m.ScaleIO.Size() + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -11305,6 +11411,32 @@ func (m *SELinuxOptions) Size() (n int) { return n } +func (m *ScaleIOVolumeSource) Size() (n int) { + var l int + _ = l + l = len(m.Gateway) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.System) + n += 1 + l + sovGenerated(uint64(l)) + if m.SecretRef != nil { + l = m.SecretRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + n += 2 + l = len(m.ProtectionDomain) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.StoragePool) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.StorageMode) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.VolumeName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.FSType) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + return n +} + func (m *Secret) Size() (n int) { var l int _ = l @@ -11770,6 +11902,10 @@ func (m *VolumeSource) Size() (n int) { l = m.PortworxVolume.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.ScaleIO != nil { + l = m.ScaleIO.Size() + n += 2 + l + sovGenerated(uint64(l)) + } if m.Projected != nil { l = m.Projected.Size() n += 2 + l + sovGenerated(uint64(l)) @@ -13148,6 +13284,7 @@ func (this *PersistentVolumeSource) String() string { `AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`, `PhotonPersistentDisk:` + strings.Replace(fmt.Sprintf("%v", this.PhotonPersistentDisk), "PhotonPersistentDiskVolumeSource", "PhotonPersistentDiskVolumeSource", 1) + `,`, `PortworxVolume:` + strings.Replace(fmt.Sprintf("%v", this.PortworxVolume), "PortworxVolumeSource", "PortworxVolumeSource", 1) + `,`, + `ScaleIO:` + strings.Replace(fmt.Sprintf("%v", this.ScaleIO), "ScaleIOVolumeSource", "ScaleIOVolumeSource", 1) + `,`, `}`, }, "") return s @@ -13787,6 +13924,25 @@ func (this *SELinuxOptions) String() string { }, "") return s } +func (this *ScaleIOVolumeSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ScaleIOVolumeSource{`, + `Gateway:` + fmt.Sprintf("%v", this.Gateway) + `,`, + `System:` + fmt.Sprintf("%v", this.System) + `,`, + `SecretRef:` + strings.Replace(fmt.Sprintf("%v", this.SecretRef), "LocalObjectReference", "LocalObjectReference", 1) + `,`, + `SSLEnabled:` + fmt.Sprintf("%v", this.SSLEnabled) + `,`, + `ProtectionDomain:` + fmt.Sprintf("%v", this.ProtectionDomain) + `,`, + `StoragePool:` + fmt.Sprintf("%v", this.StoragePool) + `,`, + `StorageMode:` + fmt.Sprintf("%v", this.StorageMode) + `,`, + `VolumeName:` + fmt.Sprintf("%v", this.VolumeName) + `,`, + `FSType:` + fmt.Sprintf("%v", this.FSType) + `,`, + `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, + `}`, + }, "") + return s +} func (this *Secret) String() string { if this == nil { return "nil" @@ -14127,6 +14283,7 @@ func (this *VolumeSource) String() string { `AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`, `PhotonPersistentDisk:` + strings.Replace(fmt.Sprintf("%v", this.PhotonPersistentDisk), "PhotonPersistentDiskVolumeSource", "PhotonPersistentDiskVolumeSource", 1) + `,`, `PortworxVolume:` + strings.Replace(fmt.Sprintf("%v", this.PortworxVolume), "PortworxVolumeSource", "PortworxVolumeSource", 1) + `,`, + `ScaleIO:` + strings.Replace(fmt.Sprintf("%v", this.ScaleIO), "ScaleIOVolumeSource", "ScaleIOVolumeSource", 1) + `,`, `Projected:` + strings.Replace(fmt.Sprintf("%v", this.Projected), "ProjectedVolumeSource", "ProjectedVolumeSource", 1) + `,`, `}`, }, "") @@ -29884,6 +30041,39 @@ func (m *PersistentVolumeSource) Unmarshal(data []byte) error { return err } iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScaleIO", 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 > l { + return io.ErrUnexpectedEOF + } + if m.ScaleIO == nil { + m.ScaleIO = &ScaleIOVolumeSource{} + } + if err := m.ScaleIO.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -37333,6 +37523,332 @@ func (m *SELinuxOptions) Unmarshal(data []byte) error { } return nil } +func (m *ScaleIOVolumeSource) 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: ScaleIOVolumeSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ScaleIOVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Gateway", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Gateway = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field System", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.System = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", 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 > l { + return io.ErrUnexpectedEOF + } + if m.SecretRef == nil { + m.SecretRef = &LocalObjectReference{} + } + if err := m.SecretRef.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SSLEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.SSLEnabled = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProtectionDomain", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProtectionDomain = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoragePool", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StoragePool = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StorageMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StorageMode = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VolumeName = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FSType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FSType = string(data[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadOnly = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Secret) Unmarshal(data []byte) error { l := len(data) iNdEx := 0 @@ -41631,6 +42147,39 @@ func (m *VolumeSource) Unmarshal(data []byte) error { } iNdEx = postIndex case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScaleIO", 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 > l { + return io.ErrUnexpectedEOF + } + if m.ScaleIO == nil { + m.ScaleIO = &ScaleIOVolumeSource{} + } + if err := m.ScaleIO.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 26: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Projected", wireType) } @@ -41997,681 +42546,693 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 10815 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x98, 0x66, 0x17, 0x5f, 0xfb, 0xf0, 0xdd, 0x87, 0x3b, 0x82, 0x10, 0x79, 0x38, 0x0e, 0x45, - 0xea, 0x48, 0x1e, 0x01, 0xdd, 0x91, 0x14, 0x4f, 0xa2, 0x42, 0x09, 0xc0, 0x02, 0x77, 0xd0, 0x7d, - 0x2d, 0x7b, 0x71, 0x77, 0x14, 0xc5, 0x88, 0x9c, 0xdb, 0x69, 0x00, 0xc3, 0x1b, 0xcc, 0x2c, 0x67, - 0x66, 0x71, 0x07, 0x29, 0xaa, 0xb2, 0x15, 0x95, 0x9c, 0x94, 0x95, 0x84, 0x2e, 0x47, 0x55, 0x29, - 0x27, 0x55, 0x4a, 0xb9, 0x2a, 0x8e, 0xf2, 0x1d, 0x45, 0x65, 0x49, 0xae, 0xc8, 0x49, 0xc5, 0xb1, - 0x1c, 0xb9, 0x2a, 0x71, 0x54, 0xe5, 0x72, 0xec, 0x94, 0x2b, 0xb0, 0x09, 0x55, 0xfc, 0x33, 0x3f, - 0xe2, 0x7f, 0x48, 0x2a, 0x95, 0xea, 0xcf, 0xe9, 0x9e, 0xdd, 0xc5, 0xcc, 0x82, 0x07, 0xf8, 0xa4, - 0xf2, 0xbf, 0xdd, 0xf7, 0x5e, 0xbf, 0xfe, 0x98, 0xee, 0xd7, 0xef, 0xbd, 0x7e, 0xfd, 0x1a, 0xce, - 0xdd, 0xbd, 0x18, 0xcf, 0x79, 0xe1, 0xfc, 0xdd, 0xd6, 0x1d, 0x12, 0x05, 0x24, 0x21, 0xf1, 0x7c, - 0xf3, 0xee, 0xc6, 0xbc, 0xd3, 0xf4, 0xe6, 0xb7, 0xcf, 0xcf, 0x6f, 0x90, 0x80, 0x44, 0x4e, 0x42, - 0xdc, 0xb9, 0x66, 0x14, 0x26, 0x21, 0x7a, 0x8c, 0x53, 0xcf, 0xa5, 0xd4, 0x73, 0xcd, 0xbb, 0x1b, - 0x73, 0x4e, 0xd3, 0x9b, 0xdb, 0x3e, 0x3f, 0xf3, 0xfc, 0x86, 0x97, 0x6c, 0xb6, 0xee, 0xcc, 0x35, - 0xc2, 0xad, 0xf9, 0x8d, 0x70, 0x23, 0x9c, 0x67, 0x85, 0xee, 0xb4, 0xd6, 0xd9, 0x3f, 0xf6, 0x87, - 0xfd, 0xe2, 0xcc, 0x66, 0x5e, 0x14, 0x55, 0x3b, 0x4d, 0x6f, 0xcb, 0x69, 0x6c, 0x7a, 0x01, 0x89, - 0x76, 0x54, 0xe5, 0x11, 0x89, 0xc3, 0x56, 0xd4, 0x20, 0xd9, 0x26, 0x1c, 0x58, 0x2a, 0x9e, 0xdf, - 0x22, 0x89, 0xd3, 0xa1, 0xe1, 0x33, 0xf3, 0xdd, 0x4a, 0x45, 0xad, 0x20, 0xf1, 0xb6, 0xda, 0xab, - 0xf9, 0x78, 0x5e, 0x81, 0xb8, 0xb1, 0x49, 0xb6, 0x9c, 0xb6, 0x72, 0x2f, 0x74, 0x2b, 0xd7, 0x4a, - 0x3c, 0x7f, 0xde, 0x0b, 0x92, 0x38, 0x89, 0x0e, 0xea, 0x53, 0x4c, 0xa2, 0x6d, 0x12, 0xa5, 0x1d, - 0x22, 0xf7, 0x9d, 0xad, 0xa6, 0x4f, 0x3a, 0xf4, 0xc9, 0xfe, 0x43, 0x0b, 0xce, 0x2c, 0xdc, 0xae, - 0x2f, 0xfb, 0x4e, 0x9c, 0x78, 0x8d, 0x45, 0x3f, 0x6c, 0xdc, 0xad, 0x27, 0x61, 0x44, 0x6e, 0x85, - 0x7e, 0x6b, 0x8b, 0xd4, 0xd9, 0xf0, 0xa1, 0x73, 0x30, 0xb4, 0xcd, 0xfe, 0xaf, 0x56, 0xa7, 0xad, - 0x33, 0xd6, 0xd9, 0xca, 0xe2, 0xc4, 0x8f, 0x76, 0x67, 0x3f, 0xb4, 0xb7, 0x3b, 0x3b, 0x74, 0x4b, - 0xc0, 0xb1, 0xa2, 0x40, 0x4f, 0xc3, 0xc0, 0x7a, 0xbc, 0xb6, 0xd3, 0x24, 0xd3, 0x25, 0x46, 0x3b, - 0x26, 0x68, 0x07, 0x56, 0xea, 0x14, 0x8a, 0x05, 0x16, 0xcd, 0x43, 0xa5, 0xe9, 0x44, 0x89, 0x97, - 0x78, 0x61, 0x30, 0x5d, 0x3e, 0x63, 0x9d, 0xed, 0x5f, 0x9c, 0x14, 0xa4, 0x95, 0x9a, 0x44, 0xe0, - 0x94, 0x86, 0x36, 0x23, 0x22, 0x8e, 0x7b, 0x23, 0xf0, 0x77, 0xa6, 0xfb, 0xce, 0x58, 0x67, 0x87, - 0xd2, 0x66, 0x60, 0x01, 0xc7, 0x8a, 0xc2, 0xfe, 0x7e, 0x09, 0x86, 0x16, 0xd6, 0xd7, 0xbd, 0xc0, - 0x4b, 0x76, 0xd0, 0xdb, 0x30, 0x12, 0x84, 0x2e, 0x91, 0xff, 0x59, 0x2f, 0x86, 0x2f, 0x3c, 0x3b, - 0x77, 0xd0, 0x54, 0x9c, 0xbb, 0xae, 0x95, 0x58, 0x9c, 0xd8, 0xdb, 0x9d, 0x1d, 0xd1, 0x21, 0xd8, - 0xe0, 0x88, 0xde, 0x84, 0xe1, 0x66, 0xe8, 0xaa, 0x0a, 0x4a, 0xac, 0x82, 0x67, 0x0e, 0xae, 0xa0, - 0x96, 0x16, 0x58, 0x1c, 0xdf, 0xdb, 0x9d, 0x1d, 0xd6, 0x00, 0x58, 0x67, 0x87, 0x7c, 0x18, 0xa7, - 0x7f, 0x83, 0xc4, 0x53, 0x35, 0x94, 0x59, 0x0d, 0xcf, 0xe7, 0xd7, 0xa0, 0x15, 0x5a, 0x3c, 0xb1, - 0xb7, 0x3b, 0x3b, 0x9e, 0x01, 0xe2, 0x2c, 0x6b, 0xfb, 0x8b, 0x30, 0xb6, 0x90, 0x24, 0x4e, 0x63, - 0x93, 0xb8, 0xfc, 0xfb, 0xa2, 0x17, 0xa1, 0x2f, 0x70, 0xb6, 0x88, 0xf8, 0xfa, 0x67, 0xc4, 0xb0, - 0xf7, 0x5d, 0x77, 0xb6, 0xc8, 0xfe, 0xee, 0xec, 0xc4, 0xcd, 0xc0, 0x7b, 0xb7, 0x25, 0xe6, 0x0c, - 0x85, 0x61, 0x46, 0x8d, 0x2e, 0x00, 0xb8, 0x64, 0xdb, 0x6b, 0x90, 0x9a, 0x93, 0x6c, 0x8a, 0xd9, - 0x80, 0x44, 0x59, 0xa8, 0x2a, 0x0c, 0xd6, 0xa8, 0xec, 0xaf, 0x58, 0x50, 0x59, 0xd8, 0x0e, 0x3d, - 0xb7, 0x16, 0xba, 0x31, 0x6a, 0xc1, 0x78, 0x33, 0x22, 0xeb, 0x24, 0x52, 0xa0, 0x69, 0xeb, 0x4c, - 0xf9, 0xec, 0xf0, 0x85, 0x0b, 0x39, 0xfd, 0x36, 0x0b, 0x2d, 0x07, 0x49, 0xb4, 0xb3, 0xf8, 0x88, - 0xa8, 0x7a, 0x3c, 0x83, 0xc5, 0xd9, 0x3a, 0xec, 0x5f, 0x2a, 0xc1, 0xc9, 0x85, 0x2f, 0xb6, 0x22, - 0x52, 0xf5, 0xe2, 0xbb, 0xd9, 0xa5, 0xe0, 0x7a, 0xf1, 0xdd, 0xeb, 0xe9, 0x60, 0xa8, 0x39, 0x58, - 0x15, 0x70, 0xac, 0x28, 0xd0, 0xf3, 0x30, 0x48, 0x7f, 0xdf, 0xc4, 0xab, 0xa2, 0xf7, 0x27, 0x04, - 0xf1, 0x70, 0xd5, 0x49, 0x9c, 0x2a, 0x47, 0x61, 0x49, 0x83, 0xae, 0xc1, 0x70, 0x83, 0xad, 0xf7, - 0x8d, 0x6b, 0xa1, 0x4b, 0xd8, 0x17, 0xae, 0x2c, 0x3e, 0x47, 0xc9, 0x97, 0x52, 0xf0, 0xfe, 0xee, - 0xec, 0x34, 0x6f, 0x9b, 0x60, 0xa1, 0xe1, 0xb0, 0x5e, 0x1e, 0xd9, 0x6a, 0x21, 0xf6, 0x31, 0x4e, - 0xd0, 0x61, 0x11, 0x9e, 0xd5, 0xd6, 0x54, 0x3f, 0x5b, 0x53, 0x23, 0x5d, 0xd6, 0xd3, 0x3f, 0xb5, - 0xc4, 0x98, 0xac, 0x78, 0xbe, 0x29, 0x1e, 0x2e, 0x00, 0xc4, 0xa4, 0x11, 0x91, 0x44, 0x1b, 0x15, - 0xf5, 0x99, 0xeb, 0x0a, 0x83, 0x35, 0x2a, 0xba, 0xf8, 0xe3, 0x4d, 0x27, 0x62, 0xb3, 0x45, 0x8c, - 0x8d, 0x5a, 0xfc, 0x75, 0x89, 0xc0, 0x29, 0x8d, 0xb1, 0xf8, 0xcb, 0xb9, 0x8b, 0xff, 0xb7, 0x2c, - 0x18, 0x5c, 0xf4, 0x02, 0xd7, 0x0b, 0x36, 0xd0, 0xdb, 0x30, 0x44, 0x25, 0xba, 0xeb, 0x24, 0x8e, - 0x58, 0xf7, 0x1f, 0x93, 0x93, 0x47, 0x17, 0xb0, 0x72, 0xfa, 0xc4, 0x73, 0x94, 0x9a, 0x4e, 0xa2, - 0x1b, 0x77, 0xde, 0x21, 0x8d, 0xe4, 0x1a, 0x49, 0x9c, 0xb4, 0x3b, 0x29, 0x0c, 0x2b, 0xae, 0xe8, - 0x26, 0x0c, 0x24, 0x4e, 0xb4, 0x41, 0x12, 0xb1, 0xec, 0x73, 0x16, 0x25, 0xe7, 0x81, 0xe9, 0x94, - 0x23, 0x41, 0x83, 0xa4, 0x02, 0x72, 0x8d, 0x31, 0xc1, 0x82, 0x99, 0xdd, 0x80, 0x91, 0x25, 0xa7, - 0xe9, 0xdc, 0xf1, 0x7c, 0x2f, 0xf1, 0x48, 0x8c, 0x3e, 0x0a, 0x65, 0xc7, 0x75, 0xd9, 0x02, 0xa8, - 0x2c, 0x9e, 0xdc, 0xdb, 0x9d, 0x2d, 0x2f, 0xb8, 0xee, 0xfe, 0xee, 0x2c, 0x28, 0xaa, 0x1d, 0x4c, - 0x29, 0xd0, 0xb3, 0xd0, 0xe7, 0x46, 0x61, 0x73, 0xba, 0xc4, 0x28, 0x4f, 0xd1, 0x95, 0x5a, 0x8d, - 0xc2, 0x66, 0x86, 0x94, 0xd1, 0xd8, 0x3f, 0x2c, 0x01, 0x5a, 0x22, 0xcd, 0xcd, 0x95, 0xba, 0xf1, - 0x4d, 0xcf, 0xc2, 0xd0, 0x56, 0x18, 0x78, 0x49, 0x18, 0xc5, 0xa2, 0x42, 0x36, 0x2f, 0xae, 0x09, - 0x18, 0x56, 0x58, 0x74, 0x06, 0xfa, 0x9a, 0xe9, 0xf2, 0x1e, 0x91, 0xa2, 0x81, 0x2d, 0x6c, 0x86, - 0xa1, 0x14, 0xad, 0x98, 0x44, 0x62, 0x3e, 0x2b, 0x8a, 0x9b, 0x31, 0x89, 0x30, 0xc3, 0xa4, 0x33, - 0x88, 0xce, 0x2d, 0x31, 0x5b, 0x33, 0x33, 0x88, 0x62, 0xb0, 0x46, 0x85, 0xde, 0x82, 0x0a, 0xff, - 0x87, 0xc9, 0x3a, 0x9b, 0xba, 0xb9, 0x42, 0xe1, 0x6a, 0xd8, 0x70, 0xfc, 0xec, 0xe0, 0x8f, 0xb2, - 0x19, 0x27, 0x19, 0xe1, 0x94, 0xa7, 0x31, 0xe3, 0x06, 0x72, 0x67, 0xdc, 0xdf, 0xb3, 0x00, 0x2d, - 0x79, 0x81, 0x4b, 0xa2, 0x63, 0xd8, 0x3a, 0x7b, 0x5b, 0x0c, 0x7f, 0x4c, 0x9b, 0x16, 0x6e, 0x35, - 0xc3, 0x80, 0x04, 0xc9, 0x52, 0x18, 0xb8, 0x7c, 0x3b, 0xfd, 0x24, 0xf4, 0x25, 0xb4, 0x2a, 0xde, - 0xac, 0xa7, 0xe5, 0x67, 0xa1, 0x15, 0xec, 0xef, 0xce, 0x9e, 0x6a, 0x2f, 0xc1, 0x9a, 0xc0, 0xca, - 0xa0, 0x4f, 0xc0, 0x40, 0x9c, 0x38, 0x49, 0x2b, 0x16, 0x0d, 0x7d, 0x42, 0x36, 0xb4, 0xce, 0xa0, - 0xfb, 0xbb, 0xb3, 0xe3, 0xaa, 0x18, 0x07, 0x61, 0x51, 0x00, 0x3d, 0x03, 0x83, 0x5b, 0x24, 0x8e, - 0x9d, 0x0d, 0x29, 0xe0, 0xc6, 0x45, 0xd9, 0xc1, 0x6b, 0x1c, 0x8c, 0x25, 0x1e, 0x3d, 0x09, 0xfd, - 0x24, 0x8a, 0xc2, 0x48, 0xcc, 0x88, 0x51, 0x41, 0xd8, 0xbf, 0x4c, 0x81, 0x98, 0xe3, 0xec, 0xff, - 0x6e, 0xc1, 0xb8, 0x6a, 0x2b, 0xaf, 0xeb, 0x18, 0x96, 0xbc, 0x0b, 0xd0, 0x90, 0x1d, 0x8c, 0xd9, - 0x42, 0xd3, 0xea, 0xe8, 0x3c, 0xfd, 0xda, 0x07, 0x34, 0xad, 0x43, 0x81, 0x62, 0xac, 0xf1, 0xb5, - 0xff, 0x93, 0x05, 0x27, 0x32, 0x7d, 0xbb, 0xea, 0xc5, 0x09, 0x7a, 0xb3, 0xad, 0x7f, 0x73, 0xc5, - 0xfa, 0x47, 0x4b, 0xb3, 0xde, 0xa9, 0xf9, 0x22, 0x21, 0x5a, 0xdf, 0x30, 0xf4, 0x7b, 0x09, 0xd9, - 0x92, 0xdd, 0x7a, 0xbe, 0x60, 0xb7, 0x78, 0xfb, 0xd2, 0xaf, 0xb4, 0x4a, 0x79, 0x60, 0xce, 0xca, - 0xfe, 0x3f, 0x16, 0x54, 0x96, 0xc2, 0x60, 0xdd, 0xdb, 0xb8, 0xe6, 0x34, 0x8f, 0xe1, 0xfb, 0xd4, - 0xa1, 0x8f, 0x71, 0xe7, 0x5d, 0x38, 0x9f, 0xd7, 0x05, 0xd1, 0xb0, 0x39, 0xba, 0xa7, 0x72, 0x65, - 0x41, 0x89, 0x29, 0x0a, 0xc2, 0x8c, 0xd9, 0xcc, 0xcb, 0x50, 0x51, 0x04, 0x68, 0x02, 0xca, 0x77, - 0x09, 0xd7, 0x24, 0x2b, 0x98, 0xfe, 0x44, 0x53, 0xd0, 0xbf, 0xed, 0xf8, 0x2d, 0xb1, 0x78, 0x31, - 0xff, 0xf3, 0xc9, 0xd2, 0x45, 0xcb, 0xfe, 0x21, 0x5b, 0x81, 0xa2, 0x92, 0xe5, 0x60, 0x5b, 0x08, - 0x87, 0xaf, 0x5a, 0x30, 0xe5, 0x77, 0x10, 0x4a, 0x62, 0x4c, 0x0e, 0x23, 0xce, 0x1e, 0x13, 0xcd, - 0x9e, 0xea, 0x84, 0xc5, 0x1d, 0x6b, 0xa3, 0xb2, 0x3e, 0x6c, 0xd2, 0x09, 0xe7, 0xf8, 0xac, 0xe9, - 0x42, 0x07, 0xb8, 0x21, 0x60, 0x58, 0x61, 0xed, 0x3f, 0xb3, 0x60, 0x4a, 0xf5, 0xe3, 0x0a, 0xd9, - 0xa9, 0x13, 0x9f, 0x34, 0x92, 0x30, 0x7a, 0x58, 0x7a, 0xf2, 0x38, 0xff, 0x26, 0x5c, 0x26, 0x0d, - 0x0b, 0x06, 0xe5, 0x2b, 0x64, 0x87, 0x7f, 0x20, 0xbd, 0xa3, 0xe5, 0x03, 0x3b, 0xfa, 0x6f, 0x2d, - 0x18, 0x55, 0x1d, 0x3d, 0x86, 0x25, 0x77, 0xd5, 0x5c, 0x72, 0x1f, 0x2d, 0x38, 0x5f, 0xbb, 0x2c, - 0xb6, 0xbf, 0x5b, 0xa2, 0x62, 0x43, 0xd0, 0xd4, 0xa2, 0x90, 0x0e, 0x12, 0x95, 0xf8, 0x0f, 0xc9, - 0x57, 0xea, 0xad, 0xb3, 0x57, 0xc8, 0xce, 0x5a, 0x48, 0xb5, 0x89, 0xce, 0x9d, 0x35, 0x3e, 0x6a, - 0xdf, 0x81, 0x1f, 0xf5, 0x77, 0x4b, 0x70, 0x52, 0x0d, 0x8b, 0xb1, 0x4b, 0xff, 0x4c, 0x0e, 0xcc, - 0x79, 0x18, 0x76, 0xc9, 0xba, 0xd3, 0xf2, 0x13, 0x65, 0x4d, 0xf4, 0x73, 0x33, 0xb3, 0x9a, 0x82, - 0xb1, 0x4e, 0xd3, 0xc3, 0x58, 0x7e, 0x73, 0x98, 0xc9, 0xf3, 0xc4, 0xa1, 0xb3, 0x9e, 0x6a, 0x78, - 0x9a, 0x79, 0x38, 0xa2, 0x9b, 0x87, 0xc2, 0x14, 0x7c, 0x12, 0xfa, 0xbd, 0x2d, 0xba, 0xe7, 0x97, - 0xcc, 0xad, 0x7c, 0x95, 0x02, 0x31, 0xc7, 0xa1, 0xa7, 0x60, 0xb0, 0x11, 0x6e, 0x6d, 0x39, 0x81, - 0x3b, 0x5d, 0x66, 0x3a, 0xe7, 0x30, 0x55, 0x0b, 0x96, 0x38, 0x08, 0x4b, 0x1c, 0x7a, 0x0c, 0xfa, - 0x9c, 0x68, 0x23, 0x9e, 0xee, 0x63, 0x34, 0x43, 0xb4, 0xa6, 0x85, 0x68, 0x23, 0xc6, 0x0c, 0x4a, - 0x75, 0xc9, 0x7b, 0x61, 0x74, 0xd7, 0x0b, 0x36, 0xaa, 0x5e, 0xc4, 0x14, 0x43, 0x4d, 0x97, 0xbc, - 0xad, 0x30, 0x58, 0xa3, 0x42, 0x35, 0xe8, 0x6f, 0x86, 0x51, 0x12, 0x4f, 0x0f, 0xb0, 0x81, 0x7f, - 0x2e, 0x77, 0xf9, 0xf1, 0x7e, 0xd7, 0xc2, 0x28, 0x49, 0xbb, 0x42, 0xff, 0xc5, 0x98, 0x33, 0x42, - 0x4b, 0x50, 0x26, 0xc1, 0xf6, 0xf4, 0x20, 0xe3, 0xf7, 0x91, 0x83, 0xf9, 0x2d, 0x07, 0xdb, 0xb7, - 0x9c, 0x28, 0x95, 0x57, 0xcb, 0xc1, 0x36, 0xa6, 0xa5, 0x51, 0x03, 0x2a, 0xd2, 0x85, 0x15, 0x4f, - 0x0f, 0x15, 0x99, 0x8a, 0x58, 0x90, 0x63, 0xf2, 0x6e, 0xcb, 0x8b, 0xc8, 0x16, 0x09, 0x92, 0x38, - 0x35, 0xac, 0x24, 0x36, 0xc6, 0x29, 0x5f, 0xd4, 0x80, 0x11, 0xae, 0x7f, 0x5e, 0x0b, 0x5b, 0x41, - 0x12, 0x4f, 0x57, 0x58, 0x93, 0x73, 0x3c, 0x17, 0xb7, 0xd2, 0x12, 0x8b, 0x53, 0x82, 0xfd, 0x88, - 0x06, 0x8c, 0xb1, 0xc1, 0x14, 0xbd, 0x09, 0xa3, 0xbe, 0xb7, 0x4d, 0x02, 0x12, 0xc7, 0xb5, 0x28, - 0xbc, 0x43, 0xa6, 0x81, 0xf5, 0xe6, 0xc9, 0x3c, 0x2b, 0x3e, 0xbc, 0x43, 0x16, 0x27, 0xf7, 0x76, - 0x67, 0x47, 0xaf, 0xea, 0xa5, 0xb1, 0xc9, 0x0c, 0xbd, 0x05, 0x63, 0x54, 0xd9, 0xf5, 0x52, 0xf6, - 0xc3, 0xc5, 0xd9, 0xa3, 0xbd, 0xdd, 0xd9, 0x31, 0x6c, 0x14, 0xc7, 0x19, 0x76, 0x68, 0x0d, 0x2a, - 0xbe, 0xb7, 0x4e, 0x1a, 0x3b, 0x0d, 0x9f, 0x4c, 0x8f, 0x30, 0xde, 0x39, 0x8b, 0xf3, 0xaa, 0x24, - 0xe7, 0x06, 0x86, 0xfa, 0x8b, 0x53, 0x46, 0xe8, 0x16, 0x9c, 0x4a, 0x48, 0xb4, 0xe5, 0x05, 0x0e, - 0x5d, 0x54, 0x42, 0xfb, 0x65, 0xae, 0x92, 0x51, 0x36, 0x6b, 0x4f, 0x8b, 0x81, 0x3d, 0xb5, 0xd6, - 0x91, 0x0a, 0x77, 0x29, 0x8d, 0x6e, 0xc0, 0x38, 0x5b, 0x4f, 0xb5, 0x96, 0xef, 0xd7, 0x42, 0xdf, - 0x6b, 0xec, 0x4c, 0x8f, 0x31, 0x86, 0x4f, 0x49, 0x07, 0xc8, 0xaa, 0x89, 0xa6, 0x86, 0x61, 0xfa, - 0x0f, 0x67, 0x4b, 0x23, 0x1f, 0xc6, 0x63, 0xd2, 0x68, 0x45, 0x5e, 0xb2, 0x43, 0xe7, 0x3e, 0xb9, - 0x9f, 0x4c, 0x8f, 0x17, 0x31, 0x74, 0xeb, 0x66, 0x21, 0xee, 0x7d, 0xca, 0x00, 0x71, 0x96, 0x35, - 0x15, 0x15, 0x71, 0xe2, 0x7a, 0xc1, 0xf4, 0x04, 0x93, 0x40, 0x6a, 0x7d, 0xd5, 0x29, 0x10, 0x73, - 0x1c, 0xf3, 0x1f, 0xd0, 0x1f, 0x37, 0xa8, 0x94, 0x9e, 0x64, 0x84, 0xa9, 0xff, 0x40, 0x22, 0x70, - 0x4a, 0x43, 0x55, 0x83, 0x24, 0xd9, 0x99, 0x46, 0x8c, 0x54, 0x2d, 0xb5, 0xb5, 0xb5, 0xcf, 0x61, - 0x0a, 0x47, 0xb7, 0x60, 0x90, 0x04, 0xdb, 0x2b, 0x51, 0xb8, 0x35, 0x7d, 0xa2, 0x88, 0x0c, 0x58, - 0xe6, 0xc4, 0x7c, 0xff, 0x48, 0x4d, 0x18, 0x01, 0xc6, 0x92, 0x19, 0xba, 0x0f, 0xd3, 0x1d, 0xbe, - 0x12, 0xff, 0x28, 0x53, 0xec, 0xa3, 0x7c, 0x4a, 0x94, 0x9d, 0x5e, 0xeb, 0x42, 0xb7, 0x7f, 0x00, - 0x0e, 0x77, 0xe5, 0x6e, 0xdf, 0x81, 0x31, 0x25, 0xa8, 0xd8, 0xf7, 0x46, 0xb3, 0xd0, 0x4f, 0x65, - 0xb1, 0x34, 0xe8, 0x2b, 0x74, 0x50, 0xa9, 0x88, 0x8e, 0x31, 0x87, 0xb3, 0x41, 0xf5, 0xbe, 0x48, - 0x16, 0x77, 0x12, 0xc2, 0x0d, 0xbb, 0xb2, 0x36, 0xa8, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0xff, 0x71, - 0x35, 0x29, 0x95, 0x86, 0x05, 0x76, 0x82, 0x73, 0x30, 0xb4, 0x19, 0xc6, 0x09, 0xa5, 0x66, 0x75, - 0xf4, 0xa7, 0x8a, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x02, 0xa3, 0x0d, 0xbd, 0x02, 0xb1, - 0x8d, 0x9d, 0x14, 0x45, 0xcc, 0xda, 0xb1, 0x49, 0x8b, 0x2e, 0xc2, 0x10, 0xf3, 0x72, 0x37, 0x42, - 0x5f, 0x98, 0x90, 0x72, 0x57, 0x1e, 0xaa, 0x09, 0xf8, 0xbe, 0xf6, 0x1b, 0x2b, 0x6a, 0x6a, 0x88, - 0xd3, 0x26, 0xac, 0xd6, 0xc4, 0x06, 0xa2, 0x0c, 0xf1, 0xcb, 0x0c, 0x8a, 0x05, 0xd6, 0xfe, 0xd7, - 0x25, 0x6d, 0x94, 0xa9, 0x01, 0x44, 0xd0, 0x1b, 0x30, 0x78, 0xcf, 0xf1, 0x12, 0x2f, 0xd8, 0x10, - 0xda, 0xc3, 0x0b, 0x05, 0x77, 0x13, 0x56, 0xfc, 0x36, 0x2f, 0xca, 0x77, 0x3e, 0xf1, 0x07, 0x4b, - 0x86, 0x94, 0x77, 0xd4, 0x0a, 0x02, 0xca, 0xbb, 0xd4, 0x3b, 0x6f, 0xcc, 0x8b, 0x72, 0xde, 0xe2, - 0x0f, 0x96, 0x0c, 0xd1, 0x3a, 0x80, 0x9c, 0x4b, 0xc4, 0x15, 0xde, 0xe5, 0x8f, 0xf7, 0xc2, 0x7e, - 0x4d, 0x95, 0x5e, 0x1c, 0xa3, 0x7b, 0x6d, 0xfa, 0x1f, 0x6b, 0x9c, 0xed, 0x84, 0x29, 0x61, 0xed, - 0xcd, 0x42, 0x9f, 0xa7, 0x4b, 0xda, 0x89, 0x12, 0xe2, 0x2e, 0x24, 0x59, 0x07, 0xfd, 0xc1, 0x2a, - 0xf6, 0x9a, 0xb7, 0x45, 0xf4, 0xe5, 0x2f, 0x98, 0xe0, 0x94, 0x9f, 0xfd, 0xbd, 0x32, 0x4c, 0x77, - 0x6b, 0x2e, 0x9d, 0x92, 0xe4, 0xbe, 0x97, 0x2c, 0x51, 0x35, 0xc9, 0x32, 0xa7, 0xe4, 0xb2, 0x80, - 0x63, 0x45, 0x41, 0xe7, 0x46, 0xec, 0x6d, 0x48, 0x63, 0xa9, 0x3f, 0x9d, 0x1b, 0x75, 0x06, 0xc5, - 0x02, 0x4b, 0xe9, 0x22, 0xe2, 0xc4, 0xe2, 0x70, 0x43, 0x9b, 0x43, 0x98, 0x41, 0xb1, 0xc0, 0xea, - 0x0e, 0x91, 0xbe, 0x1c, 0x87, 0x88, 0x31, 0x44, 0xfd, 0x0f, 0x76, 0x88, 0xd0, 0x17, 0x00, 0xd6, - 0xbd, 0xc0, 0x8b, 0x37, 0x19, 0xf7, 0x81, 0x9e, 0xb9, 0x2b, 0x25, 0x6b, 0x45, 0x71, 0xc1, 0x1a, - 0x47, 0xf4, 0x12, 0x0c, 0xab, 0xe5, 0xb9, 0x5a, 0x9d, 0x1e, 0x34, 0x1d, 0xe2, 0xa9, 0xac, 0xaa, - 0x62, 0x9d, 0xce, 0x7e, 0x27, 0x3b, 0x5f, 0xc4, 0xaa, 0xd0, 0xc6, 0xd7, 0x2a, 0x3a, 0xbe, 0xa5, - 0x83, 0xc7, 0xd7, 0xfe, 0x6f, 0x65, 0x18, 0x37, 0x2a, 0x6b, 0xc5, 0x05, 0x24, 0xda, 0x6b, 0x74, - 0xc3, 0x72, 0x12, 0x22, 0xd6, 0xe4, 0xb9, 0x5e, 0x16, 0x8d, 0xbe, 0xbd, 0xd1, 0xb5, 0xc0, 0x39, - 0xa1, 0x4d, 0xa8, 0xf8, 0x4e, 0xcc, 0x5c, 0x2a, 0x44, 0xac, 0xc5, 0xde, 0xd8, 0xa6, 0xe6, 0x87, - 0x13, 0x27, 0xda, 0xee, 0xc1, 0x6b, 0x49, 0x99, 0xd3, 0xdd, 0x96, 0x2a, 0x3b, 0xf2, 0x44, 0x4d, - 0x35, 0x87, 0x6a, 0x44, 0x3b, 0x98, 0xe3, 0xd0, 0x45, 0x18, 0x89, 0x08, 0x9b, 0x29, 0x4b, 0x54, - 0x9f, 0x63, 0x53, 0xaf, 0x3f, 0x55, 0xfc, 0xb0, 0x86, 0xc3, 0x06, 0x65, 0xaa, 0xf7, 0x0f, 0x1c, - 0xa0, 0xf7, 0x3f, 0x03, 0x83, 0xec, 0x87, 0x9a, 0x15, 0xea, 0x0b, 0xad, 0x72, 0x30, 0x96, 0xf8, - 0xec, 0x24, 0x1a, 0x2a, 0x38, 0x89, 0x9e, 0x85, 0xb1, 0xaa, 0x43, 0xb6, 0xc2, 0x60, 0x39, 0x70, - 0x9b, 0xa1, 0x17, 0x24, 0x68, 0x1a, 0xfa, 0xd8, 0x7e, 0xc2, 0xd7, 0x7b, 0x1f, 0xe5, 0x80, 0xfb, - 0xa8, 0xee, 0x6e, 0xff, 0x71, 0x09, 0x46, 0xab, 0xc4, 0x27, 0x09, 0xe1, 0x76, 0x4f, 0x8c, 0x56, - 0x00, 0x6d, 0x44, 0x4e, 0x83, 0xd4, 0x48, 0xe4, 0x85, 0x6e, 0x9d, 0x34, 0xc2, 0x80, 0x1d, 0x44, - 0xd1, 0x0d, 0xf2, 0xd4, 0xde, 0xee, 0x2c, 0xba, 0xd4, 0x86, 0xc5, 0x1d, 0x4a, 0x20, 0x17, 0x46, - 0x9b, 0x11, 0x31, 0xfc, 0x86, 0x56, 0xbe, 0xaa, 0x51, 0xd3, 0x8b, 0x70, 0x6d, 0xd8, 0x00, 0x61, - 0x93, 0x29, 0xfa, 0x0c, 0x4c, 0x84, 0x51, 0x73, 0xd3, 0x09, 0xaa, 0xa4, 0x49, 0x02, 0x97, 0x9a, - 0x00, 0xc2, 0xdb, 0x31, 0xb5, 0xb7, 0x3b, 0x3b, 0x71, 0x23, 0x83, 0xc3, 0x6d, 0xd4, 0xe8, 0x0d, - 0x98, 0x6c, 0x46, 0x61, 0xd3, 0xd9, 0x60, 0x53, 0x46, 0x68, 0x2b, 0x5c, 0x36, 0x9d, 0xdb, 0xdb, - 0x9d, 0x9d, 0xac, 0x65, 0x91, 0xfb, 0xbb, 0xb3, 0x27, 0xd8, 0x90, 0x51, 0x48, 0x8a, 0xc4, 0xed, - 0x6c, 0xec, 0x77, 0xe1, 0x64, 0x35, 0xbc, 0x17, 0xdc, 0x73, 0x22, 0x77, 0xa1, 0xb6, 0xaa, 0x39, - 0x27, 0x5e, 0x97, 0xc6, 0x2f, 0x3f, 0xe0, 0xcb, 0xd9, 0xd9, 0x34, 0x1e, 0xdc, 0xec, 0x58, 0xf1, - 0x7c, 0xd2, 0xc5, 0x1d, 0xf2, 0xcf, 0x4a, 0x46, 0x9d, 0x29, 0xbd, 0x3a, 0xbb, 0xb0, 0xba, 0x9e, - 0x5d, 0x7c, 0x1e, 0x86, 0xd6, 0x3d, 0xe2, 0xbb, 0x98, 0xac, 0x8b, 0xaf, 0x75, 0xbe, 0xc8, 0xe1, - 0xce, 0x0a, 0x2d, 0x23, 0xbd, 0x63, 0xdc, 0x88, 0x5e, 0x11, 0x6c, 0xb0, 0x62, 0x88, 0x5a, 0x30, - 0x21, 0xed, 0x30, 0x89, 0x15, 0x8b, 0xfd, 0x85, 0x62, 0x66, 0x9e, 0x59, 0x0d, 0xfb, 0xbc, 0x38, - 0xc3, 0x10, 0xb7, 0x55, 0x41, 0xed, 0xe7, 0x2d, 0xba, 0xd5, 0xf5, 0xb1, 0xa9, 0xcf, 0xec, 0x67, - 0xe6, 0x0a, 0x60, 0x50, 0xfb, 0xd7, 0x2c, 0x78, 0xa4, 0x6d, 0xb4, 0x84, 0x9f, 0xe4, 0xc8, 0xbe, - 0x51, 0xd6, 0x59, 0x51, 0xca, 0x77, 0x56, 0xd8, 0x37, 0x60, 0x6a, 0x79, 0xab, 0x99, 0xec, 0x54, - 0x3d, 0xf3, 0xc8, 0xe5, 0x65, 0x18, 0xd8, 0x22, 0xae, 0xd7, 0xda, 0x12, 0x9f, 0x75, 0x56, 0xee, - 0x0b, 0xd7, 0x18, 0x74, 0x7f, 0x77, 0x76, 0xb4, 0x9e, 0x84, 0x91, 0xb3, 0x41, 0x38, 0x00, 0x0b, - 0x72, 0xfb, 0x7d, 0x0b, 0xc6, 0xa5, 0x7c, 0x58, 0x70, 0xdd, 0x88, 0xc4, 0x31, 0x9a, 0x81, 0x92, - 0xd7, 0x14, 0x8c, 0x40, 0x30, 0x2a, 0xad, 0xd6, 0x70, 0xc9, 0x6b, 0xa2, 0x37, 0xa0, 0xc2, 0x4f, - 0xea, 0xd2, 0xc9, 0xd1, 0xe3, 0xc9, 0x1f, 0xb3, 0x0d, 0xd7, 0x24, 0x0f, 0x9c, 0xb2, 0x93, 0x5a, - 0x32, 0xdb, 0x79, 0xca, 0xe6, 0xb9, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0x9d, 0x85, 0xa1, 0x20, - 0x74, 0xf9, 0x61, 0x2a, 0x5f, 0xa7, 0x6c, 0xca, 0x5d, 0x17, 0x30, 0xac, 0xb0, 0xf6, 0xd7, 0x2d, - 0x18, 0x91, 0x7d, 0x2c, 0xa8, 0xb0, 0xd3, 0x45, 0x92, 0x2a, 0xeb, 0xe9, 0x22, 0xa1, 0x0a, 0x37, - 0xc3, 0x18, 0x7a, 0x76, 0xb9, 0x17, 0x3d, 0xdb, 0xfe, 0x8d, 0x12, 0x8c, 0xc9, 0xe6, 0xd4, 0x5b, - 0x77, 0x62, 0x42, 0xd5, 0x90, 0x8a, 0xc3, 0x07, 0x9f, 0xc8, 0x79, 0xf6, 0x7c, 0x9e, 0x2d, 0x66, - 0x7c, 0xb3, 0x54, 0xcd, 0x59, 0x90, 0x7c, 0x70, 0xca, 0x12, 0x6d, 0xc3, 0x64, 0x10, 0x26, 0x6c, - 0x7b, 0x53, 0xf8, 0x62, 0x27, 0x1d, 0xd9, 0x7a, 0x1e, 0x15, 0xf5, 0x4c, 0x5e, 0xcf, 0xf2, 0xc3, - 0xed, 0x55, 0xa0, 0x1b, 0xd2, 0xc7, 0x54, 0x66, 0x75, 0x3d, 0x5b, 0xac, 0xae, 0xee, 0x2e, 0x26, - 0xfb, 0x77, 0x2c, 0xa8, 0x48, 0xb2, 0xe3, 0x38, 0xf2, 0xba, 0x0d, 0x83, 0x31, 0xfb, 0x44, 0x72, - 0xb8, 0xce, 0x15, 0xeb, 0x02, 0xff, 0xae, 0xe9, 0x9e, 0xce, 0xff, 0xc7, 0x58, 0x72, 0x63, 0xce, - 0x76, 0xd5, 0x91, 0x87, 0xce, 0xd9, 0xae, 0x5a, 0xd6, 0xfd, 0x64, 0x6b, 0xd4, 0xf0, 0x06, 0x50, - 0xc5, 0xb4, 0x19, 0x91, 0x75, 0xef, 0x7e, 0x56, 0x31, 0xad, 0x31, 0x28, 0x16, 0x58, 0xb4, 0x0e, - 0x23, 0x0d, 0xe9, 0x8e, 0x4e, 0x45, 0xc8, 0xc7, 0x0a, 0xfa, 0xfe, 0xd5, 0x31, 0x12, 0x0f, 0x4d, - 0x5a, 0xd2, 0x38, 0x61, 0x83, 0x2f, 0x95, 0x53, 0xe9, 0x49, 0x79, 0xb9, 0xa0, 0xe3, 0x26, 0x22, - 0x49, 0x5a, 0x43, 0xd7, 0x43, 0x72, 0xfb, 0x5b, 0x16, 0x0c, 0x70, 0xff, 0x65, 0x31, 0x27, 0xb0, - 0x76, 0x40, 0x96, 0x8e, 0xe7, 0x2d, 0x0a, 0x14, 0xe7, 0x65, 0xe8, 0x36, 0x54, 0xd8, 0x0f, 0xe6, - 0x8b, 0x29, 0x17, 0x89, 0xd3, 0xe2, 0xf5, 0xeb, 0x4d, 0xbd, 0x25, 0x19, 0xe0, 0x94, 0x97, 0xfd, - 0x83, 0x32, 0x15, 0x7d, 0x29, 0xa9, 0xb1, 0xb7, 0x5b, 0xc7, 0xb1, 0xb7, 0x97, 0x8e, 0x7e, 0x6f, - 0x7f, 0x17, 0xc6, 0x1b, 0xda, 0x01, 0x5d, 0xfa, 0xc5, 0x2f, 0x14, 0x9c, 0x56, 0xda, 0xa9, 0x1e, - 0xf7, 0xd7, 0x2d, 0x99, 0xec, 0x70, 0x96, 0x3f, 0x22, 0x30, 0xc2, 0xe7, 0x83, 0xa8, 0xaf, 0x8f, - 0xd5, 0x37, 0x5f, 0x64, 0x86, 0xe9, 0x95, 0xb1, 0x59, 0x5c, 0xd7, 0x18, 0x61, 0x83, 0xad, 0xfd, - 0x2b, 0xfd, 0xd0, 0xbf, 0xbc, 0x4d, 0x82, 0xe4, 0x18, 0x44, 0xdd, 0x16, 0x8c, 0x79, 0xc1, 0x76, - 0xe8, 0x6f, 0x13, 0x97, 0xe3, 0x0f, 0xb7, 0xbd, 0x9f, 0x12, 0x95, 0x8c, 0xad, 0x1a, 0xcc, 0x70, - 0x86, 0xf9, 0x51, 0x78, 0x0a, 0x5e, 0x83, 0x01, 0x3e, 0x33, 0x84, 0x9b, 0x20, 0xc7, 0x9f, 0xcf, - 0x06, 0x56, 0xac, 0xa0, 0xd4, 0x9f, 0xc1, 0x8f, 0x12, 0x04, 0x23, 0xf4, 0x0e, 0x8c, 0xad, 0x7b, - 0x51, 0x9c, 0x50, 0x63, 0x3f, 0x4e, 0x9c, 0xad, 0xe6, 0x21, 0x7c, 0x04, 0x6a, 0x44, 0x56, 0x0c, - 0x4e, 0x38, 0xc3, 0x19, 0x6d, 0xc0, 0x28, 0x35, 0x51, 0xd3, 0xaa, 0x06, 0x7b, 0xae, 0x4a, 0xb9, - 0x08, 0xaf, 0xea, 0x8c, 0xb0, 0xc9, 0x97, 0x8a, 0xa4, 0x06, 0x33, 0x69, 0x87, 0x98, 0x76, 0xa3, - 0x44, 0x12, 0xb7, 0x65, 0x39, 0x8e, 0x4a, 0x36, 0x16, 0x29, 0x53, 0x31, 0x25, 0x5b, 0x1a, 0x0f, - 0x63, 0x7f, 0x87, 0xee, 0xc5, 0x74, 0x0c, 0x8f, 0x61, 0xfb, 0xba, 0x6c, 0x6e, 0x5f, 0x4f, 0x16, - 0xf8, 0xb2, 0x5d, 0xb6, 0xae, 0xb7, 0x61, 0x58, 0xfb, 0xf0, 0x68, 0x1e, 0x2a, 0x0d, 0x19, 0xcc, - 0x21, 0xa4, 0xb8, 0x52, 0xa5, 0x54, 0x94, 0x07, 0x4e, 0x69, 0xe8, 0xb8, 0x50, 0x15, 0x34, 0x1b, - 0xfa, 0x45, 0x15, 0x54, 0xcc, 0x30, 0xf6, 0x0b, 0x00, 0xcb, 0xf7, 0x49, 0x63, 0x81, 0x9b, 0x78, - 0xda, 0xf9, 0x9e, 0xd5, 0xfd, 0x7c, 0xcf, 0xfe, 0xb6, 0x05, 0x63, 0x2b, 0x4b, 0x86, 0x4e, 0x3f, - 0x07, 0xc0, 0x75, 0xe3, 0xdb, 0xb7, 0xaf, 0x4b, 0xff, 0x35, 0x77, 0x32, 0x2a, 0x28, 0xd6, 0x28, - 0xd0, 0xa3, 0x50, 0xf6, 0x5b, 0x81, 0x50, 0x59, 0x07, 0xf7, 0x76, 0x67, 0xcb, 0x57, 0x5b, 0x01, - 0xa6, 0x30, 0x2d, 0xc6, 0xaa, 0x5c, 0x38, 0xc6, 0x2a, 0x3f, 0xda, 0xf8, 0x1b, 0x65, 0x98, 0x58, - 0xf1, 0xc9, 0x7d, 0xa3, 0xd5, 0x4f, 0xc3, 0x80, 0x1b, 0x79, 0xdb, 0x24, 0xca, 0x2a, 0x02, 0x55, - 0x06, 0xc5, 0x02, 0x5b, 0x38, 0xec, 0xeb, 0xad, 0xf6, 0x8d, 0xfc, 0xe8, 0x42, 0xde, 0x72, 0xfb, - 0x8c, 0xd6, 0x61, 0x90, 0x9f, 0x07, 0xc7, 0xd3, 0xfd, 0x6c, 0x2a, 0xbe, 0x72, 0x70, 0x63, 0xb2, - 0xe3, 0x33, 0x27, 0xfc, 0x2b, 0x3c, 0xe0, 0x46, 0xc9, 0x32, 0x01, 0xc5, 0x92, 0xf9, 0xcc, 0x27, - 0x61, 0x44, 0xa7, 0xec, 0x29, 0xf2, 0xe6, 0xaf, 0x5b, 0x70, 0x62, 0xc5, 0x0f, 0x1b, 0x77, 0x33, - 0x71, 0x79, 0x2f, 0xc1, 0x30, 0x5d, 0x4c, 0xb1, 0x11, 0xb4, 0x6a, 0x44, 0xe7, 0x0a, 0x14, 0xd6, - 0xe9, 0xb4, 0x62, 0x37, 0x6f, 0xae, 0x56, 0x3b, 0x05, 0xf5, 0x0a, 0x14, 0xd6, 0xe9, 0xec, 0xdf, - 0xb3, 0xe0, 0xf1, 0x4b, 0x4b, 0xcb, 0x35, 0x12, 0xc5, 0x5e, 0x9c, 0x90, 0x20, 0x69, 0x8b, 0x2b, - 0xa6, 0x3a, 0xa3, 0xab, 0x35, 0x25, 0xd5, 0x19, 0xab, 0xac, 0x15, 0x02, 0xfb, 0xb0, 0x04, 0xd7, - 0x7f, 0xcb, 0x82, 0x13, 0x97, 0xbc, 0x04, 0x93, 0x66, 0x98, 0x0d, 0x05, 0x8e, 0x48, 0x33, 0x8c, - 0xbd, 0x24, 0x8c, 0x76, 0xb2, 0xa1, 0xc0, 0x58, 0x61, 0xb0, 0x46, 0xc5, 0x6b, 0xde, 0xf6, 0x62, - 0xda, 0xd2, 0x92, 0x69, 0xea, 0x62, 0x01, 0xc7, 0x8a, 0x82, 0x76, 0xcc, 0xf5, 0x22, 0xa6, 0x32, - 0xec, 0x88, 0x15, 0xac, 0x3a, 0x56, 0x95, 0x08, 0x9c, 0xd2, 0xd8, 0xff, 0xc0, 0x82, 0x93, 0x97, - 0xfc, 0x56, 0x9c, 0x90, 0x68, 0x3d, 0x36, 0x1a, 0xfb, 0x02, 0x54, 0x88, 0x54, 0xee, 0x45, 0x5b, - 0xd5, 0xa6, 0xa1, 0xb4, 0x7e, 0x1e, 0x87, 0xac, 0xe8, 0x0a, 0x84, 0xbb, 0xf6, 0x16, 0x9c, 0xf9, - 0x9b, 0x25, 0x18, 0xbd, 0xbc, 0xb6, 0x56, 0xbb, 0x44, 0x12, 0x21, 0x25, 0xf3, 0x9d, 0x52, 0x58, - 0xb3, 0xc8, 0x0f, 0x52, 0x7e, 0x5a, 0x89, 0xe7, 0xcf, 0xf1, 0xeb, 0x22, 0x73, 0xab, 0x41, 0x72, - 0x23, 0xaa, 0x27, 0x91, 0x17, 0x6c, 0x74, 0xb4, 0xe1, 0xa5, 0x2c, 0x2f, 0x77, 0x93, 0xe5, 0xe8, - 0x05, 0x18, 0x60, 0xf7, 0x55, 0xa4, 0xf2, 0xf1, 0x61, 0xa5, 0x27, 0x30, 0xe8, 0xfe, 0xee, 0x6c, - 0xe5, 0x26, 0x5e, 0xe5, 0x7f, 0xb0, 0x20, 0x45, 0x6f, 0xc1, 0xf0, 0x66, 0x92, 0x34, 0x2f, 0x13, - 0xc7, 0x25, 0x91, 0x94, 0x13, 0x67, 0x0f, 0x96, 0x13, 0x74, 0x38, 0x78, 0x81, 0x74, 0x69, 0xa5, - 0xb0, 0x18, 0xeb, 0x1c, 0xed, 0x3a, 0x40, 0x8a, 0x7b, 0x40, 0x36, 0x88, 0xfd, 0xf3, 0x25, 0x18, - 0xbc, 0xec, 0x04, 0xae, 0x4f, 0x22, 0xb4, 0x02, 0x7d, 0xe4, 0x3e, 0x69, 0x88, 0x8d, 0x3c, 0xa7, - 0xe9, 0xe9, 0x66, 0xc7, 0xfd, 0x6a, 0xf4, 0x3f, 0x66, 0xe5, 0x11, 0x86, 0x41, 0xda, 0xee, 0x4b, - 0x2a, 0x4a, 0xfc, 0xb9, 0xfc, 0x51, 0x50, 0x93, 0x82, 0xef, 0x94, 0x02, 0x84, 0x25, 0x23, 0xe6, - 0x81, 0x6a, 0x34, 0xeb, 0x54, 0xbc, 0x25, 0xc5, 0x2c, 0xbb, 0xb5, 0xa5, 0x1a, 0x27, 0x17, 0x7c, - 0xb9, 0x07, 0x4a, 0x02, 0x71, 0xca, 0xce, 0xbe, 0x08, 0x53, 0xec, 0x3c, 0xd6, 0x49, 0x36, 0x8d, - 0x55, 0x93, 0x3b, 0x3d, 0xed, 0x1f, 0x95, 0x60, 0x72, 0xb5, 0xbe, 0x54, 0x37, 0x7d, 0x87, 0x17, - 0x61, 0x84, 0x6f, 0xd0, 0x74, 0xd2, 0x39, 0xbe, 0x28, 0xaf, 0xce, 0x10, 0xd6, 0x34, 0x1c, 0x36, - 0x28, 0xd1, 0xe3, 0x50, 0xf6, 0xde, 0x0d, 0xb2, 0x51, 0x7d, 0xab, 0xaf, 0x5d, 0xc7, 0x14, 0x4e, - 0xd1, 0x74, 0xaf, 0xe7, 0x42, 0x4e, 0xa1, 0xd5, 0x7e, 0xff, 0x2a, 0x8c, 0x79, 0x71, 0x23, 0xf6, - 0x56, 0x03, 0x2a, 0x01, 0x9c, 0x86, 0x9c, 0xbe, 0xa9, 0x72, 0x4e, 0x9b, 0xaa, 0xb0, 0x38, 0x43, - 0xad, 0x49, 0xdc, 0xfe, 0xc2, 0xfa, 0x42, 0x6e, 0xb8, 0x38, 0x55, 0x85, 0x9a, 0xac, 0x77, 0x31, - 0x8b, 0x11, 0x12, 0xaa, 0x10, 0xef, 0x70, 0x8c, 0x25, 0xce, 0x7e, 0x07, 0x2a, 0x2a, 0xcc, 0x4b, - 0x46, 0x37, 0x5a, 0x5d, 0xa2, 0x1b, 0xf3, 0x25, 0x93, 0x74, 0xfc, 0x96, 0x3b, 0x3a, 0x7e, 0xff, - 0x85, 0x05, 0x69, 0x9c, 0x0a, 0xc2, 0x50, 0x69, 0x86, 0xec, 0x90, 0x28, 0x92, 0xa7, 0xb1, 0x4f, - 0xe5, 0x4c, 0x58, 0xbe, 0x60, 0xf8, 0x94, 0xaa, 0xc9, 0xb2, 0x38, 0x65, 0x83, 0xae, 0xc2, 0x60, - 0x33, 0x22, 0xf5, 0x84, 0x5d, 0x4d, 0xe8, 0x81, 0x23, 0x1f, 0x1b, 0x5e, 0x12, 0x4b, 0x16, 0xf6, - 0xbf, 0xb3, 0x00, 0xae, 0x7a, 0x5b, 0x5e, 0x82, 0x9d, 0x60, 0x83, 0x1c, 0x83, 0x55, 0x78, 0x1d, - 0xfa, 0xe2, 0x26, 0x69, 0x14, 0x3b, 0xe6, 0x4b, 0x5b, 0x56, 0x6f, 0x92, 0x46, 0xfa, 0x39, 0xe8, - 0x3f, 0xcc, 0xf8, 0xd8, 0xdf, 0x07, 0x18, 0x4b, 0xc9, 0xa8, 0x66, 0x8e, 0x9e, 0x37, 0x62, 0xf2, - 0x1f, 0xcd, 0xc4, 0xe4, 0x57, 0x18, 0xb5, 0x16, 0x86, 0x9f, 0x40, 0x79, 0xcb, 0xb9, 0x2f, 0x0c, - 0x81, 0x97, 0x8a, 0x36, 0x88, 0xd6, 0x34, 0x77, 0xcd, 0xb9, 0xcf, 0xf5, 0xae, 0xe7, 0xe4, 0x44, - 0xba, 0xe6, 0xdc, 0xdf, 0xe7, 0x87, 0x79, 0x6c, 0xc1, 0x52, 0xcb, 0xe3, 0x2b, 0x7f, 0x92, 0xfe, - 0x67, 0x32, 0x94, 0x56, 0xc7, 0x6a, 0xf5, 0x02, 0xe1, 0xc7, 0xec, 0xb1, 0x56, 0x2f, 0xc8, 0xd6, - 0xea, 0x05, 0x05, 0x6a, 0xf5, 0x58, 0xf0, 0xea, 0xa0, 0x70, 0xff, 0xb3, 0xc8, 0xbf, 0xe1, 0x0b, - 0x9f, 0xe8, 0xa9, 0x6a, 0x71, 0x8e, 0xc0, 0xab, 0x9f, 0x97, 0xca, 0xa6, 0x80, 0xe6, 0x36, 0x41, - 0x56, 0x8d, 0xfe, 0xa1, 0x05, 0x63, 0xe2, 0x37, 0x26, 0xef, 0xb6, 0x48, 0x9c, 0x88, 0x4d, 0xed, - 0x33, 0x87, 0x69, 0x8d, 0x60, 0xc1, 0x1b, 0xf5, 0x71, 0x29, 0x91, 0x4c, 0x64, 0x6e, 0xdb, 0x32, - 0xed, 0x41, 0xdf, 0xb7, 0x60, 0x6a, 0xcb, 0xb9, 0xcf, 0x6b, 0xe4, 0x30, 0xec, 0x24, 0x5e, 0x28, - 0xa2, 0x1b, 0x57, 0x7a, 0x9d, 0x27, 0x6d, 0x8c, 0x78, 0x73, 0x65, 0xe0, 0xd2, 0x54, 0x27, 0x92, - 0xdc, 0x46, 0x77, 0x6c, 0xe1, 0xcc, 0x3a, 0x0c, 0xc9, 0x89, 0xd9, 0x41, 0xcd, 0xaf, 0xea, 0x7b, - 0x77, 0x8e, 0x51, 0x3d, 0x27, 0x5d, 0x63, 0x73, 0xaf, 0xb5, 0x9c, 0x20, 0xf1, 0x92, 0x1d, 0xcd, - 0x2c, 0x60, 0xf5, 0x88, 0xa9, 0x78, 0xa4, 0xf5, 0xbc, 0x03, 0x23, 0xfa, 0xbc, 0x3b, 0xd2, 0xba, - 0xde, 0x85, 0x13, 0x1d, 0x66, 0xd5, 0x91, 0x56, 0x79, 0x0f, 0x1e, 0xed, 0x3a, 0x3f, 0x8e, 0xb2, - 0x62, 0xfb, 0x37, 0x2d, 0x5d, 0x74, 0x1e, 0x83, 0xd3, 0xe5, 0x9a, 0xe9, 0x74, 0x39, 0x5b, 0x74, - 0x0d, 0x75, 0xf1, 0xbc, 0xac, 0xeb, 0xcd, 0xa7, 0x5b, 0x02, 0x5a, 0x83, 0x01, 0x9f, 0x42, 0xe4, - 0x99, 0xd7, 0xb9, 0x5e, 0x56, 0x69, 0xaa, 0x94, 0x30, 0x78, 0x8c, 0x05, 0x2f, 0xfb, 0xfb, 0x16, - 0xf4, 0xfd, 0x05, 0xde, 0x18, 0x6a, 0x63, 0x2d, 0x2e, 0xbe, 0xcf, 0x61, 0xe7, 0xde, 0xf2, 0xfd, - 0x84, 0x04, 0x31, 0xd3, 0x41, 0xbb, 0x9d, 0xda, 0x0f, 0xd3, 0xaa, 0x64, 0x10, 0xc6, 0x2b, 0x30, - 0xea, 0x3b, 0x77, 0x88, 0x2f, 0x1d, 0xc6, 0x59, 0x8b, 0xed, 0xaa, 0x8e, 0xc4, 0x26, 0x2d, 0x2d, - 0xbc, 0xae, 0xfb, 0xd3, 0x85, 0x92, 0xa4, 0x0a, 0x1b, 0xce, 0x76, 0x6c, 0xd2, 0x52, 0x93, 0xe1, - 0x9e, 0x93, 0x34, 0x36, 0x85, 0x35, 0xa7, 0x9a, 0x7b, 0x9b, 0x02, 0x31, 0xc7, 0xa1, 0x05, 0x18, - 0x97, 0x33, 0xf6, 0x16, 0x35, 0xf3, 0xc3, 0x40, 0xe8, 0x99, 0xea, 0xd6, 0x31, 0x36, 0xd1, 0x38, - 0x4b, 0x8f, 0x3e, 0x09, 0x63, 0x74, 0x70, 0xc2, 0x56, 0x22, 0x43, 0x4c, 0xfa, 0x59, 0x88, 0x09, - 0x8b, 0x50, 0x5e, 0x33, 0x30, 0x38, 0x43, 0x69, 0xbf, 0x05, 0x27, 0xae, 0x86, 0x8e, 0xbb, 0xe8, - 0xf8, 0x4e, 0xd0, 0x20, 0xd1, 0x6a, 0xb0, 0x91, 0x7b, 0x7c, 0xad, 0x1f, 0x31, 0x97, 0xf2, 0x8e, - 0x98, 0xed, 0x08, 0x90, 0x5e, 0x81, 0x08, 0x8e, 0x7a, 0x13, 0x06, 0x3d, 0x5e, 0x95, 0x98, 0xb6, - 0xe7, 0xf3, 0xfc, 0x51, 0x6d, 0x6d, 0xd4, 0x82, 0x7d, 0x38, 0x00, 0x4b, 0x96, 0xd4, 0x04, 0xe9, - 0xe4, 0xc0, 0xca, 0xb7, 0xf2, 0xec, 0xbf, 0x69, 0xc1, 0xf8, 0xf5, 0xcc, 0x95, 0xd6, 0xa7, 0x61, - 0x80, 0x27, 0x46, 0xc8, 0xba, 0x58, 0xea, 0x0c, 0x8a, 0x05, 0xf6, 0x81, 0x5b, 0xf8, 0xbf, 0x5c, - 0x82, 0x0a, 0x0b, 0xb3, 0x6d, 0x52, 0x73, 0xe2, 0xe8, 0xd5, 0xd4, 0x6b, 0x86, 0x9a, 0x9a, 0x63, - 0x65, 0xaa, 0x86, 0x75, 0xd3, 0x52, 0xd1, 0x4d, 0x75, 0xd5, 0xb3, 0x90, 0x81, 0x99, 0x32, 0xe4, - 0xd7, 0x01, 0xc7, 0xcc, 0x9b, 0xa1, 0xf2, 0x1a, 0x28, 0x3b, 0xf4, 0x55, 0xb4, 0x0f, 0xdd, 0xa1, - 0xaf, 0x6a, 0x59, 0x17, 0xe1, 0x54, 0xd3, 0x1a, 0xcf, 0xc4, 0xf7, 0xa7, 0x59, 0xf0, 0xa4, 0xe3, - 0x7b, 0x5f, 0x24, 0xea, 0xc6, 0xf4, 0xac, 0x08, 0x86, 0x14, 0xd0, 0x7d, 0x26, 0x67, 0xc4, 0x3f, - 0x7e, 0x21, 0x3e, 0x2d, 0x62, 0x5f, 0x86, 0xf1, 0xcc, 0xd0, 0xa1, 0x97, 0xa0, 0xbf, 0xb9, 0xe9, - 0xc4, 0x24, 0x13, 0xc7, 0xd2, 0x5f, 0xa3, 0xc0, 0xfd, 0xdd, 0xd9, 0x31, 0x55, 0x80, 0x41, 0x30, - 0xa7, 0xb6, 0xbf, 0x5a, 0x82, 0xbe, 0xeb, 0xa1, 0x7b, 0x1c, 0x53, 0xed, 0xb2, 0x31, 0xd5, 0x9e, - 0xce, 0x4f, 0xa7, 0xd1, 0x75, 0x96, 0xd5, 0x32, 0xb3, 0xec, 0x6c, 0x01, 0x5e, 0x07, 0x4f, 0xb0, - 0x2d, 0x18, 0x66, 0xe9, 0x3a, 0x44, 0x20, 0xcf, 0x0b, 0x86, 0x65, 0x35, 0x9b, 0xb1, 0xac, 0xc6, - 0x35, 0x52, 0xcd, 0xbe, 0x7a, 0x06, 0x06, 0x45, 0xe0, 0x48, 0x36, 0x74, 0x54, 0xd0, 0x62, 0x89, - 0xb7, 0xff, 0x4d, 0x19, 0x8c, 0xf4, 0x20, 0xe8, 0x77, 0x2c, 0x98, 0x8b, 0xf8, 0x35, 0x1c, 0xb7, - 0xda, 0x8a, 0xbc, 0x60, 0xa3, 0xde, 0xd8, 0x24, 0x6e, 0xcb, 0xf7, 0x82, 0x8d, 0xd5, 0x8d, 0x20, - 0x54, 0xe0, 0xe5, 0xfb, 0xa4, 0xd1, 0x62, 0x7e, 0xda, 0xc2, 0x59, 0x49, 0xd4, 0xa1, 0xe9, 0x85, - 0xbd, 0xdd, 0xd9, 0x39, 0xdc, 0x53, 0x2d, 0xb8, 0xc7, 0x56, 0xa1, 0x3f, 0xb2, 0x60, 0x9e, 0x27, - 0xc8, 0x28, 0xde, 0x93, 0x42, 0x16, 0x69, 0x4d, 0x32, 0x4d, 0xd9, 0xad, 0x91, 0x68, 0x6b, 0xf1, - 0x65, 0x31, 0xc8, 0xf3, 0xb5, 0xde, 0x6a, 0xc5, 0xbd, 0x36, 0xd3, 0xfe, 0x0f, 0x65, 0x18, 0xa5, - 0xe3, 0x99, 0x5e, 0x8a, 0x7f, 0xc9, 0x98, 0x26, 0x4f, 0x64, 0xa6, 0xc9, 0xa4, 0x41, 0xfc, 0x60, - 0xee, 0xc3, 0xc7, 0x30, 0xe9, 0x3b, 0x71, 0x72, 0x99, 0x38, 0x51, 0x72, 0x87, 0x38, 0xec, 0x6c, - 0x32, 0x1b, 0xf7, 0x50, 0xe0, 0xb8, 0x53, 0x05, 0x23, 0x5d, 0xcd, 0x32, 0xc3, 0xed, 0xfc, 0xd1, - 0x36, 0x20, 0x76, 0x0e, 0x1a, 0x39, 0x41, 0xcc, 0xfb, 0xe2, 0x09, 0xbf, 0x6e, 0x6f, 0xb5, 0xce, - 0x88, 0x5a, 0xd1, 0xd5, 0x36, 0x6e, 0xb8, 0x43, 0x0d, 0xda, 0x49, 0x77, 0x7f, 0xd1, 0x93, 0xee, - 0x81, 0x9c, 0x98, 0xed, 0xaf, 0x59, 0x70, 0x82, 0x7e, 0x16, 0x33, 0xbe, 0x37, 0x46, 0x21, 0x8c, - 0xd3, 0x69, 0xe7, 0x93, 0x44, 0xc2, 0xc4, 0xfa, 0xca, 0xd1, 0xac, 0x4d, 0x3e, 0xa9, 0xfa, 0x76, - 0xc5, 0x64, 0x86, 0xb3, 0xdc, 0xed, 0x6f, 0x5b, 0xc0, 0x22, 0xee, 0x8e, 0x61, 0x33, 0xbb, 0x64, - 0x6e, 0x66, 0x76, 0xbe, 0xc4, 0xe8, 0xb2, 0x8f, 0xbd, 0x08, 0x13, 0x14, 0x5b, 0x8b, 0xc2, 0xfb, - 0x3b, 0x52, 0xd1, 0xce, 0x77, 0xf0, 0x7e, 0xad, 0xc4, 0x97, 0x8d, 0xba, 0x4f, 0x88, 0x7e, 0xc1, - 0x82, 0xa1, 0x86, 0xd3, 0x74, 0x1a, 0x3c, 0xb9, 0x52, 0x01, 0xef, 0x8c, 0x51, 0x7e, 0x6e, 0x49, - 0x94, 0xe5, 0x9e, 0x85, 0x8f, 0xc9, 0xae, 0x4b, 0x70, 0xae, 0x37, 0x41, 0x55, 0x3e, 0x73, 0x17, - 0x46, 0x0d, 0x66, 0x47, 0x6a, 0x86, 0xfe, 0x82, 0xc5, 0x85, 0xbe, 0x32, 0x15, 0xee, 0xc1, 0x64, - 0xa0, 0xfd, 0xa7, 0xe2, 0x4c, 0x6a, 0xc6, 0x73, 0xc5, 0xc5, 0x3a, 0x93, 0x82, 0x5a, 0x74, 0x61, - 0x86, 0x21, 0x6e, 0xaf, 0xc3, 0xfe, 0x55, 0x0b, 0x1e, 0xd1, 0x09, 0xb5, 0x0b, 0xa0, 0x79, 0x7e, - 0xe3, 0x2a, 0x0c, 0x85, 0x4d, 0x12, 0x39, 0xa9, 0x59, 0x74, 0x56, 0x8e, 0xff, 0x0d, 0x01, 0xdf, - 0xdf, 0x9d, 0x9d, 0xd2, 0xb9, 0x4b, 0x38, 0x56, 0x25, 0x91, 0x0d, 0x03, 0x6c, 0x5c, 0x62, 0x71, - 0x75, 0x97, 0x25, 0x1b, 0x62, 0x87, 0x2a, 0x31, 0x16, 0x18, 0xfb, 0xef, 0x58, 0x7c, 0xba, 0xe9, - 0x4d, 0x47, 0x5f, 0x82, 0x89, 0x2d, 0x6a, 0x41, 0x2d, 0xdf, 0x6f, 0xd2, 0x8d, 0x94, 0x1d, 0x27, - 0x5b, 0x45, 0xb6, 0x8f, 0x2e, 0xdd, 0x5d, 0x9c, 0x16, 0xad, 0x9f, 0xb8, 0x96, 0x61, 0x8b, 0xdb, - 0x2a, 0xb2, 0xff, 0x71, 0x89, 0xaf, 0x59, 0xa6, 0xc3, 0x3d, 0x03, 0x83, 0xcd, 0xd0, 0x5d, 0x5a, - 0xad, 0x62, 0x31, 0x56, 0x4a, 0xe8, 0xd4, 0x38, 0x18, 0x4b, 0x3c, 0xba, 0x00, 0x40, 0xee, 0x27, - 0x24, 0x0a, 0x1c, 0x5f, 0x1d, 0x03, 0x2b, 0x55, 0x69, 0x59, 0x61, 0xb0, 0x46, 0x45, 0xcb, 0x34, - 0xa3, 0x70, 0xdb, 0x73, 0xd9, 0xcd, 0x85, 0xb2, 0x59, 0xa6, 0xa6, 0x30, 0x58, 0xa3, 0xa2, 0x76, - 0x6b, 0x2b, 0x88, 0xf9, 0x36, 0xe6, 0xdc, 0x11, 0xb9, 0x71, 0x86, 0x52, 0xbb, 0xf5, 0xa6, 0x8e, - 0xc4, 0x26, 0x2d, 0xba, 0x02, 0x03, 0x89, 0xc3, 0x0e, 0x37, 0xfb, 0x8b, 0x44, 0x8a, 0xac, 0x51, - 0x5a, 0x3d, 0x19, 0x11, 0x2d, 0x8a, 0x05, 0x0b, 0xfb, 0x0f, 0x2a, 0x00, 0xa9, 0xd6, 0x85, 0xbe, - 0xda, 0xbe, 0xe0, 0x3f, 0x5e, 0x54, 0x65, 0x7b, 0x70, 0xab, 0x1d, 0xbd, 0x67, 0xc1, 0xb0, 0xe3, - 0xfb, 0x61, 0xc3, 0x49, 0xd8, 0xf0, 0x94, 0x8a, 0x8a, 0x1e, 0xd1, 0x92, 0x85, 0xb4, 0x2c, 0x6f, - 0xcc, 0x0b, 0xf2, 0xc0, 0x51, 0xc3, 0xe4, 0xb6, 0x47, 0x6f, 0x02, 0xfa, 0x98, 0xd4, 0xda, 0xf9, - 0x17, 0x9e, 0xc9, 0x6a, 0xed, 0x15, 0x26, 0x70, 0x35, 0x85, 0x1d, 0xbd, 0x65, 0xe4, 0x92, 0xe9, - 0x2b, 0x72, 0xfd, 0xd4, 0xd0, 0x43, 0xf2, 0xd2, 0xc8, 0xa0, 0x37, 0xf4, 0x90, 0xea, 0xfe, 0x22, - 0xf7, 0xbb, 0x35, 0x75, 0x38, 0x27, 0x9c, 0x3a, 0x81, 0x71, 0xd7, 0xdc, 0x79, 0x45, 0x58, 0xd8, - 0xf9, 0xfc, 0x1a, 0x32, 0x5b, 0x76, 0xba, 0xd7, 0x66, 0x10, 0x38, 0x5b, 0x05, 0x7a, 0x83, 0x07, - 0xbc, 0xaf, 0x06, 0xeb, 0xa1, 0x08, 0x0d, 0x3b, 0x57, 0xe0, 0x9b, 0xef, 0xc4, 0x09, 0xd9, 0xa2, - 0x65, 0xd2, 0xcd, 0xf5, 0xba, 0xe0, 0x82, 0x15, 0x3f, 0xb4, 0x06, 0x03, 0xec, 0xb6, 0x51, 0x3c, - 0x3d, 0x54, 0xc4, 0x13, 0x67, 0x5e, 0xb2, 0x4d, 0xd7, 0x0f, 0xfb, 0x1b, 0x63, 0xc1, 0x0b, 0x5d, - 0x96, 0xd7, 0xec, 0xe3, 0xd5, 0xe0, 0x66, 0x4c, 0xd8, 0x35, 0xfb, 0xca, 0xe2, 0x47, 0xd2, 0x7b, - 0xf3, 0x1c, 0xde, 0x31, 0x9b, 0x9e, 0x51, 0x92, 0x2a, 0x36, 0xe2, 0xbf, 0x4c, 0xd2, 0x37, 0x0d, - 0x45, 0x1a, 0x6a, 0xa6, 0xf4, 0x4b, 0x07, 0xfb, 0x96, 0xc9, 0x0c, 0x67, 0xb9, 0x1f, 0xeb, 0x96, - 0x3a, 0x13, 0xc0, 0x44, 0x76, 0x51, 0x1e, 0xe9, 0x16, 0xfe, 0x93, 0x3e, 0x18, 0x33, 0x27, 0x07, - 0x9a, 0x87, 0x8a, 0x60, 0xa2, 0x92, 0x76, 0xa9, 0x35, 0x70, 0x4d, 0x22, 0x70, 0x4a, 0xc3, 0xd2, - 0x97, 0xb1, 0xe2, 0x5a, 0x50, 0x50, 0x9a, 0xbe, 0x4c, 0x61, 0xb0, 0x46, 0x45, 0x35, 0xe1, 0x3b, - 0x61, 0x98, 0xa8, 0x9d, 0x40, 0xcd, 0x9b, 0x45, 0x06, 0xc5, 0x02, 0x4b, 0x77, 0x80, 0xbb, 0xf4, - 0x63, 0xfa, 0xa6, 0x57, 0x51, 0xed, 0x00, 0x57, 0x74, 0x24, 0x36, 0x69, 0xe9, 0x8e, 0x16, 0xc6, - 0x6c, 0x22, 0x0a, 0x7d, 0x3b, 0x0d, 0xb2, 0xaa, 0xf3, 0x1b, 0x78, 0x12, 0x8f, 0x3e, 0x07, 0x8f, - 0xa8, 0x0b, 0x73, 0x98, 0x7b, 0x69, 0x65, 0x8d, 0x03, 0x86, 0xc9, 0xfc, 0xc8, 0x52, 0x67, 0x32, - 0xdc, 0xad, 0x3c, 0x7a, 0x15, 0xc6, 0x84, 0xae, 0x2c, 0x39, 0x0e, 0x9a, 0x27, 0xf0, 0x57, 0x0c, - 0x2c, 0xce, 0x50, 0xa3, 0x2a, 0x4c, 0x50, 0x08, 0x53, 0x52, 0x25, 0x07, 0x7e, 0xf1, 0x4f, 0x6d, - 0xf5, 0x57, 0x32, 0x78, 0xdc, 0x56, 0x02, 0x2d, 0xc0, 0x38, 0x57, 0x56, 0xa8, 0x61, 0xc8, 0xbe, - 0x83, 0x88, 0xe7, 0x54, 0x0b, 0xe1, 0x86, 0x89, 0xc6, 0x59, 0x7a, 0x74, 0x11, 0x46, 0x9c, 0xa8, - 0xb1, 0xe9, 0x25, 0xa4, 0x91, 0xb4, 0x22, 0x9e, 0xc4, 0x42, 0x0b, 0x61, 0x58, 0xd0, 0x70, 0xd8, - 0xa0, 0xb4, 0xbf, 0x08, 0x27, 0x3a, 0x04, 0x8f, 0xd3, 0x89, 0xe3, 0x34, 0x3d, 0xd9, 0xa7, 0x4c, - 0xb8, 0xd4, 0x42, 0x6d, 0x55, 0xf6, 0x46, 0xa3, 0xa2, 0xb3, 0x93, 0xb9, 0xa7, 0xb5, 0x9c, 0x9a, - 0x6a, 0x76, 0xae, 0x48, 0x04, 0x4e, 0x69, 0xec, 0x3f, 0xaf, 0x80, 0xe6, 0xbd, 0x29, 0x10, 0x22, - 0x73, 0x11, 0x46, 0x64, 0x9a, 0x58, 0x2d, 0x3d, 0xa3, 0xea, 0xe6, 0x25, 0x0d, 0x87, 0x0d, 0x4a, - 0xda, 0xb6, 0x40, 0xfa, 0xa4, 0xb2, 0xc1, 0x59, 0xca, 0x59, 0x85, 0x53, 0x1a, 0x74, 0x0e, 0x86, - 0x62, 0xe2, 0xaf, 0x5f, 0xf5, 0x82, 0xbb, 0x62, 0x62, 0x2b, 0xc9, 0x5c, 0x17, 0x70, 0xac, 0x28, - 0xd0, 0x22, 0x94, 0x5b, 0x9e, 0x2b, 0xa6, 0xb2, 0x54, 0x1b, 0xca, 0x37, 0x57, 0xab, 0xfb, 0xbb, - 0xb3, 0x4f, 0x74, 0xcb, 0x99, 0x4b, 0xed, 0xf3, 0x78, 0x8e, 0x2e, 0x3f, 0x5a, 0xb8, 0x93, 0x9f, - 0x7e, 0xa0, 0x47, 0x3f, 0xfd, 0x05, 0x00, 0xd1, 0x6b, 0x39, 0x97, 0xcb, 0xe9, 0x57, 0xbb, 0xa4, - 0x30, 0x58, 0xa3, 0xa2, 0x56, 0x7e, 0x23, 0x22, 0x8e, 0x34, 0x84, 0x79, 0x50, 0xf3, 0xd0, 0xe1, - 0xad, 0xfc, 0xa5, 0x2c, 0x33, 0xdc, 0xce, 0x1f, 0x85, 0x30, 0xe9, 0x8a, 0x5b, 0x99, 0x69, 0xa5, - 0x95, 0xde, 0x23, 0xa9, 0x69, 0x85, 0xd5, 0x2c, 0x23, 0xdc, 0xce, 0x1b, 0x7d, 0x01, 0x66, 0x24, - 0xb0, 0xfd, 0x4a, 0x2c, 0x5b, 0x2e, 0xe5, 0xc5, 0xd3, 0x7b, 0xbb, 0xb3, 0x33, 0xd5, 0xae, 0x54, - 0xf8, 0x00, 0x0e, 0xe8, 0x4d, 0x18, 0x60, 0xe7, 0x3a, 0xf1, 0xf4, 0x30, 0xdb, 0xf1, 0x5e, 0x2c, - 0x12, 0x8f, 0x4f, 0x67, 0xfd, 0x1c, 0x3b, 0x1d, 0x12, 0x91, 0xa6, 0xe9, 0x61, 0x19, 0x03, 0x62, - 0xc1, 0x13, 0x35, 0x61, 0xd8, 0x09, 0x82, 0x30, 0x71, 0xb8, 0x22, 0x36, 0x52, 0x44, 0x97, 0xd4, - 0xaa, 0x58, 0x48, 0xcb, 0xf2, 0x7a, 0x54, 0xf0, 0x9a, 0x86, 0xc1, 0x7a, 0x15, 0xe8, 0x1e, 0x8c, - 0x87, 0xf7, 0xa8, 0xc0, 0x94, 0x47, 0x1b, 0xf1, 0xf4, 0xa8, 0xd9, 0xb1, 0x1c, 0x47, 0xad, 0x51, - 0x58, 0x93, 0x64, 0x26, 0x53, 0x9c, 0xad, 0x05, 0xcd, 0x19, 0xee, 0xea, 0xb1, 0x34, 0x9e, 0x3a, - 0x75, 0x57, 0xeb, 0xde, 0x69, 0x76, 0xed, 0x9a, 0xc7, 0x50, 0x32, 0x89, 0x30, 0x9e, 0xb9, 0x76, - 0x9d, 0xa2, 0xb0, 0x4e, 0x37, 0xf3, 0x09, 0x18, 0xd6, 0x06, 0xbe, 0x97, 0xc0, 0xdd, 0x99, 0x57, - 0x61, 0x22, 0x3b, 0xa0, 0x3d, 0x05, 0xfe, 0xfe, 0xef, 0x12, 0x8c, 0x77, 0x38, 0x37, 0xba, 0xeb, - 0xb1, 0xe0, 0x73, 0x43, 0xf4, 0x5d, 0xf1, 0x02, 0x17, 0x33, 0x8c, 0x29, 0xc0, 0x4a, 0x05, 0x04, - 0x98, 0x94, 0xa6, 0xe5, 0xae, 0xd2, 0x54, 0x08, 0xad, 0xbe, 0x0f, 0x22, 0xb4, 0xcc, 0x7d, 0xa2, - 0xbf, 0xd0, 0x3e, 0xf1, 0x00, 0x04, 0x9d, 0xb1, 0xd5, 0x0c, 0x16, 0xd8, 0x6a, 0xbe, 0x55, 0x82, - 0x89, 0x34, 0xc8, 0x59, 0xe4, 0x8e, 0x3e, 0xfa, 0x63, 0x88, 0x35, 0xe3, 0x18, 0x22, 0x2f, 0x35, - 0x74, 0xa6, 0x7d, 0x5d, 0x8f, 0x24, 0xde, 0xcc, 0x1c, 0x49, 0xbc, 0xd8, 0x23, 0xdf, 0x83, 0x8f, - 0x27, 0xbe, 0x57, 0x82, 0x93, 0xd9, 0x22, 0x4b, 0xbe, 0xe3, 0x6d, 0x1d, 0xc3, 0x78, 0x7d, 0xce, - 0x18, 0xaf, 0x97, 0x7b, 0xeb, 0x17, 0x6b, 0x64, 0xd7, 0x41, 0x73, 0x32, 0x83, 0xf6, 0x89, 0xc3, - 0x30, 0x3f, 0x78, 0xe4, 0x7e, 0xdf, 0x82, 0x47, 0x3b, 0x96, 0x3b, 0x06, 0xc7, 0xeb, 0xeb, 0xa6, - 0xe3, 0xf5, 0x85, 0x43, 0xf4, 0xae, 0x8b, 0x27, 0xf6, 0xd7, 0xca, 0x5d, 0x7a, 0xc5, 0x5c, 0x53, - 0x37, 0x60, 0xd8, 0x69, 0x34, 0x48, 0x1c, 0x5f, 0x0b, 0x5d, 0x95, 0xc0, 0xe9, 0x79, 0xb6, 0xb7, - 0xa4, 0xe0, 0xfd, 0xdd, 0xd9, 0x99, 0x2c, 0x8b, 0x14, 0x8d, 0x75, 0x0e, 0x66, 0x6a, 0xb9, 0xd2, - 0x11, 0xa5, 0x96, 0xbb, 0x00, 0xb0, 0xad, 0xac, 0xd8, 0xac, 0xc7, 0x4b, 0xb3, 0x6f, 0x35, 0x2a, - 0xf4, 0x57, 0x99, 0x46, 0xc8, 0x83, 0x34, 0xfa, 0xcc, 0xfb, 0x92, 0x39, 0xdf, 0x4f, 0x0f, 0xf8, - 0xe0, 0xd7, 0x32, 0x95, 0x77, 0x50, 0xb1, 0x44, 0x9f, 0x81, 0x89, 0x98, 0x5f, 0xfe, 0x5f, 0xf2, - 0x9d, 0x98, 0x45, 0xf7, 0x0b, 0x79, 0xca, 0x6e, 0x58, 0xd6, 0x33, 0x38, 0xdc, 0x46, 0x6d, 0x7f, - 0xb7, 0x0c, 0x1f, 0x3e, 0x60, 0xda, 0xa2, 0x05, 0xf3, 0xd4, 0xf6, 0xb9, 0xac, 0xff, 0x67, 0xa6, - 0x63, 0x61, 0xc3, 0x21, 0x94, 0xf9, 0xda, 0xa5, 0x0f, 0xfc, 0xb5, 0xbf, 0xa1, 0x7b, 0xeb, 0x78, - 0xdc, 0xe6, 0xa5, 0x43, 0x2f, 0xcc, 0x9f, 0x56, 0x67, 0xfd, 0x57, 0x2c, 0x78, 0xa2, 0x63, 0xb7, - 0x8c, 0x28, 0x91, 0x79, 0xa8, 0x34, 0x28, 0x50, 0xbb, 0x8b, 0x93, 0x5e, 0x82, 0x93, 0x08, 0x9c, - 0xd2, 0x18, 0xc1, 0x20, 0xa5, 0xdc, 0x60, 0x90, 0xdf, 0xb5, 0x60, 0x2a, 0xdb, 0x88, 0x63, 0x90, - 0x5b, 0x75, 0x53, 0x6e, 0xcd, 0xf5, 0xf6, 0xf1, 0xbb, 0x88, 0xac, 0xf7, 0xc6, 0xe0, 0x54, 0xdb, - 0xae, 0xc7, 0x47, 0xf1, 0xe7, 0x2c, 0x98, 0xdc, 0x60, 0xda, 0xbb, 0x76, 0xe1, 0x49, 0xf4, 0x2b, - 0xe7, 0x96, 0xd8, 0x81, 0xf7, 0xa4, 0xb8, 0x2d, 0xd2, 0x46, 0x82, 0xdb, 0x2b, 0x43, 0x5f, 0xb7, - 0x60, 0xca, 0xb9, 0x17, 0xb7, 0xbd, 0x6c, 0x22, 0x26, 0xd2, 0xab, 0x39, 0xce, 0xb2, 0x9c, 0x37, - 0x51, 0x16, 0xa7, 0xf7, 0x76, 0x67, 0xa7, 0x3a, 0x51, 0xe1, 0x8e, 0xb5, 0xd2, 0xef, 0xbb, 0x29, - 0xae, 0x53, 0x14, 0xbb, 0xba, 0xd7, 0xe9, 0xf2, 0x05, 0x17, 0x6b, 0x12, 0x83, 0x15, 0x47, 0xf4, - 0x36, 0x54, 0x36, 0xe4, 0x1d, 0xa7, 0xac, 0xd8, 0xec, 0x32, 0xcc, 0x9d, 0xae, 0x44, 0xf1, 0xd8, - 0x7d, 0x85, 0xc2, 0x29, 0x53, 0x74, 0x19, 0xca, 0xc1, 0x7a, 0x2c, 0x6e, 0x13, 0xe7, 0xc5, 0x00, - 0x99, 0x91, 0x57, 0xfc, 0x02, 0xe6, 0xf5, 0x95, 0x3a, 0xa6, 0x2c, 0x28, 0xa7, 0xe8, 0x8e, 0x2b, - 0xbc, 0xc4, 0x39, 0x9c, 0xf0, 0x62, 0xb5, 0x9d, 0x13, 0x5e, 0xac, 0x62, 0xca, 0x02, 0xd5, 0xa0, - 0x9f, 0x5d, 0xd6, 0x10, 0x2e, 0xe0, 0x9c, 0x2b, 0xe7, 0x6d, 0x57, 0x52, 0x78, 0x06, 0x44, 0x06, - 0xc6, 0x9c, 0x11, 0x5a, 0x83, 0x81, 0x06, 0x4b, 0xe2, 0x2f, 0x6c, 0xf3, 0xbc, 0x64, 0x0c, 0x6d, - 0x09, 0xff, 0xf9, 0xb9, 0x17, 0x87, 0x63, 0xc1, 0x8b, 0x71, 0x25, 0xcd, 0xcd, 0xf5, 0x58, 0x18, - 0xdf, 0x79, 0x5c, 0xdb, 0x9e, 0x63, 0x10, 0x5c, 0x19, 0x1c, 0x0b, 0x5e, 0xa8, 0x0a, 0xa5, 0xf5, - 0x86, 0x48, 0xa4, 0x9a, 0xe3, 0xfa, 0x35, 0x6f, 0xd3, 0x2e, 0x0e, 0xec, 0xed, 0xce, 0x96, 0x56, - 0x96, 0x70, 0x69, 0xbd, 0x81, 0x5e, 0x87, 0xc1, 0x75, 0x7e, 0x3f, 0x52, 0x24, 0x4d, 0x3d, 0x9f, - 0x77, 0x89, 0xb3, 0xed, 0x32, 0x25, 0xbf, 0x9f, 0x21, 0x10, 0x58, 0xb2, 0x63, 0xf9, 0xe4, 0xd4, - 0x8d, 0x4f, 0x91, 0x35, 0x75, 0xae, 0xb7, 0x1b, 0xa2, 0xc2, 0x26, 0x55, 0x50, 0xac, 0x71, 0xa4, - 0x73, 0xde, 0x91, 0xef, 0x91, 0xb0, 0x8c, 0xa9, 0xb9, 0x73, 0xbe, 0xe3, 0xf3, 0x25, 0x7c, 0xce, - 0x2b, 0x14, 0x4e, 0x99, 0xa2, 0x16, 0x8c, 0x6e, 0xc7, 0xcd, 0x4d, 0x22, 0x97, 0x3e, 0x4b, 0xa3, - 0x3a, 0x7c, 0xe1, 0x53, 0x39, 0xb9, 0x71, 0x45, 0x11, 0x2f, 0x4a, 0x5a, 0x8e, 0xdf, 0x26, 0xc1, - 0x58, 0x02, 0xaf, 0x5b, 0x3a, 0x5b, 0x6c, 0xd6, 0x42, 0x3f, 0xc9, 0xbb, 0xad, 0xf0, 0xce, 0x4e, - 0x42, 0x44, 0x9a, 0xd5, 0x9c, 0x4f, 0xf2, 0x1a, 0x27, 0x6e, 0xff, 0x24, 0x02, 0x81, 0x25, 0x3b, - 0x35, 0x64, 0x4c, 0x1a, 0x4f, 0x14, 0x1e, 0xb2, 0xb6, 0x3e, 0xa4, 0x43, 0xc6, 0xa4, 0x6f, 0xca, - 0x94, 0x49, 0xdd, 0xe6, 0x66, 0x98, 0x84, 0x41, 0x46, 0xf6, 0x4f, 0x16, 0x91, 0xba, 0xb5, 0x0e, - 0x25, 0xdb, 0xa5, 0x6e, 0x27, 0x2a, 0xdc, 0xb1, 0x56, 0x14, 0xc0, 0x58, 0x33, 0x8c, 0x92, 0x7b, - 0x61, 0x24, 0xe7, 0x21, 0x2a, 0x64, 0x23, 0x1a, 0x65, 0x44, 0xdd, 0x2c, 0x0c, 0xd7, 0xc4, 0xe0, - 0x0c, 0x77, 0xfb, 0x57, 0x07, 0xda, 0xb7, 0x77, 0xa6, 0xc0, 0xff, 0xed, 0xf6, 0xf3, 0xd2, 0xcf, - 0xf4, 0x6e, 0xa7, 0x3e, 0xc0, 0x93, 0xd3, 0xaf, 0x5b, 0x70, 0xaa, 0xd9, 0x71, 0xf3, 0x16, 0x1b, - 0x64, 0xaf, 0xe6, 0x2e, 0x1f, 0x24, 0x95, 0xb3, 0xb8, 0x33, 0x1e, 0x77, 0xa9, 0x33, 0xab, 0xf2, - 0x96, 0x3f, 0xb0, 0xca, 0x7b, 0x1b, 0x86, 0x98, 0x8e, 0x96, 0x66, 0x24, 0xe9, 0x31, 0x79, 0x07, - 0xdb, 0x6a, 0x97, 0x04, 0x0b, 0xac, 0x98, 0xd1, 0x81, 0x7b, 0x3c, 0xdb, 0x09, 0x4c, 0x18, 0x5a, - 0x64, 0xca, 0xe3, 0xf6, 0xc4, 0x8a, 0x18, 0x89, 0xc7, 0x6b, 0x07, 0x11, 0xef, 0xe7, 0x11, 0xe0, - 0x83, 0x2b, 0x43, 0xd5, 0x0e, 0x06, 0xcd, 0x80, 0x79, 0x38, 0x92, 0x6f, 0xd4, 0x1c, 0xaf, 0x22, - 0xfe, 0x4f, 0xac, 0x0e, 0x7a, 0x23, 0x37, 0x9e, 0x3e, 0x65, 0x1a, 0x4f, 0x4f, 0x67, 0x8d, 0xa7, - 0x36, 0x97, 0x89, 0x61, 0x37, 0x15, 0xcf, 0xf4, 0x59, 0x34, 0xe5, 0x8a, 0xed, 0xc3, 0x99, 0x3c, - 0xa1, 0xc4, 0x02, 0xa6, 0x5c, 0x75, 0x54, 0x98, 0x06, 0x4c, 0xb9, 0xab, 0x55, 0xcc, 0x30, 0x45, - 0x6f, 0xed, 0xdb, 0x3f, 0x5f, 0x82, 0x72, 0x2d, 0x74, 0x8f, 0xc1, 0x05, 0x74, 0xc9, 0x70, 0x01, - 0x3d, 0x95, 0xfb, 0x8a, 0x5c, 0x57, 0x87, 0xcf, 0x8d, 0x8c, 0xc3, 0xe7, 0xa3, 0xf9, 0xac, 0x0e, - 0x76, 0xef, 0x7c, 0xbf, 0x0c, 0xfa, 0x3b, 0x78, 0xe8, 0xbf, 0x1c, 0x26, 0x8e, 0xb6, 0x5c, 0xec, - 0x69, 0x3c, 0x51, 0x07, 0x8b, 0xb7, 0x92, 0xb7, 0xef, 0x7e, 0x6a, 0xc3, 0x69, 0x6f, 0x13, 0x6f, - 0x63, 0x33, 0x21, 0x6e, 0xb6, 0x63, 0xc7, 0x17, 0x4e, 0xfb, 0x67, 0x16, 0x8c, 0x67, 0x6a, 0x47, - 0x7e, 0xa7, 0x6b, 0x3b, 0x87, 0x74, 0xea, 0x4c, 0xe6, 0xde, 0xf3, 0x99, 0x03, 0x50, 0xbe, 0x79, - 0xe9, 0x38, 0x61, 0x3a, 0xa4, 0x72, 0xde, 0xc7, 0x58, 0xa3, 0x40, 0x2f, 0xc1, 0x70, 0x12, 0x36, - 0x43, 0x3f, 0xdc, 0xd8, 0xb9, 0x42, 0x64, 0x3e, 0x09, 0x75, 0xae, 0xb1, 0x96, 0xa2, 0xb0, 0x4e, - 0x67, 0xff, 0xa0, 0x0c, 0xd9, 0x57, 0x14, 0xff, 0x72, 0x9e, 0xfe, 0xf4, 0xcc, 0xd3, 0x3f, 0xb4, - 0x60, 0x82, 0xd6, 0xce, 0x02, 0x5c, 0x64, 0xd8, 0xab, 0x7a, 0x76, 0xc0, 0x3a, 0xe0, 0xd9, 0x81, - 0xa7, 0xa9, 0xb4, 0x73, 0xc3, 0x56, 0x22, 0x5c, 0x3d, 0x9a, 0x10, 0xa3, 0x50, 0x2c, 0xb0, 0x82, - 0x8e, 0x44, 0x91, 0xb8, 0x1f, 0xa4, 0xd3, 0x91, 0x28, 0xc2, 0x02, 0x2b, 0x5f, 0x25, 0xe8, 0xeb, - 0xf2, 0x2a, 0x01, 0xcb, 0xc8, 0x24, 0x82, 0x2a, 0x84, 0x5a, 0xa1, 0x65, 0x64, 0x92, 0xd1, 0x16, - 0x29, 0x8d, 0xfd, 0x9d, 0x32, 0x8c, 0xd4, 0x42, 0x37, 0x8d, 0x67, 0x7f, 0xd1, 0x88, 0x67, 0x3f, - 0x93, 0x89, 0x67, 0x9f, 0xd0, 0x69, 0x1f, 0x4c, 0x38, 0xbb, 0xc8, 0xdc, 0xc5, 0xde, 0xcd, 0x38, - 0x64, 0x28, 0xbb, 0x91, 0xb9, 0x4b, 0x31, 0xc2, 0x26, 0xdf, 0x9f, 0xa5, 0x10, 0xf6, 0xff, 0x6b, - 0xc1, 0x58, 0x2d, 0x74, 0xe9, 0x04, 0xfd, 0x59, 0x9a, 0x8d, 0x7a, 0xbe, 0xaf, 0x81, 0x03, 0xf2, - 0x7d, 0xfd, 0x2b, 0x0b, 0x06, 0x6b, 0xa1, 0x7b, 0x0c, 0x6e, 0xd0, 0x15, 0xd3, 0x0d, 0xfa, 0x44, - 0xae, 0xe4, 0xed, 0xe2, 0xf9, 0xfc, 0x6e, 0x19, 0x46, 0x69, 0x8b, 0xc3, 0x0d, 0xf9, 0xbd, 0x8c, - 0xb1, 0xb1, 0x0a, 0x8c, 0x0d, 0x55, 0x09, 0x43, 0xdf, 0x0f, 0xef, 0x65, 0xbf, 0xdd, 0x0a, 0x83, - 0x62, 0x81, 0x45, 0xe7, 0x60, 0xa8, 0x19, 0x91, 0x6d, 0x2f, 0x6c, 0xc5, 0xd9, 0xbb, 0x86, 0x35, - 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x08, 0x23, 0xb1, 0x17, 0x34, 0x88, 0x0c, 0xb9, 0xe8, 0x63, 0x21, - 0x17, 0x3c, 0xb5, 0xa2, 0x06, 0xc7, 0x06, 0x15, 0xba, 0x0d, 0x15, 0xf6, 0x9f, 0xad, 0xa0, 0xde, - 0x9f, 0x15, 0xe0, 0xf9, 0xc4, 0x24, 0x03, 0x9c, 0xf2, 0x42, 0x17, 0x00, 0x12, 0x19, 0x1c, 0x12, - 0x8b, 0xac, 0x28, 0x4a, 0x2f, 0x55, 0x61, 0x23, 0x31, 0xd6, 0xa8, 0xd0, 0x73, 0x50, 0x49, 0x1c, - 0xcf, 0xbf, 0xea, 0x05, 0x24, 0x16, 0xc1, 0x35, 0x22, 0x4d, 0xb2, 0x00, 0xe2, 0x14, 0x4f, 0xf7, - 0x7b, 0x76, 0xd3, 0x99, 0x3f, 0x59, 0x32, 0xc4, 0xa8, 0xd9, 0x7e, 0x7f, 0x55, 0x41, 0xb1, 0x46, - 0x61, 0x5f, 0x84, 0x93, 0xb5, 0xd0, 0xa5, 0x46, 0xfc, 0x4a, 0x18, 0xdd, 0x73, 0x22, 0x57, 0x7e, - 0xbf, 0x59, 0x99, 0x9d, 0x97, 0xee, 0xc9, 0xfd, 0xdc, 0x33, 0x68, 0x64, 0xdb, 0x7d, 0x81, 0xed, - 0xf8, 0x3d, 0x5e, 0x94, 0xf8, 0x71, 0x09, 0x50, 0x8d, 0x85, 0xaf, 0x18, 0x2f, 0xdc, 0x6c, 0xc2, - 0x58, 0x4c, 0xae, 0x7a, 0x41, 0xeb, 0xbe, 0x60, 0x55, 0xec, 0x66, 0x4a, 0x7d, 0x59, 0x2f, 0xc3, - 0xfd, 0x11, 0x26, 0x0c, 0x67, 0xf8, 0xd2, 0xc1, 0x8c, 0x5a, 0xc1, 0x42, 0x7c, 0x33, 0x26, 0x91, - 0x78, 0xd1, 0x85, 0x0d, 0x26, 0x96, 0x40, 0x9c, 0xe2, 0xe9, 0xe4, 0x61, 0x7f, 0xae, 0x87, 0x01, - 0x0e, 0xc3, 0x44, 0x4e, 0x37, 0x96, 0xe1, 0x5f, 0x83, 0x63, 0x83, 0x0a, 0xad, 0x00, 0x8a, 0x5b, - 0xcd, 0xa6, 0xcf, 0x4e, 0x04, 0x1d, 0xff, 0x52, 0x14, 0xb6, 0x9a, 0x3c, 0x8a, 0x59, 0x24, 0xc7, - 0xaf, 0xb7, 0x61, 0x71, 0x87, 0x12, 0x54, 0x58, 0xac, 0xc7, 0xec, 0xb7, 0xb8, 0xf6, 0xcc, 0xbd, - 0x8a, 0x75, 0x06, 0xc2, 0x12, 0x67, 0x7f, 0x99, 0x6d, 0x70, 0xec, 0xa9, 0x8d, 0xa4, 0x15, 0x11, - 0xb4, 0x05, 0xa3, 0x4d, 0xb6, 0x89, 0x25, 0x51, 0xe8, 0xfb, 0x44, 0xea, 0x97, 0x87, 0x0b, 0xa0, - 0xe1, 0xc9, 0xf5, 0x75, 0x76, 0xd8, 0xe4, 0x6e, 0xff, 0xe2, 0x18, 0x93, 0x55, 0xe2, 0x50, 0x76, - 0x50, 0x84, 0xca, 0x0a, 0x4d, 0xee, 0x23, 0x45, 0x1e, 0xcd, 0x4a, 0xf7, 0x01, 0x11, 0x78, 0x8b, - 0x25, 0x17, 0xf4, 0x79, 0x16, 0x08, 0xce, 0x05, 0x44, 0xf1, 0xa7, 0x00, 0x39, 0xbd, 0x11, 0x04, - 0x2e, 0x58, 0x60, 0x8d, 0x1d, 0xba, 0x0a, 0xa3, 0xe2, 0x65, 0x06, 0xe1, 0xa6, 0x28, 0x1b, 0x26, - 0xf6, 0x28, 0xd6, 0x91, 0xfb, 0x59, 0x00, 0x36, 0x0b, 0xa3, 0x0d, 0x78, 0x5c, 0x7b, 0x79, 0xa8, - 0x43, 0xb0, 0x17, 0x97, 0x3c, 0x4f, 0xec, 0xed, 0xce, 0x3e, 0xbe, 0x76, 0x10, 0x21, 0x3e, 0x98, - 0x0f, 0xba, 0x01, 0x27, 0x9d, 0x46, 0xe2, 0x6d, 0x93, 0x2a, 0x71, 0x5c, 0xdf, 0x0b, 0x88, 0x79, - 0x37, 0xfe, 0xd1, 0xbd, 0xdd, 0xd9, 0x93, 0x0b, 0x9d, 0x08, 0x70, 0xe7, 0x72, 0xe8, 0x53, 0x50, - 0x71, 0x83, 0x58, 0x8c, 0xc1, 0x80, 0xf1, 0xd0, 0x56, 0xa5, 0x7a, 0xbd, 0xae, 0xfa, 0x9f, 0xfe, - 0xc1, 0x69, 0x01, 0xf4, 0x2e, 0x7f, 0x48, 0x5e, 0x59, 0x33, 0xfc, 0x81, 0xb7, 0x97, 0x0b, 0xd9, - 0xcf, 0xc6, 0x8d, 0x15, 0xee, 0xc1, 0x53, 0x41, 0x95, 0xc6, 0x65, 0x16, 0xa3, 0x0a, 0xf4, 0x59, - 0x40, 0x31, 0x89, 0xb6, 0xbd, 0x06, 0x59, 0x68, 0xb0, 0x7c, 0xa4, 0xcc, 0xc7, 0x33, 0x64, 0xdc, - 0x2e, 0x40, 0xf5, 0x36, 0x0a, 0xdc, 0xa1, 0x14, 0xba, 0x4c, 0x25, 0x8f, 0x0e, 0x15, 0x31, 0xb0, - 0x52, 0x31, 0x9c, 0xae, 0x92, 0x66, 0x44, 0x1a, 0x4e, 0x42, 0x5c, 0x93, 0x23, 0xce, 0x94, 0xa3, - 0xfb, 0x92, 0x4a, 0x39, 0x0f, 0x66, 0xe4, 0x66, 0x7b, 0xda, 0x79, 0x6a, 0x67, 0x6d, 0x86, 0x71, - 0x72, 0x9d, 0x24, 0xf7, 0xc2, 0xe8, 0x2e, 0x3b, 0x69, 0x18, 0xd2, 0x92, 0xbb, 0xa5, 0x28, 0xac, - 0xd3, 0x51, 0x1d, 0x8a, 0x1d, 0x71, 0xad, 0x56, 0xd9, 0xf9, 0xc1, 0x50, 0xba, 0x76, 0x2e, 0x73, - 0x30, 0x96, 0x78, 0x49, 0xba, 0x5a, 0x5b, 0x62, 0x67, 0x01, 0x19, 0xd2, 0xd5, 0xda, 0x12, 0x96, - 0x78, 0x14, 0xb6, 0x3f, 0x67, 0x36, 0x56, 0xe4, 0x5c, 0xa6, 0x5d, 0x92, 0x17, 0x7c, 0xd1, 0xec, - 0x3e, 0x4c, 0xa8, 0x27, 0xd5, 0x78, 0xde, 0xcd, 0x78, 0x7a, 0xbc, 0xc8, 0x33, 0xf6, 0x1d, 0xd3, - 0x77, 0x2a, 0xbf, 0xde, 0x6a, 0x86, 0x27, 0x6e, 0xab, 0xc5, 0xc8, 0xf1, 0x30, 0x91, 0xfb, 0x8c, - 0xc0, 0x3c, 0x54, 0xe2, 0xd6, 0x1d, 0x37, 0xdc, 0x72, 0xbc, 0x80, 0x39, 0xec, 0xf5, 0x47, 0xd9, - 0x25, 0x02, 0xa7, 0x34, 0xa8, 0x06, 0x43, 0x8e, 0x30, 0xe1, 0x84, 0x63, 0x3d, 0xe7, 0x0e, 0xb8, - 0x34, 0xf8, 0xb8, 0x77, 0x55, 0xfe, 0xc3, 0x8a, 0x0b, 0x7a, 0x05, 0x46, 0xc5, 0x15, 0x26, 0x11, - 0x6a, 0x78, 0xc2, 0x0c, 0x77, 0xaf, 0xeb, 0x48, 0x6c, 0xd2, 0xa2, 0x0d, 0x18, 0xa3, 0x5c, 0x52, - 0x01, 0x38, 0x3d, 0xd5, 0x9b, 0x0c, 0xd5, 0x12, 0x36, 0xeb, 0x6c, 0x70, 0x86, 0x2d, 0x72, 0xe1, - 0x31, 0xa7, 0x95, 0x84, 0x5b, 0x74, 0x25, 0x98, 0xeb, 0x64, 0x2d, 0xbc, 0x4b, 0x82, 0xe9, 0x93, - 0x6c, 0x06, 0x9e, 0xd9, 0xdb, 0x9d, 0x7d, 0x6c, 0xe1, 0x00, 0x3a, 0x7c, 0x20, 0x17, 0xf4, 0x16, - 0x0c, 0x27, 0xa1, 0x2f, 0x22, 0x88, 0xe3, 0xe9, 0x53, 0x45, 0x32, 0xcf, 0xac, 0xa9, 0x02, 0xba, - 0x1b, 0x43, 0x31, 0xc1, 0x3a, 0xc7, 0x99, 0x4f, 0xc3, 0x64, 0x9b, 0x48, 0xea, 0x29, 0xc8, 0xf2, - 0xbf, 0xf6, 0x43, 0x45, 0x79, 0xf4, 0xd0, 0xbc, 0xe9, 0xbc, 0x7d, 0x34, 0xeb, 0xbc, 0x1d, 0xa2, - 0x0a, 0x94, 0xee, 0xaf, 0xfd, 0x42, 0x87, 0x47, 0xb4, 0x9f, 0xcd, 0x5d, 0x83, 0xc5, 0xef, 0x3d, - 0xf5, 0xf0, 0xd4, 0x78, 0x6a, 0xd5, 0xf5, 0x1d, 0x68, 0xd5, 0x15, 0x7c, 0x18, 0x8e, 0xda, 0x6f, - 0xcd, 0xd0, 0x5d, 0xad, 0x65, 0xdf, 0x3d, 0xaa, 0x51, 0x20, 0xe6, 0x38, 0xa6, 0x77, 0xd3, 0x3d, - 0x95, 0xe9, 0xdd, 0x83, 0x87, 0xd4, 0xbb, 0x25, 0x03, 0x9c, 0xf2, 0x42, 0xdb, 0x30, 0xd9, 0x30, - 0x9f, 0xb1, 0x52, 0xb7, 0x99, 0x9e, 0xef, 0xe1, 0x19, 0xa9, 0x96, 0xf6, 0xc6, 0xc5, 0x52, 0x96, - 0x1f, 0x6e, 0xaf, 0x02, 0xbd, 0x02, 0x43, 0xef, 0x86, 0x31, 0x3b, 0x56, 0x10, 0x1b, 0x8b, 0xbc, - 0x35, 0x32, 0xf4, 0xda, 0x8d, 0x3a, 0x83, 0xef, 0xef, 0xce, 0x0e, 0xd7, 0x42, 0x57, 0xfe, 0xc5, - 0xaa, 0x00, 0xfa, 0x8a, 0x05, 0x27, 0x8d, 0x75, 0xa6, 0x5a, 0x0e, 0x87, 0x69, 0xf9, 0xe3, 0xa2, - 0xe6, 0x93, 0xab, 0x9d, 0x78, 0xe2, 0xce, 0x55, 0xd9, 0xbf, 0xcd, 0x5d, 0x98, 0xc2, 0xa9, 0x41, - 0xe2, 0x96, 0x7f, 0x1c, 0xf9, 0xe6, 0x6f, 0x18, 0xfe, 0x96, 0x07, 0xe0, 0x44, 0xff, 0xcf, 0x16, - 0x73, 0xa2, 0xaf, 0x91, 0xad, 0xa6, 0xef, 0x24, 0xc7, 0x11, 0x83, 0xfb, 0x79, 0x18, 0x4a, 0x44, - 0x6d, 0xc5, 0x92, 0xe5, 0x6b, 0xcd, 0x63, 0x87, 0x0b, 0x6a, 0x63, 0x92, 0x50, 0xac, 0x18, 0xda, - 0xff, 0x9e, 0x7f, 0x15, 0x89, 0x39, 0x06, 0x4f, 0xc1, 0x75, 0xd3, 0x53, 0xf0, 0x4c, 0xe1, 0xbe, - 0x74, 0xf1, 0x18, 0xfc, 0xc0, 0xec, 0x01, 0xb3, 0x1f, 0x7e, 0x7a, 0x4e, 0x79, 0xec, 0x5f, 0xb1, - 0x60, 0xaa, 0xd3, 0xa1, 0x38, 0x55, 0x30, 0xb8, 0xf5, 0xa2, 0xce, 0xbf, 0xd4, 0xa8, 0xde, 0x12, - 0x70, 0xac, 0x28, 0x0a, 0x67, 0xaf, 0xee, 0x2d, 0xc1, 0xd2, 0x0d, 0x30, 0x1f, 0x44, 0x43, 0xaf, - 0xf2, 0x90, 0x7b, 0x4b, 0xbd, 0x58, 0xd6, 0x5b, 0xb8, 0xbd, 0xfd, 0xeb, 0x25, 0x98, 0xe2, 0x4e, - 0xe8, 0x85, 0xed, 0xd0, 0x73, 0x6b, 0xa1, 0x2b, 0x2e, 0x20, 0xb8, 0x30, 0xd2, 0xd4, 0x8c, 0xcf, - 0x62, 0x09, 0x5b, 0x74, 0x73, 0x35, 0x55, 0xf8, 0x75, 0x28, 0x36, 0xb8, 0xd2, 0x5a, 0xc8, 0xb6, - 0xd7, 0x50, 0x3e, 0xcd, 0x52, 0xcf, 0x3b, 0x83, 0xaa, 0x65, 0x59, 0xe3, 0x83, 0x0d, 0xae, 0x47, - 0xf0, 0xe8, 0x84, 0xfd, 0x8f, 0x2c, 0x78, 0xa4, 0x4b, 0x52, 0x17, 0x5a, 0xdd, 0x3d, 0xe6, 0xf8, - 0x17, 0x2f, 0xee, 0xa9, 0xea, 0xf8, 0x71, 0x00, 0x16, 0x58, 0x74, 0x07, 0x80, 0xbb, 0xf3, 0xd9, - 0xfb, 0xeb, 0xa5, 0x22, 0x51, 0x43, 0x6d, 0xa9, 0x13, 0xb4, 0x5b, 0xf5, 0xea, 0xc5, 0x75, 0x8d, - 0xab, 0xfd, 0xed, 0x32, 0xf4, 0xf3, 0x87, 0x9d, 0x6b, 0x30, 0xb8, 0xc9, 0x93, 0xcc, 0xf6, 0x96, - 0xe3, 0x36, 0x35, 0x2e, 0x38, 0x00, 0x4b, 0x36, 0xe8, 0x1a, 0x9c, 0xa0, 0x3b, 0x8b, 0xe7, 0xf8, - 0x55, 0xe2, 0x3b, 0x3b, 0xd2, 0x5a, 0xe5, 0x2f, 0x11, 0xc8, 0x94, 0xd9, 0x27, 0x56, 0xdb, 0x49, - 0x70, 0xa7, 0x72, 0xe8, 0xd5, 0xb6, 0x9c, 0x70, 0x3c, 0x79, 0xaf, 0xd2, 0x54, 0x0f, 0xce, 0x0b, - 0x47, 0xf5, 0xe9, 0x66, 0x9b, 0x5d, 0xae, 0xbd, 0x9f, 0x6b, 0xda, 0xe2, 0x26, 0x2d, 0x8b, 0x2d, - 0x68, 0xb1, 0x98, 0x8a, 0xb5, 0xcd, 0x88, 0xc4, 0x9b, 0xa1, 0xef, 0x8a, 0xa7, 0x1f, 0xd3, 0xd8, - 0x82, 0x0c, 0x1e, 0xb7, 0x95, 0xa0, 0x5c, 0xd6, 0x1d, 0xcf, 0x6f, 0x45, 0x24, 0xe5, 0x32, 0x60, - 0x72, 0x59, 0xc9, 0xe0, 0x71, 0x5b, 0x09, 0x3a, 0xb7, 0x4e, 0x8a, 0xd7, 0x02, 0xe5, 0x15, 0x66, - 0x21, 0x82, 0x3e, 0x07, 0x83, 0x32, 0x90, 0xbd, 0x50, 0xa6, 0x0d, 0x11, 0x38, 0xa0, 0x5e, 0x1e, - 0xd4, 0x5e, 0xa6, 0x12, 0x21, 0xec, 0x92, 0xdf, 0x61, 0x5e, 0xa5, 0xfb, 0x53, 0x0b, 0x4e, 0x74, - 0x08, 0xc8, 0xe2, 0x22, 0x6d, 0xc3, 0x8b, 0x13, 0x95, 0x17, 0x5f, 0x13, 0x69, 0x1c, 0x8e, 0x15, - 0x05, 0x5d, 0x2d, 0x5c, 0x68, 0x66, 0x05, 0xa5, 0x08, 0x01, 0x11, 0xd8, 0xde, 0x04, 0x25, 0x3a, - 0x03, 0x7d, 0xad, 0x98, 0x44, 0xf2, 0x89, 0x38, 0x29, 0xe7, 0x99, 0x1f, 0x90, 0x61, 0xa8, 0xda, - 0xba, 0xa1, 0x5c, 0x70, 0x9a, 0xda, 0xca, 0x9d, 0x70, 0x1c, 0x67, 0x7f, 0xa3, 0x0c, 0xe3, 0x99, - 0xc0, 0x4c, 0xda, 0x90, 0xad, 0x30, 0xf0, 0x92, 0x50, 0x65, 0x3f, 0xe3, 0xaf, 0x52, 0x91, 0xe6, - 0xe6, 0x35, 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x2d, 0x5f, 0x05, 0xcd, 0xe6, 0xfb, 0x5f, 0xac, 0x1a, - 0x0f, 0x83, 0x16, 0x7d, 0xab, 0xe3, 0x49, 0xe8, 0x6b, 0x86, 0xea, 0x91, 0x67, 0xf5, 0x3d, 0xf1, - 0x62, 0xb5, 0x16, 0x86, 0x3e, 0x66, 0x48, 0xf4, 0x94, 0xe8, 0x7d, 0xe6, 0xe4, 0x02, 0x3b, 0x6e, - 0x18, 0x6b, 0x43, 0xf0, 0x0c, 0x0c, 0xde, 0x25, 0x3b, 0x91, 0x17, 0x6c, 0x64, 0xcf, 0x6d, 0xae, - 0x70, 0x30, 0x96, 0x78, 0xf3, 0x3d, 0x8e, 0xc1, 0x23, 0x7e, 0x8f, 0x63, 0x28, 0x77, 0x1f, 0xfc, - 0xae, 0x05, 0xe3, 0x2c, 0x25, 0xa8, 0xb8, 0x40, 0xef, 0x85, 0xc1, 0x31, 0xe8, 0x18, 0x4f, 0x42, - 0x7f, 0x44, 0x2b, 0xcd, 0x26, 0xd4, 0x67, 0x2d, 0xc1, 0x1c, 0x87, 0x1e, 0x83, 0x3e, 0xd6, 0x04, - 0xfa, 0x19, 0x47, 0x78, 0xe6, 0xf1, 0xaa, 0x93, 0x38, 0x98, 0x41, 0xd9, 0x5d, 0x28, 0x4c, 0x9a, - 0xbe, 0xc7, 0x1b, 0x9d, 0xba, 0x5b, 0x1f, 0xb6, 0xbb, 0x50, 0x1d, 0x1b, 0xf9, 0xa0, 0xee, 0x42, - 0x75, 0x66, 0x7e, 0xb0, 0x9e, 0xff, 0xbf, 0x4a, 0x70, 0xba, 0x63, 0xb9, 0xf4, 0x04, 0x78, 0xc5, - 0x38, 0x01, 0xbe, 0x90, 0x39, 0x01, 0xb6, 0x0f, 0x2e, 0xfd, 0x60, 0xce, 0x84, 0x3b, 0x1f, 0xd5, - 0x96, 0x8f, 0xf1, 0xa8, 0xb6, 0xaf, 0xa8, 0x8a, 0xd3, 0x9f, 0xa3, 0xe2, 0xfc, 0xbe, 0x05, 0x8f, - 0x76, 0x1c, 0xb2, 0x87, 0xee, 0xf2, 0x59, 0xc7, 0x56, 0x76, 0xb1, 0x4e, 0x7e, 0xb9, 0xdc, 0xa5, - 0x57, 0xcc, 0x4e, 0x39, 0x4b, 0xa5, 0x10, 0x43, 0xc6, 0x42, 0x79, 0x1b, 0xe1, 0x12, 0x88, 0xc3, - 0xb0, 0xc2, 0xa2, 0x58, 0xbb, 0xbc, 0xc5, 0x1b, 0xb9, 0x7c, 0xc8, 0x05, 0x35, 0x67, 0xfa, 0xc9, - 0xf5, 0xac, 0x00, 0xd9, 0x2b, 0x5d, 0xb7, 0x35, 0xcb, 0xb3, 0x7c, 0x18, 0xcb, 0x73, 0xa4, 0xb3, - 0xd5, 0x89, 0x16, 0x60, 0x7c, 0xcb, 0x0b, 0xd8, 0x33, 0x9e, 0xa6, 0xf6, 0xa4, 0x6e, 0xd0, 0x5e, - 0x33, 0xd1, 0x38, 0x4b, 0x3f, 0xf3, 0x0a, 0x8c, 0x1e, 0xde, 0xbb, 0xf6, 0x7e, 0x19, 0x3e, 0x7c, - 0x80, 0x50, 0xe0, 0xbb, 0x83, 0xf1, 0x5d, 0xb4, 0xdd, 0xa1, 0xed, 0xdb, 0xd4, 0x60, 0x6a, 0xbd, - 0xe5, 0xfb, 0x3b, 0x2c, 0x7e, 0x8a, 0xb8, 0x92, 0x42, 0x28, 0x35, 0xea, 0xbd, 0xf0, 0x95, 0x0e, - 0x34, 0xb8, 0x63, 0x49, 0xf4, 0x59, 0x40, 0xe1, 0x1d, 0x96, 0x34, 0xd7, 0x4d, 0xb3, 0x1e, 0xb0, - 0x4f, 0x50, 0x4e, 0x97, 0xea, 0x8d, 0x36, 0x0a, 0xdc, 0xa1, 0x14, 0xd5, 0x53, 0xd9, 0x53, 0xe3, - 0xaa, 0x59, 0x19, 0x3d, 0x15, 0xeb, 0x48, 0x6c, 0xd2, 0xa2, 0x4b, 0x30, 0xe9, 0x6c, 0x3b, 0x1e, - 0x4f, 0x82, 0x25, 0x19, 0x70, 0x45, 0x55, 0xf9, 0xaf, 0x16, 0xb2, 0x04, 0xb8, 0xbd, 0x0c, 0x6a, - 0x1a, 0x0e, 0x49, 0x9e, 0x2e, 0xff, 0x53, 0x87, 0x98, 0xc1, 0x85, 0x5d, 0x94, 0xf6, 0xff, 0xb0, - 0xe8, 0xd6, 0xd7, 0xe1, 0xc5, 0x47, 0x3a, 0x22, 0xca, 0xc1, 0xa6, 0x5d, 0x46, 0x53, 0x23, 0xb2, - 0xa4, 0x23, 0xb1, 0x49, 0xcb, 0xa7, 0x46, 0x9c, 0x86, 0x73, 0x1b, 0xda, 0xa6, 0xb8, 0xc7, 0xa9, - 0x28, 0xa8, 0x06, 0xed, 0x7a, 0xdb, 0x5e, 0x1c, 0x46, 0x62, 0x01, 0xf5, 0x18, 0xdc, 0x9b, 0xca, - 0xcb, 0x2a, 0x67, 0x83, 0x25, 0x3f, 0xfb, 0x9b, 0x25, 0x18, 0x95, 0x35, 0xbe, 0xd6, 0x0a, 0x13, - 0xe7, 0x18, 0xb6, 0xf4, 0xd7, 0x8c, 0x2d, 0x7d, 0xbe, 0xd8, 0xb5, 0x56, 0xd6, 0xb8, 0xae, 0x5b, - 0xf9, 0xe7, 0x32, 0x5b, 0xf9, 0xf9, 0x5e, 0x98, 0x1e, 0xbc, 0x85, 0xff, 0x47, 0x0b, 0x26, 0x0d, - 0xfa, 0x63, 0xd8, 0x49, 0x6a, 0xe6, 0x4e, 0xf2, 0x5c, 0x0f, 0xbd, 0xe9, 0xb2, 0x83, 0x7c, 0xa7, - 0x94, 0xe9, 0x05, 0xdb, 0x39, 0xbe, 0x04, 0x7d, 0x9b, 0x4e, 0xe4, 0x16, 0xcb, 0x08, 0xd9, 0x56, - 0x7c, 0xee, 0xb2, 0x13, 0xb9, 0x5c, 0xfe, 0x9f, 0x53, 0xef, 0x51, 0x39, 0x91, 0x9b, 0x7b, 0xcb, - 0x81, 0x55, 0x8a, 0x2e, 0xc2, 0x40, 0xdc, 0x08, 0x9b, 0x2a, 0x0e, 0xf4, 0x0c, 0x7f, 0xab, 0x8a, - 0x42, 0xf6, 0x77, 0x67, 0x91, 0x59, 0x1d, 0x05, 0x63, 0x41, 0x3f, 0xb3, 0x01, 0x15, 0x55, 0xf5, - 0x91, 0x46, 0xc2, 0xff, 0xcf, 0x32, 0x9c, 0xe8, 0x30, 0x57, 0xd0, 0x97, 0x8d, 0x71, 0x7b, 0xa5, - 0xe7, 0xc9, 0xf6, 0x01, 0x47, 0xee, 0xcb, 0xcc, 0x52, 0x72, 0xc5, 0xec, 0x38, 0x44, 0xf5, 0x37, - 0x63, 0x92, 0xad, 0x9e, 0x82, 0xf2, 0xab, 0xa7, 0xd5, 0x1e, 0xdb, 0xf0, 0xd3, 0x8a, 0x54, 0x4b, - 0x8f, 0xf4, 0x3b, 0xff, 0x8d, 0x3e, 0x98, 0xea, 0x74, 0x7f, 0x1e, 0x7d, 0xcd, 0xca, 0x3c, 0xfb, - 0xf0, 0x6a, 0xef, 0x97, 0xf0, 0xf9, 0x5b, 0x10, 0x22, 0xe7, 0xcc, 0x9c, 0xf9, 0x10, 0x44, 0xee, - 0x88, 0x8b, 0xda, 0xd9, 0xfd, 0xa4, 0x88, 0x3f, 0xe1, 0x21, 0xa5, 0xc2, 0x67, 0x0e, 0xd1, 0x14, - 0xf1, 0x0a, 0x48, 0x9c, 0xb9, 0x9f, 0x24, 0xc1, 0xf9, 0xf7, 0x93, 0x64, 0x1b, 0x66, 0x3c, 0x18, - 0xd6, 0xfa, 0x75, 0xa4, 0xd3, 0xe0, 0x2e, 0xdd, 0xa2, 0xb4, 0x76, 0x1f, 0xe9, 0x54, 0xf8, 0xfb, - 0x16, 0x64, 0x82, 0xb6, 0x94, 0x5b, 0xc6, 0xea, 0xea, 0x96, 0x39, 0x03, 0x7d, 0x51, 0xe8, 0x93, - 0xec, 0x93, 0x04, 0x38, 0xf4, 0x09, 0x66, 0x18, 0xf5, 0x44, 0x6d, 0xb9, 0xdb, 0x13, 0xb5, 0xd4, - 0x4e, 0xf7, 0xc9, 0x36, 0x91, 0x4e, 0x12, 0x25, 0xc6, 0xaf, 0x52, 0x20, 0xe6, 0x38, 0xfb, 0xf7, - 0xca, 0x30, 0xc0, 0x3d, 0x11, 0xc7, 0xb0, 0x4f, 0xd7, 0x84, 0x53, 0xa0, 0xd0, 0x9d, 0x74, 0xde, - 0xaa, 0xb9, 0xaa, 0x93, 0x38, 0x7c, 0x72, 0xa9, 0x3e, 0xa6, 0x8e, 0x04, 0x34, 0x67, 0x8c, 0xc2, - 0x4c, 0xc6, 0xd6, 0x05, 0xce, 0x43, 0x1b, 0x93, 0x4d, 0x80, 0x98, 0x3d, 0x89, 0x48, 0x79, 0x88, - 0xcc, 0x9b, 0x2f, 0x16, 0x6a, 0x47, 0x5d, 0x15, 0xe3, 0xad, 0x49, 0xd3, 0xfd, 0x29, 0x04, 0xd6, - 0x78, 0xcf, 0xbc, 0x0c, 0x15, 0x45, 0x9c, 0x67, 0x04, 0x8c, 0xe8, 0x93, 0xf3, 0xaf, 0xc0, 0x78, - 0xa6, 0xae, 0x9e, 0x6c, 0x88, 0xdf, 0xb2, 0x60, 0x3c, 0xf3, 0x9a, 0x3b, 0xfa, 0xaa, 0x05, 0x53, - 0x7e, 0x07, 0x47, 0x94, 0xf8, 0xcc, 0x87, 0x71, 0x61, 0x29, 0xf3, 0xa1, 0x13, 0x16, 0x77, 0xac, - 0x8d, 0x9a, 0x95, 0xfc, 0x85, 0x57, 0xc7, 0x17, 0x31, 0xb0, 0x23, 0x3c, 0xe7, 0x30, 0x87, 0x61, - 0x85, 0xb5, 0x7f, 0x62, 0xc1, 0x64, 0xdb, 0x83, 0xe1, 0x0f, 0x4b, 0x37, 0x44, 0x76, 0xe5, 0x52, - 0x97, 0xec, 0xca, 0x7a, 0x2f, 0xcb, 0x07, 0xf6, 0xf2, 0xd7, 0x2d, 0x10, 0x33, 0xf4, 0x18, 0x34, - 0xc0, 0x55, 0x53, 0x03, 0xfc, 0x48, 0x91, 0x49, 0xdf, 0x45, 0xf5, 0xfb, 0xa5, 0x12, 0x4c, 0x70, - 0x82, 0xd4, 0xa7, 0xfe, 0xb0, 0x7c, 0x9c, 0xde, 0x5e, 0xfd, 0x50, 0x4f, 0x2d, 0x76, 0xee, 0xa9, - 0xf1, 0x2d, 0xfb, 0x0e, 0xfc, 0x96, 0x7f, 0x6e, 0x01, 0xe2, 0x63, 0x92, 0x7d, 0x1e, 0x97, 0x3b, - 0x77, 0x35, 0x83, 0x2e, 0x95, 0x1c, 0x0a, 0x83, 0x35, 0xaa, 0x07, 0xdc, 0x85, 0xcc, 0x89, 0x46, - 0x39, 0xff, 0x44, 0xa3, 0x87, 0x5e, 0xff, 0x76, 0x19, 0xb2, 0xc1, 0x70, 0xe8, 0x6d, 0x18, 0x69, - 0x38, 0x4d, 0xe7, 0x8e, 0xe7, 0x7b, 0x89, 0x47, 0xe2, 0x62, 0x47, 0xa6, 0x4b, 0x5a, 0x09, 0x71, - 0x90, 0xa0, 0x41, 0xb0, 0xc1, 0x11, 0xcd, 0x01, 0x34, 0x23, 0x6f, 0xdb, 0xf3, 0xc9, 0x06, 0xd3, - 0x59, 0x59, 0x34, 0x3d, 0x3f, 0xfd, 0x93, 0x50, 0xac, 0x51, 0x74, 0x88, 0xbe, 0x2e, 0x1f, 0x47, - 0xf4, 0x75, 0x5f, 0x8f, 0xd1, 0xd7, 0xfd, 0x85, 0xa2, 0xaf, 0x31, 0x9c, 0x92, 0xfe, 0x7f, 0xfa, - 0x7f, 0xc5, 0xf3, 0x09, 0x4f, 0x32, 0x2b, 0xa2, 0xed, 0x67, 0xf6, 0x76, 0x67, 0x4f, 0xe1, 0x8e, - 0x14, 0xb8, 0x4b, 0x49, 0xbb, 0x05, 0x27, 0xea, 0x24, 0xf2, 0x58, 0xee, 0x3f, 0x37, 0x5d, 0x4b, - 0x5f, 0x80, 0x4a, 0x94, 0x59, 0xc6, 0x3d, 0x5e, 0xa9, 0xd6, 0xb2, 0x45, 0xc9, 0x65, 0x9b, 0xb2, - 0xb4, 0xff, 0x56, 0x09, 0x06, 0x45, 0x18, 0xdc, 0x31, 0x28, 0x1f, 0x57, 0x0c, 0x27, 0xc1, 0x33, - 0x79, 0xf2, 0x8f, 0x35, 0xab, 0xab, 0x7b, 0xa0, 0x9e, 0x71, 0x0f, 0x3c, 0x57, 0x8c, 0xdd, 0xc1, - 0x8e, 0x81, 0x7f, 0x5e, 0x86, 0x31, 0x33, 0x2c, 0xf0, 0x18, 0x86, 0xe5, 0x75, 0x18, 0x8c, 0x45, - 0x84, 0x6a, 0xa9, 0x48, 0xd4, 0x55, 0xf6, 0x13, 0xa7, 0x67, 0xa9, 0x22, 0x26, 0x55, 0xb2, 0xeb, - 0x18, 0x04, 0x5b, 0x3e, 0x96, 0x20, 0xd8, 0xbc, 0x68, 0xcd, 0xbe, 0x07, 0x11, 0xad, 0x69, 0xff, - 0x90, 0x89, 0x7c, 0x1d, 0x7e, 0x0c, 0xdb, 0xf8, 0x6b, 0xe6, 0xe6, 0x70, 0xae, 0xd0, 0xbc, 0x13, - 0xcd, 0xeb, 0xb2, 0x9d, 0x7f, 0xcf, 0x82, 0x61, 0x41, 0x78, 0x0c, 0x1d, 0xf8, 0xac, 0xd9, 0x81, - 0xa7, 0x0a, 0x75, 0xa0, 0x4b, 0xcb, 0xbf, 0x59, 0x52, 0x2d, 0xaf, 0x89, 0x27, 0xcd, 0x73, 0x33, - 0x1d, 0x0f, 0x35, 0xa3, 0x30, 0x09, 0x1b, 0xa1, 0x2f, 0x14, 0xb8, 0xc7, 0xd2, 0xcb, 0x55, 0x1c, - 0xbe, 0xaf, 0xfd, 0xc6, 0x8a, 0x9a, 0xdd, 0xfd, 0x09, 0xa3, 0x44, 0x6c, 0xa0, 0x9d, 0x1e, 0x54, - 0x77, 0x01, 0xd2, 0x57, 0xac, 0xc5, 0xbd, 0xc4, 0xde, 0x9f, 0x6a, 0x4f, 0x6f, 0x4b, 0x29, 0x5e, - 0x58, 0xe3, 0x2b, 0xc3, 0xf0, 0x59, 0x1d, 0xfd, 0xe6, 0x19, 0xc0, 0x75, 0x01, 0xc7, 0x8a, 0xc2, - 0x7e, 0x99, 0x49, 0x76, 0x36, 0x40, 0xbd, 0x5d, 0x64, 0xfa, 0xc5, 0x01, 0x35, 0xb4, 0xcc, 0xb1, - 0x77, 0x5d, 0xbf, 0x2e, 0x55, 0x54, 0x7c, 0xd2, 0x26, 0xe8, 0x91, 0xb0, 0xe9, 0xed, 0x2a, 0x44, - 0xda, 0x0e, 0x8e, 0x5e, 0x2e, 0x2c, 0x91, 0x7b, 0x38, 0x2a, 0x62, 0xc9, 0xdd, 0x58, 0x46, 0xab, - 0xd5, 0x5a, 0x36, 0x3f, 0xf5, 0x92, 0x44, 0xe0, 0x94, 0x06, 0xcd, 0x0b, 0x83, 0xd2, 0x7c, 0xf1, - 0x5e, 0x1a, 0x94, 0x72, 0x48, 0x34, 0x8b, 0xf2, 0x3c, 0x0c, 0xab, 0x27, 0x3f, 0x6a, 0xfc, 0xb1, - 0x85, 0x0a, 0xd7, 0xaf, 0x96, 0x53, 0x30, 0xd6, 0x69, 0xd0, 0x2a, 0x9c, 0x70, 0xd5, 0xad, 0x8b, - 0x5a, 0xeb, 0x8e, 0xef, 0x35, 0x68, 0x51, 0x7e, 0x63, 0xf2, 0x91, 0xbd, 0xdd, 0xd9, 0x13, 0xd5, - 0x76, 0x34, 0xee, 0x54, 0x06, 0xad, 0xc1, 0x78, 0xcc, 0x9f, 0x36, 0x91, 0xa1, 0xf5, 0x22, 0x6d, - 0xeb, 0xb3, 0xf2, 0xc4, 0xaa, 0x6e, 0xa2, 0xf7, 0x19, 0x88, 0x4b, 0x05, 0x19, 0x8c, 0x9f, 0x65, - 0x81, 0x5e, 0x85, 0x31, 0x5f, 0x7f, 0xb7, 0xb1, 0x26, 0x2e, 0x9f, 0xa8, 0x18, 0x24, 0xe3, 0x55, - 0xc7, 0x1a, 0xce, 0x50, 0xa3, 0xd7, 0x61, 0x5a, 0x87, 0x88, 0x4c, 0x30, 0x4e, 0xb0, 0x41, 0x62, - 0xf1, 0x0c, 0xc2, 0x63, 0x7b, 0xbb, 0xb3, 0xd3, 0x57, 0xbb, 0xd0, 0xe0, 0xae, 0xa5, 0xd1, 0x45, - 0x18, 0x91, 0x23, 0xa9, 0x5d, 0x44, 0x49, 0xa3, 0xdf, 0x34, 0x1c, 0x36, 0x28, 0x3f, 0xd8, 0xc1, - 0xdc, 0x97, 0x68, 0x61, 0x6d, 0x0b, 0x47, 0xef, 0xc0, 0x88, 0xde, 0xc6, 0xec, 0xde, 0x9c, 0xff, - 0x16, 0xa6, 0x50, 0x05, 0x54, 0xcb, 0x75, 0x1c, 0x36, 0x78, 0xdb, 0x37, 0x60, 0xa0, 0xbe, 0x13, - 0x37, 0x12, 0xbf, 0x80, 0x7c, 0x7b, 0xd2, 0xe8, 0x42, 0xba, 0xf6, 0xd8, 0xbb, 0x3c, 0xa2, 0x47, - 0x36, 0x81, 0xf1, 0xb5, 0xa5, 0x1a, 0x7f, 0xf5, 0x7f, 0x81, 0x5b, 0x6f, 0x58, 0x48, 0x37, 0xeb, - 0x90, 0x52, 0xab, 0x83, 0x3c, 0xb4, 0xff, 0xc4, 0x82, 0x7e, 0xf6, 0xa6, 0x4c, 0xde, 0x7b, 0x44, - 0x45, 0x1a, 0x8d, 0x5e, 0x82, 0x01, 0xb2, 0xbe, 0x4e, 0x1a, 0x89, 0x58, 0xc6, 0x32, 0xda, 0x7b, - 0x60, 0x99, 0x41, 0xe9, 0xe2, 0x64, 0x95, 0xf1, 0xbf, 0x58, 0x10, 0xa3, 0xcf, 0x43, 0x25, 0xf1, - 0xb6, 0xc8, 0x82, 0xeb, 0x12, 0xf7, 0x10, 0x77, 0xc5, 0x95, 0xb0, 0x58, 0x93, 0x4c, 0x70, 0xca, - 0xcf, 0x7e, 0xaf, 0x04, 0x90, 0xde, 0xb5, 0xc8, 0xeb, 0xe6, 0x62, 0xdb, 0xb3, 0x4b, 0x4f, 0x77, - 0x78, 0x76, 0x09, 0xa5, 0x0c, 0x3b, 0x3c, 0xba, 0xa4, 0x86, 0xaa, 0x5c, 0x68, 0xa8, 0xfa, 0x7a, - 0x19, 0xaa, 0x25, 0x98, 0x4c, 0xef, 0x8a, 0x98, 0x97, 0xee, 0x58, 0x12, 0xc6, 0xb5, 0x2c, 0x12, - 0xb7, 0xd3, 0xdb, 0xef, 0x59, 0x20, 0x42, 0xd6, 0x0a, 0xcc, 0x56, 0x57, 0x3e, 0x91, 0x62, 0xe4, - 0xa1, 0x7a, 0xb6, 0x48, 0x34, 0x9f, 0xc8, 0x3e, 0xa5, 0xd6, 0x8f, 0x91, 0x73, 0xca, 0xe0, 0x6a, - 0xff, 0x86, 0x05, 0xc3, 0x1c, 0x7d, 0x8d, 0xe9, 0xd4, 0xf9, 0xed, 0xea, 0x29, 0xc3, 0x27, 0x7b, - 0x3d, 0x84, 0x32, 0x56, 0x99, 0x1e, 0xf5, 0xd7, 0x43, 0x24, 0x02, 0xa7, 0x34, 0xe8, 0x19, 0x18, - 0x8c, 0x5b, 0x77, 0x18, 0x79, 0x26, 0x7e, 0xad, 0xce, 0xc1, 0x58, 0xe2, 0xed, 0x7f, 0x59, 0x82, - 0x89, 0x6c, 0xf8, 0x22, 0xc2, 0x30, 0xc0, 0x75, 0xec, 0xac, 0x7a, 0x76, 0x90, 0x2f, 0x47, 0x0b, - 0x7f, 0x04, 0xfe, 0x06, 0x2e, 0x8b, 0x39, 0x13, 0x9c, 0xd0, 0x3a, 0x0c, 0xbb, 0xe1, 0xbd, 0xe0, - 0x9e, 0x13, 0xb9, 0x0b, 0xb5, 0x55, 0xf1, 0x25, 0x72, 0x02, 0x4e, 0xaa, 0x69, 0x01, 0x3d, 0xb8, - 0x92, 0xf9, 0x16, 0x52, 0x14, 0xd6, 0x19, 0x53, 0x9b, 0xb2, 0x11, 0x06, 0xeb, 0xde, 0xc6, 0x35, - 0xa7, 0x59, 0xec, 0x68, 0x75, 0x49, 0x92, 0x6b, 0x75, 0x8c, 0x8a, 0x5b, 0xf6, 0x1c, 0x81, 0x53, - 0x96, 0xf6, 0x1f, 0x9c, 0x00, 0x63, 0x2e, 0x18, 0x69, 0x38, 0xad, 0x07, 0x9e, 0x86, 0xf3, 0x4d, - 0x18, 0x22, 0x5b, 0xcd, 0x64, 0xa7, 0xea, 0x45, 0xc5, 0x92, 0x2a, 0x2f, 0x0b, 0xea, 0x76, 0xee, - 0x12, 0x83, 0x15, 0xc7, 0x2e, 0x49, 0x55, 0xcb, 0x0f, 0x45, 0x52, 0xd5, 0xbe, 0xbf, 0x90, 0xa4, - 0xaa, 0xaf, 0xc3, 0xe0, 0x86, 0x97, 0x60, 0xd2, 0x0c, 0x45, 0xda, 0x82, 0x9c, 0xc9, 0x73, 0x89, - 0x13, 0xb7, 0x67, 0x4a, 0x14, 0x08, 0x2c, 0xd9, 0xa1, 0x35, 0xb5, 0xa8, 0x06, 0x8a, 0xec, 0xe5, - 0xed, 0xbe, 0xbe, 0x8e, 0xcb, 0x4a, 0x24, 0x51, 0x1d, 0xfc, 0xe0, 0x49, 0x54, 0x55, 0xea, 0xd3, - 0xa1, 0x07, 0x95, 0xfa, 0xd4, 0x48, 0x21, 0x5b, 0x39, 0x8a, 0x14, 0xb2, 0xef, 0x59, 0x70, 0xb2, - 0xd9, 0x29, 0x01, 0xb3, 0x48, 0x62, 0xfa, 0xe9, 0x43, 0xa4, 0xa4, 0x36, 0xaa, 0x66, 0x97, 0xc1, - 0x3b, 0x92, 0xe1, 0xce, 0x15, 0xcb, 0x5c, 0xb4, 0xc3, 0x1f, 0x3c, 0x17, 0xed, 0x51, 0x67, 0x3b, - 0x4d, 0x33, 0xd3, 0x8e, 0x1e, 0x49, 0x66, 0xda, 0xb1, 0x07, 0x98, 0x99, 0x56, 0xcb, 0x29, 0x3b, - 0xfe, 0x60, 0x73, 0xca, 0x6e, 0x9a, 0xfb, 0x12, 0x4f, 0x61, 0xfa, 0x52, 0xe1, 0x7d, 0xc9, 0xa8, - 0xe1, 0xe0, 0x9d, 0x89, 0x67, 0xd7, 0x9d, 0xfc, 0x80, 0xd9, 0x75, 0x8d, 0x1c, 0xb5, 0xe8, 0x28, - 0x72, 0xd4, 0xbe, 0xad, 0xef, 0xa0, 0x27, 0x8a, 0xd4, 0xa0, 0x36, 0xca, 0xf6, 0x1a, 0x3a, 0xed, - 0xa1, 0xed, 0x59, 0x70, 0xa7, 0x8e, 0x3b, 0x0b, 0xee, 0xc9, 0x23, 0xcc, 0x82, 0x7b, 0xea, 0x58, - 0xb3, 0xe0, 0x3e, 0xf2, 0x90, 0x64, 0xc1, 0x9d, 0x3e, 0xca, 0x2c, 0xb8, 0x74, 0x80, 0x9b, 0xf2, - 0xaa, 0xce, 0xf4, 0xa3, 0x45, 0x06, 0xb8, 0xe3, 0xcd, 0x1e, 0x3e, 0xc0, 0x0a, 0x85, 0x53, 0xa6, - 0xf6, 0x5f, 0x83, 0xd3, 0x07, 0x4f, 0xb0, 0xf4, 0xed, 0x89, 0x5a, 0xea, 0xd9, 0xca, 0xbc, 0x3d, - 0xc1, 0x94, 0x37, 0x8d, 0xaa, 0x70, 0x9a, 0xce, 0xef, 0x58, 0xf0, 0x48, 0x97, 0x2c, 0x76, 0x85, - 0xef, 0xb9, 0x35, 0x61, 0xbc, 0x69, 0x16, 0x2d, 0x7c, 0x6d, 0xd6, 0xc8, 0x9a, 0xa7, 0x62, 0x91, - 0x33, 0x08, 0x9c, 0x65, 0xbf, 0xf8, 0x91, 0x1f, 0xbd, 0x7f, 0xfa, 0x43, 0x3f, 0x7e, 0xff, 0xf4, - 0x87, 0xfe, 0xe8, 0xfd, 0xd3, 0x1f, 0xfa, 0xb9, 0xbd, 0xd3, 0xd6, 0x8f, 0xf6, 0x4e, 0x5b, 0x3f, - 0xde, 0x3b, 0x6d, 0xfd, 0xe9, 0xde, 0x69, 0xeb, 0xbd, 0x9f, 0x9c, 0xfe, 0xd0, 0x1b, 0xa5, 0xed, - 0xf3, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xa2, 0x84, 0xda, 0xcc, 0xc5, 0x00, 0x00, + // 11000 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, + 0x75, 0x18, 0xae, 0xd9, 0xc5, 0xd7, 0x3e, 0x7c, 0x37, 0x70, 0x47, 0x10, 0x22, 0x0f, 0xc7, 0xa1, + 0x48, 0x1d, 0xc9, 0x23, 0x20, 0x1e, 0x49, 0xf1, 0x24, 0xea, 0x47, 0x09, 0xc0, 0x02, 0x77, 0xd0, + 0x7d, 0x2d, 0x7b, 0x71, 0x77, 0x14, 0xc5, 0x9f, 0xc8, 0xb9, 0x9d, 0x06, 0x30, 0xbc, 0xc1, 0xcc, + 0x72, 0x66, 0x16, 0x77, 0x90, 0xa2, 0x2a, 0x5b, 0x51, 0xc9, 0x49, 0x59, 0x49, 0xe4, 0x72, 0x54, + 0x95, 0x72, 0x52, 0xa5, 0x94, 0xab, 0xe2, 0x28, 0x9f, 0x8e, 0xa2, 0xb2, 0x24, 0x97, 0xe5, 0xa4, + 0xe2, 0x58, 0x8e, 0x5c, 0x95, 0x38, 0xaa, 0x72, 0x25, 0x76, 0xca, 0x15, 0xd8, 0x82, 0x2a, 0xfe, + 0x23, 0x7f, 0xe4, 0x8f, 0xf8, 0x3f, 0x24, 0x95, 0x4a, 0xf5, 0xe7, 0x74, 0xcf, 0xee, 0x62, 0x66, + 0xc1, 0x03, 0x7c, 0x52, 0xe5, 0xbf, 0xdd, 0x7e, 0xaf, 0x5f, 0x7f, 0x4c, 0xf7, 0xeb, 0xf7, 0x5e, + 0xbf, 0xf7, 0x1a, 0xce, 0xdf, 0xbd, 0x18, 0xcf, 0x7b, 0xe1, 0xc2, 0xdd, 0xd6, 0x1d, 0x12, 0x05, + 0x24, 0x21, 0xf1, 0x42, 0xf3, 0xee, 0xe6, 0x82, 0xd3, 0xf4, 0x16, 0x76, 0x5e, 0x58, 0xd8, 0x24, + 0x01, 0x89, 0x9c, 0x84, 0xb8, 0xf3, 0xcd, 0x28, 0x4c, 0x42, 0xf4, 0x18, 0xc7, 0x9e, 0x4f, 0xb1, + 0xe7, 0x9b, 0x77, 0x37, 0xe7, 0x9d, 0xa6, 0x37, 0xbf, 0xf3, 0xc2, 0xec, 0xf3, 0x9b, 0x5e, 0xb2, + 0xd5, 0xba, 0x33, 0xdf, 0x08, 0xb7, 0x17, 0x36, 0xc3, 0xcd, 0x70, 0x81, 0x55, 0xba, 0xd3, 0xda, + 0x60, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0x13, 0x9b, 0x7d, 0x49, 0x34, 0xed, 0x34, 0xbd, 0x6d, 0xa7, + 0xb1, 0xe5, 0x05, 0x24, 0xda, 0x55, 0x8d, 0x47, 0x24, 0x0e, 0x5b, 0x51, 0x83, 0x64, 0xbb, 0x70, + 0x68, 0xad, 0x78, 0x61, 0x9b, 0x24, 0x4e, 0x87, 0x8e, 0xcf, 0x2e, 0x74, 0xab, 0x15, 0xb5, 0x82, + 0xc4, 0xdb, 0x6e, 0x6f, 0xe6, 0xa3, 0x79, 0x15, 0xe2, 0xc6, 0x16, 0xd9, 0x76, 0xda, 0xea, 0xbd, + 0xd8, 0xad, 0x5e, 0x2b, 0xf1, 0xfc, 0x05, 0x2f, 0x48, 0xe2, 0x24, 0x3a, 0x6c, 0x4c, 0x31, 0x89, + 0x76, 0x48, 0x94, 0x0e, 0x88, 0xdc, 0x77, 0xb6, 0x9b, 0x3e, 0xe9, 0x30, 0x26, 0xfb, 0x8f, 0x2c, + 0x38, 0xbb, 0x78, 0xbb, 0xbe, 0xe2, 0x3b, 0x71, 0xe2, 0x35, 0x96, 0xfc, 0xb0, 0x71, 0xb7, 0x9e, + 0x84, 0x11, 0xb9, 0x15, 0xfa, 0xad, 0x6d, 0x52, 0x67, 0xd3, 0x87, 0xce, 0xc3, 0xd0, 0x0e, 0xfb, + 0xbf, 0x56, 0x9d, 0xb1, 0xce, 0x5a, 0xe7, 0x2a, 0x4b, 0x13, 0x3f, 0xdc, 0x9b, 0xfb, 0xc0, 0xfe, + 0xde, 0xdc, 0xd0, 0x2d, 0x51, 0x8e, 0x15, 0x06, 0x7a, 0x1a, 0x06, 0x36, 0xe2, 0xf5, 0xdd, 0x26, + 0x99, 0x29, 0x31, 0xdc, 0x31, 0x81, 0x3b, 0xb0, 0x5a, 0xa7, 0xa5, 0x58, 0x40, 0xd1, 0x02, 0x54, + 0x9a, 0x4e, 0x94, 0x78, 0x89, 0x17, 0x06, 0x33, 0xe5, 0xb3, 0xd6, 0xb9, 0xfe, 0xa5, 0x49, 0x81, + 0x5a, 0xa9, 0x49, 0x00, 0x4e, 0x71, 0x68, 0x37, 0x22, 0xe2, 0xb8, 0x37, 0x02, 0x7f, 0x77, 0xa6, + 0xef, 0xac, 0x75, 0x6e, 0x28, 0xed, 0x06, 0x16, 0xe5, 0x58, 0x61, 0xd8, 0xdf, 0x2b, 0xc1, 0xd0, + 0xe2, 0xc6, 0x86, 0x17, 0x78, 0xc9, 0x2e, 0x7a, 0x07, 0x46, 0x82, 0xd0, 0x25, 0xf2, 0x3f, 0x1b, + 0xc5, 0xf0, 0x85, 0x67, 0xe7, 0x0f, 0x5b, 0x8a, 0xf3, 0xd7, 0xb5, 0x1a, 0x4b, 0x13, 0xfb, 0x7b, + 0x73, 0x23, 0x7a, 0x09, 0x36, 0x28, 0xa2, 0xb7, 0x60, 0xb8, 0x19, 0xba, 0xaa, 0x81, 0x12, 0x6b, + 0xe0, 0x99, 0xc3, 0x1b, 0xa8, 0xa5, 0x15, 0x96, 0xc6, 0xf7, 0xf7, 0xe6, 0x86, 0xb5, 0x02, 0xac, + 0x93, 0x43, 0x3e, 0x8c, 0xd3, 0xbf, 0x41, 0xe2, 0xa9, 0x16, 0xca, 0xac, 0x85, 0xe7, 0xf3, 0x5b, + 0xd0, 0x2a, 0x2d, 0x4d, 0xed, 0xef, 0xcd, 0x8d, 0x67, 0x0a, 0x71, 0x96, 0xb4, 0xfd, 0x79, 0x18, + 0x5b, 0x4c, 0x12, 0xa7, 0xb1, 0x45, 0x5c, 0xfe, 0x7d, 0xd1, 0x4b, 0xd0, 0x17, 0x38, 0xdb, 0x44, + 0x7c, 0xfd, 0xb3, 0x62, 0xda, 0xfb, 0xae, 0x3b, 0xdb, 0xe4, 0x60, 0x6f, 0x6e, 0xe2, 0x66, 0xe0, + 0xbd, 0xd7, 0x12, 0x6b, 0x86, 0x96, 0x61, 0x86, 0x8d, 0x2e, 0x00, 0xb8, 0x64, 0xc7, 0x6b, 0x90, + 0x9a, 0x93, 0x6c, 0x89, 0xd5, 0x80, 0x44, 0x5d, 0xa8, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x2f, 0x59, + 0x50, 0x59, 0xdc, 0x09, 0x3d, 0xb7, 0x16, 0xba, 0x31, 0x6a, 0xc1, 0x78, 0x33, 0x22, 0x1b, 0x24, + 0x52, 0x45, 0x33, 0xd6, 0xd9, 0xf2, 0xb9, 0xe1, 0x0b, 0x17, 0x72, 0xc6, 0x6d, 0x56, 0x5a, 0x09, + 0x92, 0x68, 0x77, 0xe9, 0x11, 0xd1, 0xf4, 0x78, 0x06, 0x8a, 0xb3, 0x6d, 0xd8, 0xbf, 0x54, 0x82, + 0x53, 0x8b, 0x9f, 0x6f, 0x45, 0xa4, 0xea, 0xc5, 0x77, 0xb3, 0x5b, 0xc1, 0xf5, 0xe2, 0xbb, 0xd7, + 0xd3, 0xc9, 0x50, 0x6b, 0xb0, 0x2a, 0xca, 0xb1, 0xc2, 0x40, 0xcf, 0xc3, 0x20, 0xfd, 0x7d, 0x13, + 0xaf, 0x89, 0xd1, 0x4f, 0x09, 0xe4, 0xe1, 0xaa, 0x93, 0x38, 0x55, 0x0e, 0xc2, 0x12, 0x07, 0x5d, + 0x83, 0xe1, 0x06, 0xdb, 0xef, 0x9b, 0xd7, 0x42, 0x97, 0xb0, 0x2f, 0x5c, 0x59, 0x7a, 0x8e, 0xa2, + 0x2f, 0xa7, 0xc5, 0x07, 0x7b, 0x73, 0x33, 0xbc, 0x6f, 0x82, 0x84, 0x06, 0xc3, 0x7a, 0x7d, 0x64, + 0xab, 0x8d, 0xd8, 0xc7, 0x28, 0x41, 0x87, 0x4d, 0x78, 0x4e, 0xdb, 0x53, 0xfd, 0x6c, 0x4f, 0x8d, + 0x74, 0xd9, 0x4f, 0xff, 0xd8, 0x12, 0x73, 0xb2, 0xea, 0xf9, 0x26, 0x7b, 0xb8, 0x00, 0x10, 0x93, + 0x46, 0x44, 0x12, 0x6d, 0x56, 0xd4, 0x67, 0xae, 0x2b, 0x08, 0xd6, 0xb0, 0xe8, 0xe6, 0x8f, 0xb7, + 0x9c, 0x88, 0xad, 0x16, 0x31, 0x37, 0x6a, 0xf3, 0xd7, 0x25, 0x00, 0xa7, 0x38, 0xc6, 0xe6, 0x2f, + 0xe7, 0x6e, 0xfe, 0xdf, 0xb1, 0x60, 0x70, 0xc9, 0x0b, 0x5c, 0x2f, 0xd8, 0x44, 0xef, 0xc0, 0x10, + 0xe5, 0xe8, 0xae, 0x93, 0x38, 0x62, 0xdf, 0x7f, 0x44, 0x2e, 0x1e, 0x9d, 0xc1, 0xca, 0xe5, 0x13, + 0xcf, 0x53, 0x6c, 0xba, 0x88, 0x6e, 0xdc, 0x79, 0x97, 0x34, 0x92, 0x6b, 0x24, 0x71, 0xd2, 0xe1, + 0xa4, 0x65, 0x58, 0x51, 0x45, 0x37, 0x61, 0x20, 0x71, 0xa2, 0x4d, 0x92, 0x88, 0x6d, 0x9f, 0xb3, + 0x29, 0x39, 0x0d, 0x4c, 0x97, 0x1c, 0x09, 0x1a, 0x24, 0x65, 0x90, 0xeb, 0x8c, 0x08, 0x16, 0xc4, + 0xec, 0x06, 0x8c, 0x2c, 0x3b, 0x4d, 0xe7, 0x8e, 0xe7, 0x7b, 0x89, 0x47, 0x62, 0xf4, 0x61, 0x28, + 0x3b, 0xae, 0xcb, 0x36, 0x40, 0x65, 0xe9, 0xd4, 0xfe, 0xde, 0x5c, 0x79, 0xd1, 0x75, 0x0f, 0xf6, + 0xe6, 0x40, 0x61, 0xed, 0x62, 0x8a, 0x81, 0x9e, 0x85, 0x3e, 0x37, 0x0a, 0x9b, 0x33, 0x25, 0x86, + 0x79, 0x9a, 0xee, 0xd4, 0x6a, 0x14, 0x36, 0x33, 0xa8, 0x0c, 0xc7, 0xfe, 0x41, 0x09, 0xd0, 0x32, + 0x69, 0x6e, 0xad, 0xd6, 0x8d, 0x6f, 0x7a, 0x0e, 0x86, 0xb6, 0xc3, 0xc0, 0x4b, 0xc2, 0x28, 0x16, + 0x0d, 0xb2, 0x75, 0x71, 0x4d, 0x94, 0x61, 0x05, 0x45, 0x67, 0xa1, 0xaf, 0x99, 0x6e, 0xef, 0x11, + 0xc9, 0x1a, 0xd8, 0xc6, 0x66, 0x10, 0x8a, 0xd1, 0x8a, 0x49, 0x24, 0xd6, 0xb3, 0xc2, 0xb8, 0x19, + 0x93, 0x08, 0x33, 0x48, 0xba, 0x82, 0xe8, 0xda, 0x12, 0xab, 0x35, 0xb3, 0x82, 0x28, 0x04, 0x6b, + 0x58, 0xe8, 0x6d, 0xa8, 0xf0, 0x7f, 0x98, 0x6c, 0xb0, 0xa5, 0x9b, 0xcb, 0x14, 0xae, 0x86, 0x0d, + 0xc7, 0xcf, 0x4e, 0xfe, 0x28, 0x5b, 0x71, 0x92, 0x10, 0x4e, 0x69, 0x1a, 0x2b, 0x6e, 0x20, 0x77, + 0xc5, 0xfd, 0x1d, 0x0b, 0xd0, 0xb2, 0x17, 0xb8, 0x24, 0x3a, 0x81, 0xa3, 0xb3, 0xb7, 0xcd, 0xf0, + 0x27, 0xb4, 0x6b, 0xe1, 0x76, 0x33, 0x0c, 0x48, 0x90, 0x2c, 0x87, 0x81, 0xcb, 0x8f, 0xd3, 0x8f, + 0x43, 0x5f, 0x42, 0x9b, 0xe2, 0xdd, 0x7a, 0x5a, 0x7e, 0x16, 0xda, 0xc0, 0xc1, 0xde, 0xdc, 0xe9, + 0xf6, 0x1a, 0xac, 0x0b, 0xac, 0x0e, 0xfa, 0x18, 0x0c, 0xc4, 0x89, 0x93, 0xb4, 0x62, 0xd1, 0xd1, + 0x27, 0x64, 0x47, 0xeb, 0xac, 0xf4, 0x60, 0x6f, 0x6e, 0x5c, 0x55, 0xe3, 0x45, 0x58, 0x54, 0x40, + 0xcf, 0xc0, 0xe0, 0x36, 0x89, 0x63, 0x67, 0x53, 0x32, 0xb8, 0x71, 0x51, 0x77, 0xf0, 0x1a, 0x2f, + 0xc6, 0x12, 0x8e, 0x9e, 0x84, 0x7e, 0x12, 0x45, 0x61, 0x24, 0x56, 0xc4, 0xa8, 0x40, 0xec, 0x5f, + 0xa1, 0x85, 0x98, 0xc3, 0xec, 0xff, 0x62, 0xc1, 0xb8, 0xea, 0x2b, 0x6f, 0xeb, 0x04, 0xb6, 0xbc, + 0x0b, 0xd0, 0x90, 0x03, 0x8c, 0xd9, 0x46, 0xd3, 0xda, 0xe8, 0xbc, 0xfc, 0xda, 0x27, 0x34, 0x6d, + 0x43, 0x15, 0xc5, 0x58, 0xa3, 0x6b, 0xff, 0x3b, 0x0b, 0xa6, 0x32, 0x63, 0xbb, 0xea, 0xc5, 0x09, + 0x7a, 0xab, 0x6d, 0x7c, 0xf3, 0xc5, 0xc6, 0x47, 0x6b, 0xb3, 0xd1, 0xa9, 0xf5, 0x22, 0x4b, 0xb4, + 0xb1, 0x61, 0xe8, 0xf7, 0x12, 0xb2, 0x2d, 0x87, 0xf5, 0x7c, 0xc1, 0x61, 0xf1, 0xfe, 0xa5, 0x5f, + 0x69, 0x8d, 0xd2, 0xc0, 0x9c, 0x94, 0xfd, 0xbf, 0x2c, 0xa8, 0x2c, 0x87, 0xc1, 0x86, 0xb7, 0x79, + 0xcd, 0x69, 0x9e, 0xc0, 0xf7, 0xa9, 0x43, 0x1f, 0xa3, 0xce, 0x87, 0xf0, 0x42, 0xde, 0x10, 0x44, + 0xc7, 0xe6, 0xe9, 0x99, 0xca, 0x85, 0x05, 0xc5, 0xa6, 0x68, 0x11, 0x66, 0xc4, 0x66, 0x5f, 0x81, + 0x8a, 0x42, 0x40, 0x13, 0x50, 0xbe, 0x4b, 0xb8, 0x24, 0x59, 0xc1, 0xf4, 0x27, 0x9a, 0x86, 0xfe, + 0x1d, 0xc7, 0x6f, 0x89, 0xcd, 0x8b, 0xf9, 0x9f, 0x8f, 0x97, 0x2e, 0x5a, 0xf6, 0x0f, 0xd8, 0x0e, + 0x14, 0x8d, 0xac, 0x04, 0x3b, 0x82, 0x39, 0x7c, 0xd9, 0x82, 0x69, 0xbf, 0x03, 0x53, 0x12, 0x73, + 0x72, 0x14, 0x76, 0xf6, 0x98, 0xe8, 0xf6, 0x74, 0x27, 0x28, 0xee, 0xd8, 0x1a, 0xe5, 0xf5, 0x61, + 0x93, 0x2e, 0x38, 0xc7, 0x67, 0x5d, 0x17, 0x32, 0xc0, 0x0d, 0x51, 0x86, 0x15, 0xd4, 0xfe, 0x73, + 0x0b, 0xa6, 0xd5, 0x38, 0xae, 0x90, 0xdd, 0x3a, 0xf1, 0x49, 0x23, 0x09, 0xa3, 0x87, 0x65, 0x24, + 0x8f, 0xf3, 0x6f, 0xc2, 0x79, 0xd2, 0xb0, 0x20, 0x50, 0xbe, 0x42, 0x76, 0xf9, 0x07, 0xd2, 0x07, + 0x5a, 0x3e, 0x74, 0xa0, 0xbf, 0x65, 0xc1, 0xa8, 0x1a, 0xe8, 0x09, 0x6c, 0xb9, 0xab, 0xe6, 0x96, + 0xfb, 0x70, 0xc1, 0xf5, 0xda, 0x65, 0xb3, 0xfd, 0xed, 0x12, 0x65, 0x1b, 0x02, 0xa7, 0x16, 0x85, + 0x74, 0x92, 0x28, 0xc7, 0x7f, 0x48, 0xbe, 0x52, 0x6f, 0x83, 0xbd, 0x42, 0x76, 0xd7, 0x43, 0x2a, + 0x4d, 0x74, 0x1e, 0xac, 0xf1, 0x51, 0xfb, 0x0e, 0xfd, 0xa8, 0xbf, 0x5f, 0x82, 0x53, 0x6a, 0x5a, + 0x8c, 0x53, 0xfa, 0x67, 0x72, 0x62, 0x5e, 0x80, 0x61, 0x97, 0x6c, 0x38, 0x2d, 0x3f, 0x51, 0xda, + 0x44, 0x3f, 0x57, 0x33, 0xab, 0x69, 0x31, 0xd6, 0x71, 0x7a, 0x98, 0xcb, 0x6f, 0x0c, 0x33, 0x7e, + 0x9e, 0x38, 0x74, 0xd5, 0x53, 0x09, 0x4f, 0x53, 0x0f, 0x47, 0x74, 0xf5, 0x50, 0xa8, 0x82, 0x4f, + 0x42, 0xbf, 0xb7, 0x4d, 0xcf, 0xfc, 0x92, 0x79, 0x94, 0xaf, 0xd1, 0x42, 0xcc, 0x61, 0xe8, 0x29, + 0x18, 0x6c, 0x84, 0xdb, 0xdb, 0x4e, 0xe0, 0xce, 0x94, 0x99, 0xcc, 0x39, 0x4c, 0xc5, 0x82, 0x65, + 0x5e, 0x84, 0x25, 0x0c, 0x3d, 0x06, 0x7d, 0x4e, 0xb4, 0x19, 0xcf, 0xf4, 0x31, 0x9c, 0x21, 0xda, + 0xd2, 0x62, 0xb4, 0x19, 0x63, 0x56, 0x4a, 0x65, 0xc9, 0x7b, 0x61, 0x74, 0xd7, 0x0b, 0x36, 0xab, + 0x5e, 0xc4, 0x04, 0x43, 0x4d, 0x96, 0xbc, 0xad, 0x20, 0x58, 0xc3, 0x42, 0x35, 0xe8, 0x6f, 0x86, + 0x51, 0x12, 0xcf, 0x0c, 0xb0, 0x89, 0x7f, 0x2e, 0x77, 0xfb, 0xf1, 0x71, 0xd7, 0xc2, 0x28, 0x49, + 0x87, 0x42, 0xff, 0xc5, 0x98, 0x13, 0x42, 0xcb, 0x50, 0x26, 0xc1, 0xce, 0xcc, 0x20, 0xa3, 0xf7, + 0xa1, 0xc3, 0xe9, 0xad, 0x04, 0x3b, 0xb7, 0x9c, 0x28, 0xe5, 0x57, 0x2b, 0xc1, 0x0e, 0xa6, 0xb5, + 0x51, 0x03, 0x2a, 0xd2, 0x84, 0x15, 0xcf, 0x0c, 0x15, 0x59, 0x8a, 0x58, 0xa0, 0x63, 0xf2, 0x5e, + 0xcb, 0x8b, 0xc8, 0x36, 0x09, 0x92, 0x38, 0x55, 0xac, 0x24, 0x34, 0xc6, 0x29, 0x5d, 0xd4, 0x80, + 0x11, 0x2e, 0x7f, 0x5e, 0x0b, 0x5b, 0x41, 0x12, 0xcf, 0x54, 0x58, 0x97, 0x73, 0x2c, 0x17, 0xb7, + 0xd2, 0x1a, 0x4b, 0xd3, 0x82, 0xfc, 0x88, 0x56, 0x18, 0x63, 0x83, 0x28, 0x7a, 0x0b, 0x46, 0x7d, + 0x6f, 0x87, 0x04, 0x24, 0x8e, 0x6b, 0x51, 0x78, 0x87, 0xcc, 0x00, 0x1b, 0xcd, 0x93, 0x79, 0x5a, + 0x7c, 0x78, 0x87, 0x2c, 0x4d, 0xee, 0xef, 0xcd, 0x8d, 0x5e, 0xd5, 0x6b, 0x63, 0x93, 0x18, 0x7a, + 0x1b, 0xc6, 0xa8, 0xb0, 0xeb, 0xa5, 0xe4, 0x87, 0x8b, 0x93, 0x47, 0xfb, 0x7b, 0x73, 0x63, 0xd8, + 0xa8, 0x8e, 0x33, 0xe4, 0xd0, 0x3a, 0x54, 0x7c, 0x6f, 0x83, 0x34, 0x76, 0x1b, 0x3e, 0x99, 0x19, + 0x61, 0xb4, 0x73, 0x36, 0xe7, 0x55, 0x89, 0xce, 0x15, 0x0c, 0xf5, 0x17, 0xa7, 0x84, 0xd0, 0x2d, + 0x38, 0x9d, 0x90, 0x68, 0xdb, 0x0b, 0x1c, 0xba, 0xa9, 0x84, 0xf4, 0xcb, 0x4c, 0x25, 0xa3, 0x6c, + 0xd5, 0x9e, 0x11, 0x13, 0x7b, 0x7a, 0xbd, 0x23, 0x16, 0xee, 0x52, 0x1b, 0xdd, 0x80, 0x71, 0xb6, + 0x9f, 0x6a, 0x2d, 0xdf, 0xaf, 0x85, 0xbe, 0xd7, 0xd8, 0x9d, 0x19, 0x63, 0x04, 0x9f, 0x92, 0x06, + 0x90, 0x35, 0x13, 0x4c, 0x15, 0xc3, 0xf4, 0x1f, 0xce, 0xd6, 0x46, 0x3e, 0x8c, 0xc7, 0xa4, 0xd1, + 0x8a, 0xbc, 0x64, 0x97, 0xae, 0x7d, 0x72, 0x3f, 0x99, 0x19, 0x2f, 0xa2, 0xe8, 0xd6, 0xcd, 0x4a, + 0xdc, 0xfa, 0x94, 0x29, 0xc4, 0x59, 0xd2, 0x94, 0x55, 0xc4, 0x89, 0xeb, 0x05, 0x33, 0x13, 0x8c, + 0x03, 0xa9, 0xfd, 0x55, 0xa7, 0x85, 0x98, 0xc3, 0x98, 0xfd, 0x80, 0xfe, 0xb8, 0x41, 0xb9, 0xf4, + 0x24, 0x43, 0x4c, 0xed, 0x07, 0x12, 0x80, 0x53, 0x1c, 0x2a, 0x1a, 0x24, 0xc9, 0xee, 0x0c, 0x62, + 0xa8, 0x6a, 0xab, 0xad, 0xaf, 0x7f, 0x06, 0xd3, 0x72, 0x74, 0x0b, 0x06, 0x49, 0xb0, 0xb3, 0x1a, + 0x85, 0xdb, 0x33, 0x53, 0x45, 0x78, 0xc0, 0x0a, 0x47, 0xe6, 0xe7, 0x47, 0xaa, 0xc2, 0x88, 0x62, + 0x2c, 0x89, 0xa1, 0xfb, 0x30, 0xd3, 0xe1, 0x2b, 0xf1, 0x8f, 0x32, 0xcd, 0x3e, 0xca, 0x27, 0x44, + 0xdd, 0x99, 0xf5, 0x2e, 0x78, 0x07, 0x87, 0xc0, 0x70, 0x57, 0xea, 0xf6, 0x1d, 0x18, 0x53, 0x8c, + 0x8a, 0x7d, 0x6f, 0x34, 0x07, 0xfd, 0x94, 0x17, 0x4b, 0x85, 0xbe, 0x42, 0x27, 0x95, 0xb2, 0xe8, + 0x18, 0xf3, 0x72, 0x36, 0xa9, 0xde, 0xe7, 0xc9, 0xd2, 0x6e, 0x42, 0xb8, 0x62, 0x57, 0xd6, 0x26, + 0x55, 0x02, 0x70, 0x8a, 0x63, 0xff, 0x1f, 0x2e, 0x26, 0xa5, 0xdc, 0xb0, 0xc0, 0x49, 0x70, 0x1e, + 0x86, 0xb6, 0xc2, 0x38, 0xa1, 0xd8, 0xac, 0x8d, 0xfe, 0x54, 0x30, 0xba, 0x2c, 0xca, 0xb1, 0xc2, + 0x40, 0xaf, 0xc2, 0x68, 0x43, 0x6f, 0x40, 0x1c, 0x63, 0xa7, 0x44, 0x15, 0xb3, 0x75, 0x6c, 0xe2, + 0xa2, 0x8b, 0x30, 0xc4, 0xac, 0xdc, 0x8d, 0xd0, 0x17, 0x2a, 0xa4, 0x3c, 0x95, 0x87, 0x6a, 0xa2, + 0xfc, 0x40, 0xfb, 0x8d, 0x15, 0x36, 0x55, 0xc4, 0x69, 0x17, 0xd6, 0x6a, 0xe2, 0x00, 0x51, 0x8a, + 0xf8, 0x65, 0x56, 0x8a, 0x05, 0xd4, 0xfe, 0x17, 0x25, 0x6d, 0x96, 0xa9, 0x02, 0x44, 0xd0, 0x9b, + 0x30, 0x78, 0xcf, 0xf1, 0x12, 0x2f, 0xd8, 0x14, 0xd2, 0xc3, 0x8b, 0x05, 0x4f, 0x13, 0x56, 0xfd, + 0x36, 0xaf, 0xca, 0x4f, 0x3e, 0xf1, 0x07, 0x4b, 0x82, 0x94, 0x76, 0xd4, 0x0a, 0x02, 0x4a, 0xbb, + 0xd4, 0x3b, 0x6d, 0xcc, 0xab, 0x72, 0xda, 0xe2, 0x0f, 0x96, 0x04, 0xd1, 0x06, 0x80, 0x5c, 0x4b, + 0xc4, 0x15, 0xd6, 0xe5, 0x8f, 0xf6, 0x42, 0x7e, 0x5d, 0xd5, 0x5e, 0x1a, 0xa3, 0x67, 0x6d, 0xfa, + 0x1f, 0x6b, 0x94, 0xed, 0x84, 0x09, 0x61, 0xed, 0xdd, 0x42, 0x9f, 0xa5, 0x5b, 0xda, 0x89, 0x12, + 0xe2, 0x2e, 0x26, 0x59, 0x03, 0xfd, 0xe1, 0x22, 0xf6, 0xba, 0xb7, 0x4d, 0xf4, 0xed, 0x2f, 0x88, + 0xe0, 0x94, 0x9e, 0xfd, 0xdd, 0x32, 0xcc, 0x74, 0xeb, 0x2e, 0x5d, 0x92, 0xe4, 0xbe, 0x97, 0x2c, + 0x53, 0x31, 0xc9, 0x32, 0x97, 0xe4, 0x8a, 0x28, 0xc7, 0x0a, 0x83, 0xae, 0x8d, 0xd8, 0xdb, 0x94, + 0xca, 0x52, 0x7f, 0xba, 0x36, 0xea, 0xac, 0x14, 0x0b, 0x28, 0xc5, 0x8b, 0x88, 0x13, 0x8b, 0xcb, + 0x0d, 0x6d, 0x0d, 0x61, 0x56, 0x8a, 0x05, 0x54, 0x37, 0x88, 0xf4, 0xe5, 0x18, 0x44, 0x8c, 0x29, + 0xea, 0x7f, 0xb0, 0x53, 0x84, 0x3e, 0x07, 0xb0, 0xe1, 0x05, 0x5e, 0xbc, 0xc5, 0xa8, 0x0f, 0xf4, + 0x4c, 0x5d, 0x09, 0x59, 0xab, 0x8a, 0x0a, 0xd6, 0x28, 0xa2, 0x97, 0x61, 0x58, 0x6d, 0xcf, 0xb5, + 0xea, 0xcc, 0xa0, 0x69, 0x10, 0x4f, 0x79, 0x55, 0x15, 0xeb, 0x78, 0xf6, 0xbb, 0xd9, 0xf5, 0x22, + 0x76, 0x85, 0x36, 0xbf, 0x56, 0xd1, 0xf9, 0x2d, 0x1d, 0x3e, 0xbf, 0xf6, 0x7f, 0x2e, 0xc3, 0xb8, + 0xd1, 0x58, 0x2b, 0x2e, 0xc0, 0xd1, 0x5e, 0xa7, 0x07, 0x96, 0x93, 0x10, 0xb1, 0x27, 0xcf, 0xf7, + 0xb2, 0x69, 0xf4, 0xe3, 0x8d, 0xee, 0x05, 0x4e, 0x09, 0x6d, 0x41, 0xc5, 0x77, 0x62, 0x66, 0x52, + 0x21, 0x62, 0x2f, 0xf6, 0x46, 0x36, 0x55, 0x3f, 0x9c, 0x38, 0xd1, 0x4e, 0x0f, 0xde, 0x4a, 0x4a, + 0x9c, 0x9e, 0xb6, 0x54, 0xd8, 0x91, 0x37, 0x6a, 0xaa, 0x3b, 0x54, 0x22, 0xda, 0xc5, 0x1c, 0x86, + 0x2e, 0xc2, 0x48, 0x44, 0xd8, 0x4a, 0x59, 0xa6, 0xf2, 0x1c, 0x5b, 0x7a, 0xfd, 0xa9, 0xe0, 0x87, + 0x35, 0x18, 0x36, 0x30, 0x53, 0xb9, 0x7f, 0xe0, 0x10, 0xb9, 0xff, 0x19, 0x18, 0x64, 0x3f, 0xd4, + 0xaa, 0x50, 0x5f, 0x68, 0x8d, 0x17, 0x63, 0x09, 0xcf, 0x2e, 0xa2, 0xa1, 0x82, 0x8b, 0xe8, 0x59, + 0x18, 0xab, 0x3a, 0x64, 0x3b, 0x0c, 0x56, 0x02, 0xb7, 0x19, 0x7a, 0x41, 0x82, 0x66, 0xa0, 0x8f, + 0x9d, 0x27, 0x7c, 0xbf, 0xf7, 0x51, 0x0a, 0xb8, 0x8f, 0xca, 0xee, 0xf6, 0x9f, 0x94, 0x60, 0xb4, + 0x4a, 0x7c, 0x92, 0x10, 0xae, 0xf7, 0xc4, 0x68, 0x15, 0xd0, 0x66, 0xe4, 0x34, 0x48, 0x8d, 0x44, + 0x5e, 0xe8, 0xd6, 0x49, 0x23, 0x0c, 0xd8, 0x45, 0x14, 0x3d, 0x20, 0x4f, 0xef, 0xef, 0xcd, 0xa1, + 0x4b, 0x6d, 0x50, 0xdc, 0xa1, 0x06, 0x72, 0x61, 0xb4, 0x19, 0x11, 0xc3, 0x6e, 0x68, 0xe5, 0x8b, + 0x1a, 0x35, 0xbd, 0x0a, 0x97, 0x86, 0x8d, 0x22, 0x6c, 0x12, 0x45, 0x9f, 0x82, 0x89, 0x30, 0x6a, + 0x6e, 0x39, 0x41, 0x95, 0x34, 0x49, 0xe0, 0x52, 0x15, 0x40, 0x58, 0x3b, 0xa6, 0xf7, 0xf7, 0xe6, + 0x26, 0x6e, 0x64, 0x60, 0xb8, 0x0d, 0x1b, 0xbd, 0x09, 0x93, 0xcd, 0x28, 0x6c, 0x3a, 0x9b, 0x6c, + 0xc9, 0x08, 0x69, 0x85, 0xf3, 0xa6, 0xf3, 0xfb, 0x7b, 0x73, 0x93, 0xb5, 0x2c, 0xf0, 0x60, 0x6f, + 0x6e, 0x8a, 0x4d, 0x19, 0x2d, 0x49, 0x81, 0xb8, 0x9d, 0x8c, 0xfd, 0x1e, 0x9c, 0xaa, 0x86, 0xf7, + 0x82, 0x7b, 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0x34, 0xe3, 0xc4, 0x1b, 0x52, 0xf9, 0xe5, 0x17, 0x7c, + 0x39, 0x27, 0x9b, 0x46, 0x83, 0xab, 0x1d, 0xab, 0x9e, 0x4f, 0xba, 0x98, 0x43, 0xfe, 0x49, 0xc9, + 0x68, 0x33, 0xc5, 0x57, 0x77, 0x17, 0x56, 0xd7, 0xbb, 0x8b, 0xcf, 0xc2, 0xd0, 0x86, 0x47, 0x7c, + 0x17, 0x93, 0x0d, 0xf1, 0xb5, 0x5e, 0x28, 0x72, 0xb9, 0xb3, 0x4a, 0xeb, 0x48, 0xeb, 0x18, 0x57, + 0xa2, 0x57, 0x05, 0x19, 0xac, 0x08, 0xa2, 0x16, 0x4c, 0x48, 0x3d, 0x4c, 0x42, 0xc5, 0x66, 0x7f, + 0xb1, 0x98, 0x9a, 0x67, 0x36, 0xc3, 0x3e, 0x2f, 0xce, 0x10, 0xc4, 0x6d, 0x4d, 0x50, 0xfd, 0x79, + 0x9b, 0x1e, 0x75, 0x7d, 0x6c, 0xe9, 0x33, 0xfd, 0x99, 0x99, 0x02, 0x58, 0xa9, 0xfd, 0x6b, 0x16, + 0x3c, 0xd2, 0x36, 0x5b, 0xc2, 0x4e, 0x72, 0x6c, 0xdf, 0x28, 0x6b, 0xac, 0x28, 0xe5, 0x1b, 0x2b, + 0xec, 0x1b, 0x30, 0xbd, 0xb2, 0xdd, 0x4c, 0x76, 0xab, 0x9e, 0x79, 0xe5, 0xf2, 0x0a, 0x0c, 0x6c, + 0x13, 0xd7, 0x6b, 0x6d, 0x8b, 0xcf, 0x3a, 0x27, 0xcf, 0x85, 0x6b, 0xac, 0xf4, 0x60, 0x6f, 0x6e, + 0xb4, 0x9e, 0x84, 0x91, 0xb3, 0x49, 0x78, 0x01, 0x16, 0xe8, 0xf6, 0x8f, 0x2d, 0x18, 0x97, 0xfc, + 0x61, 0xd1, 0x75, 0x23, 0x12, 0xc7, 0x68, 0x16, 0x4a, 0x5e, 0x53, 0x10, 0x02, 0x41, 0xa8, 0xb4, + 0x56, 0xc3, 0x25, 0xaf, 0x89, 0xde, 0x84, 0x0a, 0xbf, 0xa9, 0x4b, 0x17, 0x47, 0x8f, 0x37, 0x7f, + 0x4c, 0x37, 0x5c, 0x97, 0x34, 0x70, 0x4a, 0x4e, 0x4a, 0xc9, 0xec, 0xe4, 0x29, 0x9b, 0xf7, 0x46, + 0x97, 0x45, 0x39, 0x56, 0x18, 0xe8, 0x1c, 0x0c, 0x05, 0xa1, 0xcb, 0x2f, 0x53, 0xf9, 0x3e, 0x65, + 0x4b, 0xee, 0xba, 0x28, 0xc3, 0x0a, 0x6a, 0x7f, 0xd5, 0x82, 0x11, 0x39, 0xc6, 0x82, 0x02, 0x3b, + 0xdd, 0x24, 0xa9, 0xb0, 0x9e, 0x6e, 0x12, 0x2a, 0x70, 0x33, 0x88, 0x21, 0x67, 0x97, 0x7b, 0x91, + 0xb3, 0xed, 0xdf, 0x2c, 0xc1, 0x98, 0xec, 0x4e, 0xbd, 0x75, 0x27, 0x26, 0x54, 0x0c, 0xa9, 0x38, + 0x7c, 0xf2, 0x89, 0x5c, 0x67, 0xcf, 0xe7, 0xe9, 0x62, 0xc6, 0x37, 0x4b, 0xc5, 0x9c, 0x45, 0x49, + 0x07, 0xa7, 0x24, 0xd1, 0x0e, 0x4c, 0x06, 0x61, 0xc2, 0x8e, 0x37, 0x05, 0x2f, 0x76, 0xd3, 0x91, + 0x6d, 0xe7, 0x51, 0xd1, 0xce, 0xe4, 0xf5, 0x2c, 0x3d, 0xdc, 0xde, 0x04, 0xba, 0x21, 0x6d, 0x4c, + 0x65, 0xd6, 0xd6, 0xb3, 0xc5, 0xda, 0xea, 0x6e, 0x62, 0xb2, 0x7f, 0xcf, 0x82, 0x8a, 0x44, 0x3b, + 0x89, 0x2b, 0xaf, 0xdb, 0x30, 0x18, 0xb3, 0x4f, 0x24, 0xa7, 0xeb, 0x7c, 0xb1, 0x21, 0xf0, 0xef, + 0x9a, 0x9e, 0xe9, 0xfc, 0x7f, 0x8c, 0x25, 0x35, 0x66, 0x6c, 0x57, 0x03, 0x79, 0xe8, 0x8c, 0xed, + 0xaa, 0x67, 0xdd, 0x6f, 0xb6, 0x46, 0x0d, 0x6b, 0x00, 0x15, 0x4c, 0x9b, 0x11, 0xd9, 0xf0, 0xee, + 0x67, 0x05, 0xd3, 0x1a, 0x2b, 0xc5, 0x02, 0x8a, 0x36, 0x60, 0xa4, 0x21, 0xcd, 0xd1, 0x29, 0x0b, + 0xf9, 0x48, 0x41, 0xdb, 0xbf, 0xba, 0x46, 0xe2, 0xae, 0x49, 0xcb, 0x1a, 0x25, 0x6c, 0xd0, 0xa5, + 0x7c, 0x2a, 0xbd, 0x29, 0x2f, 0x17, 0x34, 0xdc, 0x44, 0x24, 0x49, 0x5b, 0xe8, 0x7a, 0x49, 0x6e, + 0x7f, 0xd3, 0x82, 0x01, 0x6e, 0xbf, 0x2c, 0x66, 0x04, 0xd6, 0x2e, 0xc8, 0xd2, 0xf9, 0xbc, 0x45, + 0x0b, 0xc5, 0x7d, 0x19, 0xba, 0x0d, 0x15, 0xf6, 0x83, 0xd9, 0x62, 0xca, 0x45, 0xfc, 0xb4, 0x78, + 0xfb, 0x7a, 0x57, 0x6f, 0x49, 0x02, 0x38, 0xa5, 0x65, 0x7f, 0xbf, 0x4c, 0x59, 0x5f, 0x8a, 0x6a, + 0x9c, 0xed, 0xd6, 0x49, 0x9c, 0xed, 0xa5, 0xe3, 0x3f, 0xdb, 0xdf, 0x83, 0xf1, 0x86, 0x76, 0x41, + 0x97, 0x7e, 0xf1, 0x0b, 0x05, 0x97, 0x95, 0x76, 0xab, 0xc7, 0xed, 0x75, 0xcb, 0x26, 0x39, 0x9c, + 0xa5, 0x8f, 0x08, 0x8c, 0xf0, 0xf5, 0x20, 0xda, 0xeb, 0x63, 0xed, 0x2d, 0x14, 0x59, 0x61, 0x7a, + 0x63, 0x6c, 0x15, 0xd7, 0x35, 0x42, 0xd8, 0x20, 0x6b, 0xff, 0x4a, 0x3f, 0xf4, 0xaf, 0xec, 0x90, + 0x20, 0x39, 0x01, 0x56, 0xb7, 0x0d, 0x63, 0x5e, 0xb0, 0x13, 0xfa, 0x3b, 0xc4, 0xe5, 0xf0, 0xa3, + 0x1d, 0xef, 0xa7, 0x45, 0x23, 0x63, 0x6b, 0x06, 0x31, 0x9c, 0x21, 0x7e, 0x1c, 0x96, 0x82, 0xd7, + 0x61, 0x80, 0xaf, 0x0c, 0x61, 0x26, 0xc8, 0xb1, 0xe7, 0xb3, 0x89, 0x15, 0x3b, 0x28, 0xb5, 0x67, + 0xf0, 0xab, 0x04, 0x41, 0x08, 0xbd, 0x0b, 0x63, 0x1b, 0x5e, 0x14, 0x27, 0x54, 0xd9, 0x8f, 0x13, + 0x67, 0xbb, 0x79, 0x04, 0x1b, 0x81, 0x9a, 0x91, 0x55, 0x83, 0x12, 0xce, 0x50, 0x46, 0x9b, 0x30, + 0x4a, 0x55, 0xd4, 0xb4, 0xa9, 0xc1, 0x9e, 0x9b, 0x52, 0x26, 0xc2, 0xab, 0x3a, 0x21, 0x6c, 0xd2, + 0xa5, 0x2c, 0xa9, 0xc1, 0x54, 0xda, 0x21, 0x26, 0xdd, 0x28, 0x96, 0xc4, 0x75, 0x59, 0x0e, 0xa3, + 0x9c, 0x8d, 0x79, 0xca, 0x54, 0x4c, 0xce, 0x96, 0xfa, 0xc3, 0xd8, 0xdf, 0xa6, 0x67, 0x31, 0x9d, + 0xc3, 0x13, 0x38, 0xbe, 0x2e, 0x9b, 0xc7, 0xd7, 0x93, 0x05, 0xbe, 0x6c, 0x97, 0xa3, 0xeb, 0x1d, + 0x18, 0xd6, 0x3e, 0x3c, 0x5a, 0x80, 0x4a, 0x43, 0x3a, 0x73, 0x08, 0x2e, 0xae, 0x44, 0x29, 0xe5, + 0xe5, 0x81, 0x53, 0x1c, 0x3a, 0x2f, 0x54, 0x04, 0xcd, 0xba, 0x7e, 0x51, 0x01, 0x15, 0x33, 0x88, + 0xfd, 0x22, 0xc0, 0xca, 0x7d, 0xd2, 0x58, 0xe4, 0x2a, 0x9e, 0x76, 0xbf, 0x67, 0x75, 0xbf, 0xdf, + 0xb3, 0xbf, 0x65, 0xc1, 0xd8, 0xea, 0xb2, 0x21, 0xd3, 0xcf, 0x03, 0x70, 0xd9, 0xf8, 0xf6, 0xed, + 0xeb, 0xd2, 0x7e, 0xcd, 0x8d, 0x8c, 0xaa, 0x14, 0x6b, 0x18, 0xe8, 0x51, 0x28, 0xfb, 0xad, 0x40, + 0x88, 0xac, 0x83, 0xfb, 0x7b, 0x73, 0xe5, 0xab, 0xad, 0x00, 0xd3, 0x32, 0xcd, 0xc7, 0xaa, 0x5c, + 0xd8, 0xc7, 0x2a, 0xdf, 0xdb, 0xf8, 0xeb, 0x65, 0x98, 0x58, 0xf5, 0xc9, 0x7d, 0xa3, 0xd7, 0x4f, + 0xc3, 0x80, 0x1b, 0x79, 0x3b, 0x24, 0xca, 0x0a, 0x02, 0x55, 0x56, 0x8a, 0x05, 0xb4, 0xb0, 0xdb, + 0xd7, 0xdb, 0xed, 0x07, 0xf9, 0xf1, 0xb9, 0xbc, 0xe5, 0x8e, 0x19, 0x6d, 0xc0, 0x20, 0xbf, 0x0f, + 0x8e, 0x67, 0xfa, 0xd9, 0x52, 0x7c, 0xf5, 0xf0, 0xce, 0x64, 0xe7, 0x67, 0x5e, 0xd8, 0x57, 0xb8, + 0xc3, 0x8d, 0xe2, 0x65, 0xa2, 0x14, 0x4b, 0xe2, 0xb3, 0x1f, 0x87, 0x11, 0x1d, 0xb3, 0x27, 0xcf, + 0x9b, 0xbf, 0x6a, 0xc1, 0xd4, 0xaa, 0x1f, 0x36, 0xee, 0x66, 0xfc, 0xf2, 0x5e, 0x86, 0x61, 0xba, + 0x99, 0x62, 0xc3, 0x69, 0xd5, 0xf0, 0xce, 0x15, 0x20, 0xac, 0xe3, 0x69, 0xd5, 0x6e, 0xde, 0x5c, + 0xab, 0x76, 0x72, 0xea, 0x15, 0x20, 0xac, 0xe3, 0xd9, 0x7f, 0x60, 0xc1, 0xe3, 0x97, 0x96, 0x57, + 0x6a, 0x24, 0x8a, 0xbd, 0x38, 0x21, 0x41, 0xd2, 0xe6, 0x57, 0x4c, 0x65, 0x46, 0x57, 0xeb, 0x4a, + 0x2a, 0x33, 0x56, 0x59, 0x2f, 0x04, 0xf4, 0x61, 0x71, 0xae, 0xff, 0xa6, 0x05, 0x53, 0x97, 0xbc, + 0x04, 0x93, 0x66, 0x98, 0x75, 0x05, 0x8e, 0x48, 0x33, 0x8c, 0xbd, 0x24, 0x8c, 0x76, 0xb3, 0xae, + 0xc0, 0x58, 0x41, 0xb0, 0x86, 0xc5, 0x5b, 0xde, 0xf1, 0x62, 0xda, 0xd3, 0x92, 0xa9, 0xea, 0x62, + 0x51, 0x8e, 0x15, 0x06, 0x1d, 0x98, 0xeb, 0x45, 0x4c, 0x64, 0xd8, 0x15, 0x3b, 0x58, 0x0d, 0xac, + 0x2a, 0x01, 0x38, 0xc5, 0xb1, 0xff, 0x9e, 0x05, 0xa7, 0x2e, 0xf9, 0xad, 0x38, 0x21, 0xd1, 0x46, + 0x6c, 0x74, 0xf6, 0x45, 0xa8, 0x10, 0x29, 0xdc, 0x8b, 0xbe, 0xaa, 0x43, 0x43, 0x49, 0xfd, 0xdc, + 0x0f, 0x59, 0xe1, 0x15, 0x70, 0x77, 0xed, 0xcd, 0x39, 0xf3, 0xb7, 0x4b, 0x30, 0x7a, 0x79, 0x7d, + 0xbd, 0x76, 0x89, 0x24, 0x82, 0x4b, 0xe6, 0x1b, 0xa5, 0xb0, 0xa6, 0x91, 0x1f, 0x26, 0xfc, 0xb4, + 0x12, 0xcf, 0x9f, 0xe7, 0xe1, 0x22, 0xf3, 0x6b, 0x41, 0x72, 0x23, 0xaa, 0x27, 0x91, 0x17, 0x6c, + 0x76, 0xd4, 0xe1, 0x25, 0x2f, 0x2f, 0x77, 0xe3, 0xe5, 0xe8, 0x45, 0x18, 0x60, 0xf1, 0x2a, 0x52, + 0xf8, 0xf8, 0xa0, 0x92, 0x13, 0x58, 0xe9, 0xc1, 0xde, 0x5c, 0xe5, 0x26, 0x5e, 0xe3, 0x7f, 0xb0, + 0x40, 0x45, 0x6f, 0xc3, 0xf0, 0x56, 0x92, 0x34, 0x2f, 0x13, 0xc7, 0x25, 0x91, 0xe4, 0x13, 0xe7, + 0x0e, 0xe7, 0x13, 0x74, 0x3a, 0x78, 0x85, 0x74, 0x6b, 0xa5, 0x65, 0x31, 0xd6, 0x29, 0xda, 0x75, + 0x80, 0x14, 0xf6, 0x80, 0x74, 0x10, 0xfb, 0xe7, 0x4b, 0x30, 0x78, 0xd9, 0x09, 0x5c, 0x9f, 0x44, + 0x68, 0x15, 0xfa, 0xc8, 0x7d, 0xd2, 0x10, 0x07, 0x79, 0x4e, 0xd7, 0xd3, 0xc3, 0x8e, 0xdb, 0xd5, + 0xe8, 0x7f, 0xcc, 0xea, 0x23, 0x0c, 0x83, 0xb4, 0xdf, 0x97, 0x94, 0x97, 0xf8, 0x73, 0xf9, 0xb3, + 0xa0, 0x16, 0x05, 0x3f, 0x29, 0x45, 0x11, 0x96, 0x84, 0x98, 0x05, 0xaa, 0xd1, 0xac, 0x53, 0xf6, + 0x96, 0x14, 0xd3, 0xec, 0xd6, 0x97, 0x6b, 0x1c, 0x5d, 0xd0, 0xe5, 0x16, 0x28, 0x59, 0x88, 0x53, + 0x72, 0xf6, 0x45, 0x98, 0x66, 0xf7, 0xb1, 0x4e, 0xb2, 0x65, 0xec, 0x9a, 0xdc, 0xe5, 0x69, 0xff, + 0xb0, 0x04, 0x93, 0x6b, 0xf5, 0xe5, 0xba, 0x69, 0x3b, 0xbc, 0x08, 0x23, 0xfc, 0x80, 0xa6, 0x8b, + 0xce, 0xf1, 0x45, 0x7d, 0x75, 0x87, 0xb0, 0xae, 0xc1, 0xb0, 0x81, 0x89, 0x1e, 0x87, 0xb2, 0xf7, + 0x5e, 0x90, 0xf5, 0xea, 0x5b, 0x7b, 0xfd, 0x3a, 0xa6, 0xe5, 0x14, 0x4c, 0xcf, 0x7a, 0xce, 0xe4, + 0x14, 0x58, 0x9d, 0xf7, 0xaf, 0xc1, 0x98, 0x17, 0x37, 0x62, 0x6f, 0x2d, 0xa0, 0x1c, 0xc0, 0x69, + 0xc8, 0xe5, 0x9b, 0x0a, 0xe7, 0xb4, 0xab, 0x0a, 0x8a, 0x33, 0xd8, 0x1a, 0xc7, 0xed, 0x2f, 0x2c, + 0x2f, 0xe4, 0xba, 0x8b, 0x53, 0x51, 0xa8, 0xc9, 0x46, 0x17, 0x33, 0x1f, 0x21, 0x21, 0x0a, 0xf1, + 0x01, 0xc7, 0x58, 0xc2, 0xec, 0x77, 0xa1, 0xa2, 0xdc, 0xbc, 0xa4, 0x77, 0xa3, 0xd5, 0xc5, 0xbb, + 0x31, 0x9f, 0x33, 0x49, 0xc3, 0x6f, 0xb9, 0xa3, 0xe1, 0xf7, 0x9f, 0x59, 0x90, 0xfa, 0xa9, 0x20, + 0x0c, 0x95, 0x66, 0xc8, 0x2e, 0x89, 0x22, 0x79, 0x1b, 0xfb, 0x54, 0xce, 0x82, 0xe5, 0x1b, 0x86, + 0x2f, 0xa9, 0x9a, 0xac, 0x8b, 0x53, 0x32, 0xe8, 0x2a, 0x0c, 0x36, 0x23, 0x52, 0x4f, 0x58, 0x68, + 0x42, 0x0f, 0x14, 0xf9, 0xdc, 0xf0, 0x9a, 0x58, 0x92, 0xb0, 0xff, 0x95, 0x05, 0x70, 0xd5, 0xdb, + 0xf6, 0x12, 0xec, 0x04, 0x9b, 0xe4, 0x04, 0xb4, 0xc2, 0xeb, 0xd0, 0x17, 0x37, 0x49, 0xa3, 0xd8, + 0x35, 0x5f, 0xda, 0xb3, 0x7a, 0x93, 0x34, 0xd2, 0xcf, 0x41, 0xff, 0x61, 0x46, 0xc7, 0xfe, 0x1e, + 0xc0, 0x58, 0x8a, 0x46, 0x25, 0x73, 0xf4, 0xbc, 0xe1, 0x93, 0xff, 0x68, 0xc6, 0x27, 0xbf, 0xc2, + 0xb0, 0x35, 0x37, 0xfc, 0x04, 0xca, 0xdb, 0xce, 0x7d, 0xa1, 0x08, 0xbc, 0x5c, 0xb4, 0x43, 0xb4, + 0xa5, 0xf9, 0x6b, 0xce, 0x7d, 0x2e, 0x77, 0x3d, 0x27, 0x17, 0xd2, 0x35, 0xe7, 0xfe, 0x01, 0xbf, + 0xcc, 0x63, 0x1b, 0x96, 0x6a, 0x1e, 0x5f, 0xfa, 0xd3, 0xf4, 0x3f, 0xe3, 0xa1, 0xb4, 0x39, 0xd6, + 0xaa, 0x17, 0x08, 0x3b, 0x66, 0x8f, 0xad, 0x7a, 0x41, 0xb6, 0x55, 0x2f, 0x28, 0xd0, 0xaa, 0xc7, + 0x9c, 0x57, 0x07, 0x85, 0xf9, 0x9f, 0x79, 0xfe, 0x0d, 0x5f, 0xf8, 0x58, 0x4f, 0x4d, 0x8b, 0x7b, + 0x04, 0xde, 0xfc, 0x82, 0x14, 0x36, 0x45, 0x69, 0x6e, 0x17, 0x64, 0xd3, 0xe8, 0xef, 0x5b, 0x30, + 0x26, 0x7e, 0x63, 0xf2, 0x5e, 0x8b, 0xc4, 0x89, 0x38, 0xd4, 0x3e, 0x75, 0x94, 0xde, 0x08, 0x12, + 0xbc, 0x53, 0x1f, 0x95, 0x1c, 0xc9, 0x04, 0xe6, 0xf6, 0x2d, 0xd3, 0x1f, 0xf4, 0x3d, 0x0b, 0xa6, + 0xb7, 0x9d, 0xfb, 0xbc, 0x45, 0x5e, 0x86, 0x9d, 0xc4, 0x0b, 0x85, 0x77, 0xe3, 0x6a, 0xaf, 0xeb, + 0xa4, 0x8d, 0x10, 0xef, 0xae, 0x74, 0x5c, 0x9a, 0xee, 0x84, 0x92, 0xdb, 0xe9, 0x8e, 0x3d, 0x9c, + 0xdd, 0x80, 0x21, 0xb9, 0x30, 0x3b, 0x88, 0xf9, 0x55, 0xfd, 0xec, 0xce, 0x51, 0xaa, 0xe7, 0xa5, + 0x69, 0x6c, 0xfe, 0xf5, 0x96, 0x13, 0x24, 0x5e, 0xb2, 0xab, 0xa9, 0x05, 0xac, 0x1d, 0xb1, 0x14, + 0x8f, 0xb5, 0x9d, 0x77, 0x61, 0x44, 0x5f, 0x77, 0xc7, 0xda, 0xd6, 0x7b, 0x30, 0xd5, 0x61, 0x55, + 0x1d, 0x6b, 0x93, 0xf7, 0xe0, 0xd1, 0xae, 0xeb, 0xe3, 0x38, 0x1b, 0xb6, 0x7f, 0xdb, 0xd2, 0x59, + 0xe7, 0x09, 0x18, 0x5d, 0xae, 0x99, 0x46, 0x97, 0x73, 0x45, 0xf7, 0x50, 0x17, 0xcb, 0xcb, 0x86, + 0xde, 0x7d, 0x7a, 0x24, 0xa0, 0x75, 0x18, 0xf0, 0x69, 0x89, 0xbc, 0xf3, 0x3a, 0xdf, 0xcb, 0x2e, + 0x4d, 0x85, 0x12, 0x56, 0x1e, 0x63, 0x41, 0xcb, 0xfe, 0x9e, 0x05, 0x7d, 0x7f, 0x89, 0x11, 0x43, + 0x6d, 0xa4, 0x45, 0xe0, 0xfb, 0x3c, 0x76, 0xee, 0xad, 0xdc, 0x4f, 0x48, 0x10, 0x33, 0x19, 0xb4, + 0xdb, 0xad, 0xfd, 0x30, 0x6d, 0x4a, 0x3a, 0x61, 0xbc, 0x0a, 0xa3, 0xbe, 0x73, 0x87, 0xf8, 0xd2, + 0x60, 0x9c, 0xd5, 0xd8, 0xae, 0xea, 0x40, 0x6c, 0xe2, 0xd2, 0xca, 0x1b, 0xba, 0x3d, 0x5d, 0x08, + 0x49, 0xaa, 0xb2, 0x61, 0x6c, 0xc7, 0x26, 0x2e, 0x55, 0x19, 0xee, 0x39, 0x49, 0x63, 0x4b, 0x68, + 0x73, 0xaa, 0xbb, 0xb7, 0x69, 0x21, 0xe6, 0x30, 0xb4, 0x08, 0xe3, 0x72, 0xc5, 0xde, 0xa2, 0x6a, + 0x7e, 0x18, 0x08, 0x39, 0x53, 0x45, 0x1d, 0x63, 0x13, 0x8c, 0xb3, 0xf8, 0xe8, 0xe3, 0x30, 0x46, + 0x27, 0x27, 0x6c, 0x25, 0xd2, 0xc5, 0xa4, 0x9f, 0xb9, 0x98, 0x30, 0x0f, 0xe5, 0x75, 0x03, 0x82, + 0x33, 0x98, 0xf6, 0xdb, 0x30, 0x75, 0x35, 0x74, 0xdc, 0x25, 0xc7, 0x77, 0x82, 0x06, 0x89, 0xd6, + 0x82, 0xcd, 0xdc, 0xeb, 0x6b, 0xfd, 0x8a, 0xb9, 0x94, 0x77, 0xc5, 0x6c, 0x47, 0x80, 0xf4, 0x06, + 0x84, 0x73, 0xd4, 0x5b, 0x30, 0xe8, 0xf1, 0xa6, 0xc4, 0xb2, 0x7d, 0x21, 0xcf, 0x1e, 0xd5, 0xd6, + 0x47, 0xcd, 0xd9, 0x87, 0x17, 0x60, 0x49, 0x92, 0xaa, 0x20, 0x9d, 0x0c, 0x58, 0xf9, 0x5a, 0x9e, + 0xfd, 0xd7, 0x2d, 0x18, 0xbf, 0x9e, 0x09, 0x69, 0x7d, 0x1a, 0x06, 0x78, 0x62, 0x84, 0xac, 0x89, + 0xa5, 0xce, 0x4a, 0xb1, 0x80, 0x3e, 0x70, 0x0d, 0xff, 0x97, 0x4b, 0x50, 0x61, 0x6e, 0xb6, 0x4d, + 0xaa, 0x4e, 0x1c, 0xbf, 0x98, 0x7a, 0xcd, 0x10, 0x53, 0x73, 0xb4, 0x4c, 0xd5, 0xb1, 0x6e, 0x52, + 0x2a, 0xba, 0xa9, 0x42, 0x3d, 0x0b, 0x29, 0x98, 0x29, 0x41, 0x1e, 0x0e, 0x38, 0x66, 0x46, 0x86, + 0xca, 0x30, 0x50, 0x76, 0xe9, 0xab, 0x70, 0x1f, 0xba, 0x4b, 0x5f, 0xd5, 0xb3, 0x2e, 0xcc, 0xa9, + 0xa6, 0x75, 0x9e, 0xb1, 0xef, 0x4f, 0x32, 0xe7, 0x49, 0xc7, 0xf7, 0x3e, 0x4f, 0x54, 0xc4, 0xf4, + 0x9c, 0x70, 0x86, 0x14, 0xa5, 0x07, 0x8c, 0xcf, 0x88, 0x7f, 0x3c, 0x20, 0x3e, 0xad, 0x62, 0x5f, + 0x86, 0xf1, 0xcc, 0xd4, 0xa1, 0x97, 0xa1, 0xbf, 0xb9, 0xe5, 0xc4, 0x24, 0xe3, 0xc7, 0xd2, 0x5f, + 0xa3, 0x85, 0x07, 0x7b, 0x73, 0x63, 0xaa, 0x02, 0x2b, 0xc1, 0x1c, 0xdb, 0xfe, 0x72, 0x09, 0xfa, + 0xae, 0x87, 0xee, 0x49, 0x2c, 0xb5, 0xcb, 0xc6, 0x52, 0x7b, 0x3a, 0x3f, 0x9d, 0x46, 0xd7, 0x55, + 0x56, 0xcb, 0xac, 0xb2, 0x73, 0x05, 0x68, 0x1d, 0xbe, 0xc0, 0xb6, 0x61, 0x98, 0xa5, 0xeb, 0x10, + 0x8e, 0x3c, 0x2f, 0x1a, 0x9a, 0xd5, 0x5c, 0x46, 0xb3, 0x1a, 0xd7, 0x50, 0x35, 0xfd, 0xea, 0x19, + 0x18, 0x14, 0x8e, 0x23, 0x59, 0xd7, 0x51, 0x81, 0x8b, 0x25, 0xdc, 0xfe, 0x97, 0x65, 0x30, 0xd2, + 0x83, 0xa0, 0xdf, 0xb3, 0x60, 0x3e, 0xe2, 0x61, 0x38, 0x6e, 0xb5, 0x15, 0x79, 0xc1, 0x66, 0xbd, + 0xb1, 0x45, 0xdc, 0x96, 0xef, 0x05, 0x9b, 0x6b, 0x9b, 0x41, 0xa8, 0x8a, 0x57, 0xee, 0x93, 0x46, + 0x8b, 0xd9, 0x69, 0x0b, 0x67, 0x25, 0x51, 0x97, 0xa6, 0x17, 0xf6, 0xf7, 0xe6, 0xe6, 0x71, 0x4f, + 0xad, 0xe0, 0x1e, 0x7b, 0x85, 0xfe, 0xd8, 0x82, 0x05, 0x9e, 0x20, 0xa3, 0xf8, 0x48, 0x0a, 0x69, + 0xa4, 0x35, 0x49, 0x34, 0x25, 0xb7, 0x4e, 0xa2, 0xed, 0xa5, 0x57, 0xc4, 0x24, 0x2f, 0xd4, 0x7a, + 0x6b, 0x15, 0xf7, 0xda, 0x4d, 0xfb, 0xdf, 0x94, 0x61, 0x94, 0xce, 0x67, 0x1a, 0x14, 0xff, 0xb2, + 0xb1, 0x4c, 0x9e, 0xc8, 0x2c, 0x93, 0x49, 0x03, 0xf9, 0xc1, 0xc4, 0xc3, 0xc7, 0x30, 0xe9, 0x3b, + 0x71, 0x72, 0x99, 0x38, 0x51, 0x72, 0x87, 0x38, 0xec, 0x6e, 0x32, 0xeb, 0xf7, 0x50, 0xe0, 0xba, + 0x53, 0x39, 0x23, 0x5d, 0xcd, 0x12, 0xc3, 0xed, 0xf4, 0xd1, 0x0e, 0x20, 0x76, 0x0f, 0x1a, 0x39, + 0x41, 0xcc, 0xc7, 0xe2, 0x09, 0xbb, 0x6e, 0x6f, 0xad, 0xce, 0x8a, 0x56, 0xd1, 0xd5, 0x36, 0x6a, + 0xb8, 0x43, 0x0b, 0xda, 0x4d, 0x77, 0x7f, 0xd1, 0x9b, 0xee, 0x81, 0x1c, 0x9f, 0xed, 0xaf, 0x58, + 0x30, 0x45, 0x3f, 0x8b, 0xe9, 0xdf, 0x1b, 0xa3, 0x10, 0xc6, 0xe9, 0xb2, 0xf3, 0x49, 0x22, 0xcb, + 0xc4, 0xfe, 0xca, 0x91, 0xac, 0x4d, 0x3a, 0xa9, 0xf8, 0x76, 0xc5, 0x24, 0x86, 0xb3, 0xd4, 0xed, + 0x6f, 0x59, 0xc0, 0x3c, 0xee, 0x4e, 0xe0, 0x30, 0xbb, 0x64, 0x1e, 0x66, 0x76, 0x3e, 0xc7, 0xe8, + 0x72, 0x8e, 0xbd, 0x04, 0x13, 0x14, 0x5a, 0x8b, 0xc2, 0xfb, 0xbb, 0x52, 0xd0, 0xce, 0x37, 0xf0, + 0x7e, 0xa5, 0xc4, 0xb7, 0x8d, 0x8a, 0x27, 0x44, 0xbf, 0x60, 0xc1, 0x50, 0xc3, 0x69, 0x3a, 0x0d, + 0x9e, 0x5c, 0xa9, 0x80, 0x75, 0xc6, 0xa8, 0x3f, 0xbf, 0x2c, 0xea, 0x72, 0xcb, 0xc2, 0x47, 0xe4, + 0xd0, 0x65, 0x71, 0xae, 0x35, 0x41, 0x35, 0x3e, 0x7b, 0x17, 0x46, 0x0d, 0x62, 0xc7, 0xaa, 0x86, + 0xfe, 0x82, 0xc5, 0x99, 0xbe, 0x52, 0x15, 0xee, 0xc1, 0x64, 0xa0, 0xfd, 0xa7, 0xec, 0x4c, 0x4a, + 0xc6, 0xf3, 0xc5, 0xd9, 0x3a, 0xe3, 0x82, 0x9a, 0x77, 0x61, 0x86, 0x20, 0x6e, 0x6f, 0xc3, 0xfe, + 0x55, 0x0b, 0x1e, 0xd1, 0x11, 0xb5, 0x00, 0xd0, 0x3c, 0xbb, 0x71, 0x15, 0x86, 0xc2, 0x26, 0x89, + 0x9c, 0x54, 0x2d, 0x3a, 0x27, 0xe7, 0xff, 0x86, 0x28, 0x3f, 0xd8, 0x9b, 0x9b, 0xd6, 0xa9, 0xcb, + 0x72, 0xac, 0x6a, 0x22, 0x1b, 0x06, 0xd8, 0xbc, 0xc4, 0x22, 0x74, 0x97, 0x25, 0x1b, 0x62, 0x97, + 0x2a, 0x31, 0x16, 0x10, 0xfb, 0x6f, 0x59, 0x7c, 0xb9, 0xe9, 0x5d, 0x47, 0x5f, 0x80, 0x89, 0x6d, + 0xaa, 0x41, 0xad, 0xdc, 0x6f, 0xd2, 0x83, 0x94, 0x5d, 0x27, 0x5b, 0x45, 0x8e, 0x8f, 0x2e, 0xc3, + 0x5d, 0x9a, 0x11, 0xbd, 0x9f, 0xb8, 0x96, 0x21, 0x8b, 0xdb, 0x1a, 0xb2, 0xff, 0x61, 0x89, 0xef, + 0x59, 0x26, 0xc3, 0x3d, 0x03, 0x83, 0xcd, 0xd0, 0x5d, 0x5e, 0xab, 0x62, 0x31, 0x57, 0x8a, 0xe9, + 0xd4, 0x78, 0x31, 0x96, 0x70, 0x74, 0x01, 0x80, 0xdc, 0x4f, 0x48, 0x14, 0x38, 0xbe, 0xba, 0x06, + 0x56, 0xa2, 0xd2, 0x8a, 0x82, 0x60, 0x0d, 0x8b, 0xd6, 0x69, 0x46, 0xe1, 0x8e, 0xe7, 0xb2, 0xc8, + 0x85, 0xb2, 0x59, 0xa7, 0xa6, 0x20, 0x58, 0xc3, 0xa2, 0x7a, 0x6b, 0x2b, 0x88, 0xf9, 0x31, 0xe6, + 0xdc, 0x11, 0xb9, 0x71, 0x86, 0x52, 0xbd, 0xf5, 0xa6, 0x0e, 0xc4, 0x26, 0x2e, 0xba, 0x02, 0x03, + 0x89, 0xc3, 0x2e, 0x37, 0xfb, 0x8b, 0x78, 0x8a, 0xac, 0x53, 0x5c, 0x3d, 0x19, 0x11, 0xad, 0x8a, + 0x05, 0x09, 0xfb, 0x3f, 0x55, 0x00, 0x52, 0xa9, 0x0b, 0x7d, 0xb9, 0x7d, 0xc3, 0x7f, 0xb4, 0xa8, + 0xc8, 0xf6, 0xe0, 0x76, 0x3b, 0xfa, 0x9a, 0x05, 0xc3, 0x8e, 0xef, 0x87, 0x0d, 0x27, 0x61, 0xd3, + 0x53, 0x2a, 0xca, 0x7a, 0x44, 0x4f, 0x16, 0xd3, 0xba, 0xbc, 0x33, 0x2f, 0xca, 0x0b, 0x47, 0x0d, + 0x92, 0xdb, 0x1f, 0xbd, 0x0b, 0xe8, 0x23, 0x52, 0x6a, 0xe7, 0x5f, 0x78, 0x36, 0x2b, 0xb5, 0x57, + 0x18, 0xc3, 0xd5, 0x04, 0x76, 0xf4, 0xb6, 0x91, 0x4b, 0xa6, 0xaf, 0x48, 0xf8, 0xa9, 0x21, 0x87, + 0xe4, 0xa5, 0x91, 0x41, 0x6f, 0xea, 0x2e, 0xd5, 0xfd, 0x45, 0xe2, 0xbb, 0x35, 0x71, 0x38, 0xc7, + 0x9d, 0x3a, 0x81, 0x71, 0xd7, 0x3c, 0x79, 0x85, 0x5b, 0xd8, 0x0b, 0xf9, 0x2d, 0x64, 0x8e, 0xec, + 0xf4, 0xac, 0xcd, 0x00, 0x70, 0xb6, 0x09, 0xf4, 0x26, 0x77, 0x78, 0x5f, 0x0b, 0x36, 0x42, 0xe1, + 0x1a, 0x76, 0xbe, 0xc0, 0x37, 0xdf, 0x8d, 0x13, 0xb2, 0x4d, 0xeb, 0xa4, 0x87, 0xeb, 0x75, 0x41, + 0x05, 0x2b, 0x7a, 0x68, 0x1d, 0x06, 0x58, 0xb4, 0x51, 0x3c, 0x33, 0x54, 0xc4, 0x12, 0x67, 0x06, + 0xd9, 0xa6, 0xfb, 0x87, 0xfd, 0x8d, 0xb1, 0xa0, 0x85, 0x2e, 0xcb, 0x30, 0xfb, 0x78, 0x2d, 0xb8, + 0x19, 0x13, 0x16, 0x66, 0x5f, 0x59, 0xfa, 0x50, 0x1a, 0x37, 0xcf, 0xcb, 0x3b, 0x66, 0xd3, 0x33, + 0x6a, 0x52, 0xc1, 0x46, 0xfc, 0x97, 0x49, 0xfa, 0x66, 0xa0, 0x48, 0x47, 0xcd, 0x94, 0x7e, 0xe9, + 0x64, 0xdf, 0x32, 0x89, 0xe1, 0x2c, 0xf5, 0x13, 0x3d, 0x52, 0x67, 0x03, 0x98, 0xc8, 0x6e, 0xca, + 0x63, 0x3d, 0xc2, 0x7f, 0xd2, 0x07, 0x63, 0xe6, 0xe2, 0x40, 0x0b, 0x50, 0x11, 0x44, 0x54, 0xd2, + 0x2e, 0xb5, 0x07, 0xae, 0x49, 0x00, 0x4e, 0x71, 0x58, 0xfa, 0x32, 0x56, 0x5d, 0x73, 0x0a, 0x4a, + 0xd3, 0x97, 0x29, 0x08, 0xd6, 0xb0, 0xa8, 0x24, 0x7c, 0x27, 0x0c, 0x13, 0x75, 0x12, 0xa8, 0x75, + 0xb3, 0xc4, 0x4a, 0xb1, 0x80, 0xd2, 0x13, 0xe0, 0x2e, 0xfd, 0x98, 0xbe, 0x69, 0x55, 0x54, 0x27, + 0xc0, 0x15, 0x1d, 0x88, 0x4d, 0x5c, 0x7a, 0xa2, 0x85, 0x31, 0x5b, 0x88, 0x42, 0xde, 0x4e, 0x9d, + 0xac, 0xea, 0x3c, 0x02, 0x4f, 0xc2, 0xd1, 0x67, 0xe0, 0x11, 0x15, 0x30, 0x87, 0xb9, 0x95, 0x56, + 0xb6, 0x38, 0x60, 0xa8, 0xcc, 0x8f, 0x2c, 0x77, 0x46, 0xc3, 0xdd, 0xea, 0xa3, 0xd7, 0x60, 0x4c, + 0xc8, 0xca, 0x92, 0xe2, 0xa0, 0x79, 0x03, 0x7f, 0xc5, 0x80, 0xe2, 0x0c, 0x36, 0xaa, 0xc2, 0x04, + 0x2d, 0x61, 0x42, 0xaa, 0xa4, 0xc0, 0x03, 0xff, 0xd4, 0x51, 0x7f, 0x25, 0x03, 0xc7, 0x6d, 0x35, + 0xd0, 0x22, 0x8c, 0x73, 0x61, 0x85, 0x2a, 0x86, 0xec, 0x3b, 0x08, 0x7f, 0x4e, 0xb5, 0x11, 0x6e, + 0x98, 0x60, 0x9c, 0xc5, 0x47, 0x17, 0x61, 0xc4, 0x89, 0x1a, 0x5b, 0x5e, 0x42, 0x1a, 0x49, 0x2b, + 0xe2, 0x49, 0x2c, 0x34, 0x17, 0x86, 0x45, 0x0d, 0x86, 0x0d, 0x4c, 0xfb, 0xf3, 0x30, 0xd5, 0xc1, + 0x79, 0x9c, 0x2e, 0x1c, 0xa7, 0xe9, 0xc9, 0x31, 0x65, 0xdc, 0xa5, 0x16, 0x6b, 0x6b, 0x72, 0x34, + 0x1a, 0x16, 0x5d, 0x9d, 0xcc, 0x3c, 0xad, 0xe5, 0xd4, 0x54, 0xab, 0x73, 0x55, 0x02, 0x70, 0x8a, + 0x63, 0xff, 0x45, 0x05, 0x34, 0xeb, 0x4d, 0x01, 0x17, 0x99, 0x8b, 0x30, 0x22, 0xd3, 0xc4, 0x6a, + 0xe9, 0x19, 0xd5, 0x30, 0x2f, 0x69, 0x30, 0x6c, 0x60, 0xd2, 0xbe, 0x05, 0xd2, 0x26, 0x95, 0x75, + 0xce, 0x52, 0xc6, 0x2a, 0x9c, 0xe2, 0xa0, 0xf3, 0x30, 0x14, 0x13, 0x7f, 0xe3, 0xaa, 0x17, 0xdc, + 0x15, 0x0b, 0x5b, 0x71, 0xe6, 0xba, 0x28, 0xc7, 0x0a, 0x03, 0x2d, 0x41, 0xb9, 0xe5, 0xb9, 0x62, + 0x29, 0x4b, 0xb1, 0xa1, 0x7c, 0x73, 0xad, 0x7a, 0xb0, 0x37, 0xf7, 0x44, 0xb7, 0x9c, 0xb9, 0x54, + 0x3f, 0x8f, 0xe7, 0xe9, 0xf6, 0xa3, 0x95, 0x3b, 0xd9, 0xe9, 0x07, 0x7a, 0xb4, 0xd3, 0x5f, 0x00, + 0x10, 0xa3, 0x96, 0x6b, 0xb9, 0x9c, 0x7e, 0xb5, 0x4b, 0x0a, 0x82, 0x35, 0x2c, 0xaa, 0xe5, 0x37, + 0x22, 0xe2, 0x48, 0x45, 0x98, 0x3b, 0x35, 0x0f, 0x1d, 0x5d, 0xcb, 0x5f, 0xce, 0x12, 0xc3, 0xed, + 0xf4, 0x51, 0x08, 0x93, 0xae, 0x88, 0xca, 0x4c, 0x1b, 0xad, 0xf4, 0xee, 0x49, 0x4d, 0x1b, 0xac, + 0x66, 0x09, 0xe1, 0x76, 0xda, 0xe8, 0x73, 0x30, 0x2b, 0x0b, 0xdb, 0x43, 0x62, 0xd9, 0x76, 0x29, + 0x2f, 0x9d, 0xd9, 0xdf, 0x9b, 0x9b, 0xad, 0x76, 0xc5, 0xc2, 0x87, 0x50, 0x40, 0x6f, 0xc1, 0x00, + 0xbb, 0xd7, 0x89, 0x67, 0x86, 0xd9, 0x89, 0xf7, 0x52, 0x11, 0x7f, 0x7c, 0xba, 0xea, 0xe7, 0xd9, + 0xed, 0x90, 0xf0, 0x34, 0x4d, 0x2f, 0xcb, 0x58, 0x21, 0x16, 0x34, 0x51, 0x13, 0x86, 0x9d, 0x20, + 0x08, 0x13, 0x87, 0x0b, 0x62, 0x23, 0x45, 0x64, 0x49, 0xad, 0x89, 0xc5, 0xb4, 0x2e, 0x6f, 0x47, + 0x39, 0xaf, 0x69, 0x10, 0xac, 0x37, 0x81, 0xee, 0xc1, 0x78, 0x78, 0x8f, 0x32, 0x4c, 0x79, 0xb5, + 0x11, 0xcf, 0x8c, 0x9a, 0x03, 0xcb, 0x31, 0xd4, 0x1a, 0x95, 0x35, 0x4e, 0x66, 0x12, 0xc5, 0xd9, + 0x56, 0xd0, 0xbc, 0x61, 0xae, 0x1e, 0x4b, 0xfd, 0xa9, 0x53, 0x73, 0xb5, 0x6e, 0x9d, 0x66, 0x61, + 0xd7, 0xdc, 0x87, 0x92, 0x71, 0x84, 0xf1, 0x4c, 0xd8, 0x75, 0x0a, 0xc2, 0x3a, 0xde, 0xec, 0xc7, + 0x60, 0x58, 0x9b, 0xf8, 0x5e, 0x1c, 0x77, 0x67, 0x5f, 0x83, 0x89, 0xec, 0x84, 0xf6, 0xe4, 0xf8, + 0xfb, 0x3f, 0x4b, 0x30, 0xde, 0xe1, 0xde, 0xe8, 0xae, 0xc7, 0x9c, 0xcf, 0x0d, 0xd6, 0x77, 0xc5, + 0x0b, 0x5c, 0xcc, 0x20, 0x26, 0x03, 0x2b, 0x15, 0x60, 0x60, 0x92, 0x9b, 0x96, 0xbb, 0x72, 0x53, + 0xc1, 0xb4, 0xfa, 0xde, 0x0f, 0xd3, 0x32, 0xcf, 0x89, 0xfe, 0x42, 0xe7, 0xc4, 0x03, 0x60, 0x74, + 0xc6, 0x51, 0x33, 0x58, 0xe0, 0xa8, 0xf9, 0x66, 0x09, 0x26, 0x52, 0x27, 0x67, 0x91, 0x3b, 0xfa, + 0xf8, 0xaf, 0x21, 0xd6, 0x8d, 0x6b, 0x88, 0xbc, 0xd4, 0xd0, 0x99, 0xfe, 0x75, 0xbd, 0x92, 0x78, + 0x2b, 0x73, 0x25, 0xf1, 0x52, 0x8f, 0x74, 0x0f, 0xbf, 0x9e, 0xf8, 0x6e, 0x09, 0x4e, 0x65, 0xab, + 0x2c, 0xfb, 0x8e, 0xb7, 0x7d, 0x02, 0xf3, 0xf5, 0x19, 0x63, 0xbe, 0x5e, 0xe9, 0x6d, 0x5c, 0xac, + 0x93, 0x5d, 0x27, 0xcd, 0xc9, 0x4c, 0xda, 0xc7, 0x8e, 0x42, 0xfc, 0xf0, 0x99, 0xfb, 0x43, 0x0b, + 0x1e, 0xed, 0x58, 0xef, 0x04, 0x0c, 0xaf, 0x6f, 0x98, 0x86, 0xd7, 0x17, 0x8f, 0x30, 0xba, 0x2e, + 0x96, 0xd8, 0x5f, 0x2b, 0x77, 0x19, 0x15, 0x33, 0x4d, 0xdd, 0x80, 0x61, 0xa7, 0xd1, 0x20, 0x71, + 0x7c, 0x2d, 0x74, 0x55, 0x02, 0xa7, 0xe7, 0xd9, 0xd9, 0x92, 0x16, 0x1f, 0xec, 0xcd, 0xcd, 0x66, + 0x49, 0xa4, 0x60, 0xac, 0x53, 0x30, 0x53, 0xcb, 0x95, 0x8e, 0x29, 0xb5, 0xdc, 0x05, 0x80, 0x1d, + 0xa5, 0xc5, 0x66, 0x2d, 0x5e, 0x9a, 0x7e, 0xab, 0x61, 0xa1, 0xff, 0x9f, 0x49, 0x84, 0xdc, 0x49, + 0xa3, 0xcf, 0x8c, 0x97, 0xcc, 0xf9, 0x7e, 0xba, 0xc3, 0x07, 0x0f, 0xcb, 0x54, 0xd6, 0x41, 0x45, + 0x12, 0x7d, 0x0a, 0x26, 0x62, 0x1e, 0xfc, 0xbf, 0xec, 0x3b, 0x31, 0xf3, 0xee, 0x17, 0xfc, 0x94, + 0x45, 0x58, 0xd6, 0x33, 0x30, 0xdc, 0x86, 0x6d, 0x7f, 0xa7, 0x0c, 0x1f, 0x3c, 0x64, 0xd9, 0xa2, + 0x45, 0xf3, 0xd6, 0xf6, 0xb9, 0xac, 0xfd, 0x67, 0xb6, 0x63, 0x65, 0xc3, 0x20, 0x94, 0xf9, 0xda, + 0xa5, 0xf7, 0xfd, 0xb5, 0xbf, 0xae, 0x5b, 0xeb, 0xb8, 0xdf, 0xe6, 0xa5, 0x23, 0x6f, 0xcc, 0x9f, + 0x56, 0x63, 0xfd, 0x97, 0x2c, 0x78, 0xa2, 0xe3, 0xb0, 0x0c, 0x2f, 0x91, 0x05, 0xa8, 0x34, 0x68, + 0xa1, 0x16, 0x8b, 0x93, 0x06, 0xc1, 0x49, 0x00, 0x4e, 0x71, 0x0c, 0x67, 0x90, 0x52, 0xae, 0x33, + 0xc8, 0xef, 0x5b, 0x30, 0x9d, 0xed, 0xc4, 0x09, 0xf0, 0xad, 0xba, 0xc9, 0xb7, 0xe6, 0x7b, 0xfb, + 0xf8, 0x5d, 0x58, 0xd6, 0x7f, 0x1f, 0x83, 0xd3, 0x6d, 0xa7, 0x1e, 0x9f, 0xc5, 0x9f, 0xb3, 0x60, + 0x72, 0x93, 0x49, 0xef, 0x5a, 0xc0, 0x93, 0x18, 0x57, 0x4e, 0x94, 0xd8, 0xa1, 0x71, 0x52, 0x5c, + 0x17, 0x69, 0x43, 0xc1, 0xed, 0x8d, 0xa1, 0xaf, 0x5a, 0x30, 0xed, 0xdc, 0x8b, 0xdb, 0x5e, 0x36, + 0x11, 0x0b, 0xe9, 0xb5, 0x1c, 0x63, 0x59, 0xce, 0x9b, 0x28, 0x4b, 0x33, 0xfb, 0x7b, 0x73, 0xd3, + 0x9d, 0xb0, 0x70, 0xc7, 0x56, 0xe9, 0xf7, 0xdd, 0x12, 0xe1, 0x14, 0xc5, 0x42, 0xf7, 0x3a, 0x05, + 0x5f, 0x70, 0xb6, 0x26, 0x21, 0x58, 0x51, 0x44, 0xef, 0x40, 0x65, 0x53, 0xc6, 0x38, 0x65, 0xd9, + 0x66, 0x97, 0x69, 0xee, 0x14, 0x12, 0xc5, 0x7d, 0xf7, 0x15, 0x08, 0xa7, 0x44, 0xd1, 0x65, 0x28, + 0x07, 0x1b, 0xb1, 0x88, 0x26, 0xce, 0xf3, 0x01, 0x32, 0x3d, 0xaf, 0x78, 0x00, 0xe6, 0xf5, 0xd5, + 0x3a, 0xa6, 0x24, 0x28, 0xa5, 0xe8, 0x8e, 0x2b, 0xac, 0xc4, 0x39, 0x94, 0xf0, 0x52, 0xb5, 0x9d, + 0x12, 0x5e, 0xaa, 0x62, 0x4a, 0x02, 0xd5, 0xa0, 0x9f, 0x05, 0x6b, 0x08, 0x13, 0x70, 0x4e, 0xc8, + 0x79, 0x5b, 0x48, 0x0a, 0xcf, 0x80, 0xc8, 0x8a, 0x31, 0x27, 0x84, 0xd6, 0x61, 0xa0, 0xc1, 0x92, + 0xf8, 0x0b, 0xdd, 0x3c, 0x2f, 0x19, 0x43, 0x5b, 0xc2, 0x7f, 0x7e, 0xef, 0xc5, 0xcb, 0xb1, 0xa0, + 0xc5, 0xa8, 0x92, 0xe6, 0xd6, 0x46, 0x2c, 0x94, 0xef, 0x3c, 0xaa, 0x6d, 0xcf, 0x31, 0x08, 0xaa, + 0xac, 0x1c, 0x0b, 0x5a, 0xa8, 0x0a, 0xa5, 0x8d, 0x86, 0x48, 0xa4, 0x9a, 0x63, 0xfa, 0x35, 0xa3, + 0x69, 0x97, 0x06, 0xf6, 0xf7, 0xe6, 0x4a, 0xab, 0xcb, 0xb8, 0xb4, 0xd1, 0x40, 0x6f, 0xc0, 0xe0, + 0x06, 0x8f, 0x8f, 0x14, 0x49, 0x53, 0x5f, 0xc8, 0x0b, 0xe2, 0x6c, 0x0b, 0xa6, 0xe4, 0xf1, 0x19, + 0x02, 0x80, 0x25, 0x39, 0x96, 0x4f, 0x4e, 0x45, 0x7c, 0x8a, 0xac, 0xa9, 0xf3, 0xbd, 0x45, 0x88, + 0x0a, 0x9d, 0x54, 0x95, 0x62, 0x8d, 0x22, 0x5d, 0xf3, 0x8e, 0x7c, 0x8f, 0x84, 0x65, 0x4c, 0xcd, + 0x5d, 0xf3, 0x1d, 0x9f, 0x2f, 0xe1, 0x6b, 0x5e, 0x81, 0x70, 0x4a, 0x14, 0xb5, 0x60, 0x74, 0x27, + 0x6e, 0x6e, 0x11, 0xb9, 0xf5, 0x59, 0x1a, 0xd5, 0xe1, 0x0b, 0x9f, 0xc8, 0xc9, 0x8d, 0x2b, 0xaa, + 0x78, 0x51, 0xd2, 0x72, 0xfc, 0x36, 0x0e, 0xc6, 0x12, 0x78, 0xdd, 0xd2, 0xc9, 0x62, 0xb3, 0x15, + 0xfa, 0x49, 0xde, 0x6b, 0x85, 0x77, 0x76, 0x13, 0x22, 0xd2, 0xac, 0xe6, 0x7c, 0x92, 0xd7, 0x39, + 0x72, 0xfb, 0x27, 0x11, 0x00, 0x2c, 0xc9, 0xa9, 0x29, 0x63, 0xdc, 0x78, 0xa2, 0xf0, 0x94, 0xb5, + 0x8d, 0x21, 0x9d, 0x32, 0xc6, 0x7d, 0x53, 0xa2, 0x8c, 0xeb, 0x36, 0xb7, 0xc2, 0x24, 0x0c, 0x32, + 0xbc, 0x7f, 0xb2, 0x08, 0xd7, 0xad, 0x75, 0xa8, 0xd9, 0xce, 0x75, 0x3b, 0x61, 0xe1, 0x8e, 0xad, + 0xa2, 0x00, 0xc6, 0x9a, 0x61, 0x94, 0xdc, 0x0b, 0x23, 0xb9, 0x0e, 0x51, 0x21, 0x1d, 0xd1, 0xa8, + 0x23, 0xda, 0x66, 0x6e, 0xb8, 0x26, 0x04, 0x67, 0xa8, 0xd3, 0x4f, 0x17, 0x37, 0x1c, 0x9f, 0xac, + 0xdd, 0x98, 0x99, 0x2a, 0xf2, 0xe9, 0xea, 0x1c, 0xb9, 0xfd, 0xd3, 0x09, 0x00, 0x96, 0xe4, 0xec, + 0x5f, 0x1d, 0x68, 0x17, 0x1c, 0x98, 0x6a, 0xf0, 0x37, 0xdb, 0x6f, 0x62, 0x3f, 0xd5, 0xbb, 0x06, + 0xfc, 0x00, 0xef, 0x64, 0xbf, 0x6a, 0xc1, 0xe9, 0x66, 0x47, 0xb1, 0x40, 0x1c, 0xbd, 0xbd, 0x2a, + 0xd2, 0x7c, 0x5a, 0x54, 0x36, 0xe4, 0xce, 0x70, 0xdc, 0xa5, 0xcd, 0xac, 0x30, 0x5d, 0x7e, 0xdf, + 0xc2, 0xf4, 0x6d, 0x18, 0x62, 0xd2, 0x5f, 0x9a, 0xeb, 0xa4, 0xc7, 0xb4, 0x20, 0xec, 0x10, 0x5f, + 0x16, 0x24, 0xb0, 0x22, 0x46, 0x27, 0xee, 0xf1, 0xec, 0x20, 0x30, 0x61, 0x60, 0x91, 0x83, 0x8f, + 0x6b, 0x2a, 0xab, 0x62, 0x26, 0x1e, 0xaf, 0x1d, 0x86, 0x7c, 0x90, 0x87, 0x80, 0x0f, 0x6f, 0x0c, + 0x55, 0x3b, 0xa8, 0x4a, 0x03, 0xe6, 0xb5, 0x4b, 0xbe, 0xba, 0x74, 0xb2, 0x22, 0xfe, 0x3f, 0xb2, + 0x3a, 0x48, 0xa4, 0x5c, 0x2d, 0xfb, 0x84, 0xa9, 0x96, 0x3d, 0x9d, 0x55, 0xcb, 0xda, 0x8c, 0x31, + 0x86, 0x46, 0x56, 0x3c, 0x87, 0x68, 0xd1, 0x64, 0x2e, 0xb6, 0x0f, 0x67, 0xf3, 0xd8, 0x1d, 0x73, + 0xc5, 0x72, 0xd5, 0x25, 0x64, 0xea, 0x8a, 0xe5, 0xae, 0x55, 0x31, 0x83, 0x14, 0xcd, 0x07, 0x60, + 0xff, 0x7c, 0x09, 0xca, 0xb5, 0xd0, 0x3d, 0x01, 0xe3, 0xd2, 0x25, 0xc3, 0xb8, 0xf4, 0x54, 0xee, + 0xfb, 0x74, 0x5d, 0x4d, 0x49, 0x37, 0x32, 0xa6, 0xa4, 0x0f, 0xe7, 0x93, 0x3a, 0xdc, 0x70, 0xf4, + 0xbd, 0x32, 0xe8, 0x2f, 0xec, 0xa1, 0xff, 0x70, 0x14, 0x0f, 0xdd, 0x72, 0xb1, 0x47, 0xf7, 0x44, + 0x1b, 0xcc, 0x93, 0x4b, 0xc6, 0xf5, 0xfd, 0xd4, 0x3a, 0xea, 0xde, 0x26, 0xde, 0xe6, 0x56, 0x42, + 0xdc, 0xec, 0xc0, 0x4e, 0xce, 0x51, 0xf7, 0xcf, 0x2d, 0x18, 0xcf, 0xb4, 0x8e, 0xfc, 0x4e, 0x01, + 0x41, 0x47, 0x34, 0x17, 0x4d, 0xe6, 0x46, 0x10, 0xcd, 0x03, 0x28, 0xab, 0xbf, 0x34, 0xc9, 0x30, + 0xe9, 0x54, 0x5d, 0x0b, 0xc4, 0x58, 0xc3, 0x40, 0x2f, 0xc3, 0x70, 0x12, 0x36, 0x43, 0x3f, 0xdc, + 0xdc, 0xbd, 0x42, 0x64, 0xa6, 0x0a, 0x75, 0x63, 0xb2, 0x9e, 0x82, 0xb0, 0x8e, 0x67, 0x7f, 0xbf, + 0x0c, 0xd9, 0xf7, 0x19, 0xff, 0xdf, 0x3a, 0xfd, 0xe9, 0x59, 0xa7, 0x7f, 0x64, 0xc1, 0x04, 0x6d, + 0x9d, 0xb9, 0xce, 0x48, 0x87, 0x5a, 0xf5, 0xa0, 0x81, 0x75, 0xc8, 0x83, 0x06, 0x4f, 0x53, 0x6e, + 0xe7, 0x86, 0xad, 0x44, 0x18, 0x91, 0x34, 0x26, 0x46, 0x4b, 0xb1, 0x80, 0x0a, 0x3c, 0x12, 0x45, + 0x22, 0xf2, 0x48, 0xc7, 0x23, 0x51, 0x84, 0x05, 0x54, 0xbe, 0x77, 0xd0, 0xd7, 0xe5, 0xbd, 0x03, + 0x96, 0xeb, 0x49, 0xb8, 0x6b, 0x08, 0xb1, 0x42, 0xcb, 0xf5, 0x24, 0xfd, 0x38, 0x52, 0x1c, 0xfb, + 0xdb, 0x65, 0x18, 0xa9, 0x85, 0x6e, 0xea, 0x29, 0xff, 0x92, 0xe1, 0x29, 0x7f, 0x36, 0xe3, 0x29, + 0x3f, 0xa1, 0xe3, 0x3e, 0x18, 0x47, 0x79, 0x91, 0x13, 0x8c, 0xbd, 0xc8, 0x71, 0x44, 0x27, 0x79, + 0x23, 0x27, 0x98, 0x22, 0x84, 0x4d, 0xba, 0x3f, 0x4b, 0xce, 0xf1, 0xff, 0xdb, 0x82, 0xb1, 0x5a, + 0xe8, 0xd2, 0x05, 0xfa, 0xb3, 0xb4, 0x1a, 0xf5, 0x4c, 0x62, 0x03, 0x87, 0x64, 0x12, 0xfb, 0x75, + 0x0b, 0x06, 0x6b, 0xa1, 0x7b, 0x02, 0x06, 0xd6, 0x55, 0xd3, 0xc0, 0xfa, 0x44, 0x2e, 0xe7, 0xed, + 0x62, 0x53, 0xfd, 0x4e, 0x19, 0x46, 0x69, 0x8f, 0xc3, 0x4d, 0xf9, 0xbd, 0x8c, 0xb9, 0xb1, 0x0a, + 0xcc, 0x0d, 0x15, 0x09, 0x43, 0xdf, 0x0f, 0xef, 0x65, 0xbf, 0xdd, 0x2a, 0x2b, 0xc5, 0x02, 0x8a, + 0xce, 0xc3, 0x50, 0x33, 0x22, 0x3b, 0x5e, 0xd8, 0x8a, 0xb3, 0x51, 0x8c, 0x35, 0x51, 0x8e, 0x15, + 0x06, 0x7a, 0x09, 0x46, 0x62, 0x2f, 0x68, 0x10, 0xe9, 0xcc, 0xd1, 0xc7, 0x9c, 0x39, 0x78, 0xd2, + 0x46, 0xad, 0x1c, 0x1b, 0x58, 0xe8, 0x36, 0x54, 0xd8, 0x7f, 0xb6, 0x83, 0x7a, 0x7f, 0xb0, 0x80, + 0x67, 0x2a, 0x93, 0x04, 0x70, 0x4a, 0x0b, 0x5d, 0x00, 0x48, 0xa4, 0xdb, 0x49, 0x2c, 0xf2, 0xad, + 0x28, 0xb9, 0x54, 0x39, 0xa4, 0xc4, 0x58, 0xc3, 0x42, 0xcf, 0x41, 0x25, 0x71, 0x3c, 0xff, 0xaa, + 0x17, 0x90, 0x58, 0xb8, 0xed, 0x88, 0x04, 0xcc, 0xa2, 0x10, 0xa7, 0x70, 0x7a, 0xde, 0xb3, 0x18, + 0x6a, 0xfe, 0x18, 0xca, 0x10, 0xc3, 0x66, 0xe7, 0xfd, 0x55, 0x55, 0x8a, 0x35, 0x0c, 0xfb, 0x22, + 0x9c, 0xaa, 0x85, 0x6e, 0x2d, 0x8c, 0x92, 0xd5, 0x30, 0xba, 0xe7, 0x44, 0xae, 0xfc, 0x7e, 0x73, + 0x32, 0xef, 0x2f, 0x3d, 0x93, 0xfb, 0xb9, 0xcd, 0xd1, 0xc8, 0xe3, 0xfb, 0x22, 0x3b, 0xf1, 0x7b, + 0x0c, 0xc1, 0xf8, 0x51, 0x09, 0x50, 0x8d, 0x39, 0xc6, 0x18, 0x6f, 0xe7, 0x6c, 0xc1, 0x58, 0x4c, + 0xae, 0x7a, 0x41, 0xeb, 0xbe, 0x20, 0x55, 0x2c, 0xe6, 0xa5, 0xbe, 0xa2, 0xd7, 0xe1, 0x96, 0x0e, + 0xb3, 0x0c, 0x67, 0xe8, 0xd2, 0xc9, 0x8c, 0x5a, 0xc1, 0x62, 0x7c, 0x33, 0x26, 0x91, 0x78, 0x2b, + 0x86, 0x4d, 0x26, 0x96, 0x85, 0x38, 0x85, 0xd3, 0xc5, 0xc3, 0xfe, 0x5c, 0x0f, 0x03, 0x1c, 0x86, + 0x89, 0x5c, 0x6e, 0xec, 0xed, 0x00, 0xad, 0x1c, 0x1b, 0x58, 0x68, 0x15, 0x50, 0xdc, 0x6a, 0x36, + 0x7d, 0x76, 0xd7, 0xe8, 0xf8, 0x97, 0xa2, 0xb0, 0xd5, 0xe4, 0xfe, 0xd1, 0x22, 0xed, 0x7e, 0xbd, + 0x0d, 0x8a, 0x3b, 0xd4, 0xa0, 0xcc, 0x62, 0x23, 0x66, 0xbf, 0x45, 0x40, 0x35, 0xb7, 0x57, 0xd6, + 0x59, 0x11, 0x96, 0x30, 0xfb, 0x8b, 0xec, 0x80, 0x63, 0x8f, 0x78, 0x24, 0xad, 0x88, 0xa0, 0x6d, + 0x18, 0x6d, 0xb2, 0x43, 0x2c, 0x89, 0x42, 0xdf, 0x27, 0x52, 0xbe, 0x3c, 0x9a, 0x6b, 0x0e, 0x4f, + 0xdb, 0xaf, 0x93, 0xc3, 0x26, 0x75, 0xfb, 0x17, 0xc7, 0x18, 0xaf, 0x12, 0xd7, 0xbd, 0x83, 0xc2, + 0x09, 0x57, 0x48, 0x72, 0x1f, 0x2a, 0xf2, 0x1c, 0x57, 0x7a, 0x0e, 0x08, 0x97, 0x5e, 0x2c, 0xa9, + 0xa0, 0xcf, 0x32, 0x17, 0x73, 0xce, 0x20, 0x8a, 0x3f, 0x32, 0xc8, 0xf1, 0x0d, 0xf7, 0x72, 0x41, + 0x02, 0x6b, 0xe4, 0xd0, 0x55, 0x18, 0x15, 0x6f, 0x3e, 0x08, 0x33, 0x45, 0xd9, 0x50, 0xb1, 0x47, + 0xb1, 0x0e, 0x3c, 0xc8, 0x16, 0x60, 0xb3, 0x32, 0xda, 0x84, 0xc7, 0xb5, 0x37, 0x8d, 0x3a, 0xb8, + 0x91, 0x71, 0xce, 0xf3, 0xc4, 0xfe, 0xde, 0xdc, 0xe3, 0xeb, 0x87, 0x21, 0xe2, 0xc3, 0xe9, 0xa0, + 0x1b, 0x70, 0xca, 0x69, 0x24, 0xde, 0x0e, 0xa9, 0x12, 0xc7, 0xf5, 0xbd, 0x80, 0x98, 0x51, 0xf7, + 0x8f, 0xee, 0xef, 0xcd, 0x9d, 0x5a, 0xec, 0x84, 0x80, 0x3b, 0xd7, 0x43, 0x9f, 0x80, 0x8a, 0x1b, + 0xc4, 0x62, 0x0e, 0x06, 0x8c, 0x27, 0xbc, 0x2a, 0xd5, 0xeb, 0x75, 0x35, 0xfe, 0xf4, 0x0f, 0x4e, + 0x2b, 0xa0, 0xf7, 0xf8, 0x13, 0xf5, 0x4a, 0x9b, 0xe1, 0x4f, 0xc7, 0xbd, 0x52, 0x48, 0x7f, 0x36, + 0x62, 0x61, 0xb8, 0x05, 0x4f, 0xb9, 0x6b, 0x1a, 0x61, 0x32, 0x46, 0x13, 0xe8, 0xd3, 0x80, 0x62, + 0x12, 0xed, 0x78, 0x0d, 0xb2, 0xd8, 0x60, 0x99, 0x4e, 0x99, 0x8d, 0x67, 0xc8, 0x88, 0x5b, 0x40, + 0xf5, 0x36, 0x0c, 0xdc, 0xa1, 0x16, 0xba, 0x4c, 0x39, 0x8f, 0x5e, 0x2a, 0xbc, 0x6b, 0xa5, 0x60, + 0x38, 0x53, 0x25, 0xcd, 0x88, 0x34, 0x9c, 0x84, 0xb8, 0x26, 0x45, 0x9c, 0xa9, 0x47, 0xcf, 0x25, + 0x95, 0xcc, 0x1e, 0x4c, 0x9f, 0xd0, 0xf6, 0x84, 0xf6, 0x54, 0xcf, 0xda, 0x0a, 0xe3, 0xe4, 0x3a, + 0x49, 0xee, 0x85, 0xd1, 0x5d, 0x76, 0x87, 0x31, 0xa4, 0xa5, 0x8d, 0x4b, 0x41, 0x58, 0xc7, 0xa3, + 0x32, 0x14, 0xbb, 0x3c, 0x5b, 0xab, 0xb2, 0x9b, 0x89, 0xa1, 0x74, 0xef, 0x5c, 0xe6, 0xc5, 0x58, + 0xc2, 0x25, 0xea, 0x5a, 0x6d, 0x99, 0xdd, 0x32, 0x64, 0x50, 0xd7, 0x6a, 0xcb, 0x58, 0xc2, 0x51, + 0xd8, 0xfe, 0x50, 0xda, 0x58, 0x91, 0x1b, 0x9f, 0x76, 0x4e, 0x5e, 0xf0, 0xad, 0xb4, 0xfb, 0x30, + 0xa1, 0x1e, 0x6b, 0xe3, 0x19, 0x3d, 0xe3, 0x99, 0xf1, 0x22, 0x0f, 0xe4, 0x77, 0x4c, 0x0c, 0xaa, + 0xec, 0x7a, 0x6b, 0x19, 0x9a, 0xb8, 0xad, 0x15, 0x23, 0x7b, 0xc4, 0x44, 0xee, 0x03, 0x05, 0x0b, + 0x50, 0x89, 0x5b, 0x77, 0xdc, 0x70, 0xdb, 0xf1, 0x02, 0x76, 0x15, 0xa0, 0x3f, 0xf7, 0x2e, 0x01, + 0x38, 0xc5, 0x41, 0x35, 0x18, 0x72, 0x84, 0x0a, 0x27, 0x4c, 0xf6, 0x39, 0xd1, 0xe5, 0x52, 0xe1, + 0xe3, 0xd6, 0x55, 0xf9, 0x0f, 0x2b, 0x2a, 0xe8, 0x55, 0x18, 0x15, 0xc1, 0x51, 0xc2, 0x89, 0x71, + 0xca, 0x74, 0xa4, 0xaf, 0xeb, 0x40, 0x6c, 0xe2, 0xa2, 0x4d, 0x18, 0xa3, 0x54, 0x52, 0x06, 0x38, + 0x33, 0xdd, 0x1b, 0x0f, 0xd5, 0x52, 0x41, 0xeb, 0x64, 0x70, 0x86, 0x2c, 0x72, 0xe1, 0x31, 0xa7, + 0x95, 0x84, 0xdb, 0x74, 0x27, 0x98, 0xfb, 0x64, 0x3d, 0xbc, 0x4b, 0x82, 0x99, 0x53, 0x6c, 0x05, + 0x9e, 0xdd, 0xdf, 0x9b, 0x7b, 0x6c, 0xf1, 0x10, 0x3c, 0x7c, 0x28, 0x15, 0xf4, 0x36, 0x0c, 0x27, + 0xa1, 0x2f, 0x7c, 0x93, 0xe3, 0x99, 0xd3, 0x45, 0x72, 0xda, 0xac, 0xab, 0x0a, 0xba, 0x19, 0x43, + 0x11, 0xc1, 0x3a, 0xc5, 0xd9, 0x4f, 0xc2, 0x64, 0x1b, 0x4b, 0xea, 0xc9, 0x7d, 0xf3, 0x3f, 0xf6, + 0x43, 0x45, 0x59, 0xf4, 0xd0, 0x82, 0x69, 0xbc, 0x7d, 0x34, 0x6b, 0xbc, 0x1d, 0xa2, 0x02, 0x94, + 0x6e, 0xaf, 0xfd, 0x5c, 0x87, 0xe7, 0xb9, 0x9f, 0xcd, 0xdd, 0x83, 0xc5, 0x23, 0xaa, 0x7a, 0x78, + 0xc4, 0x3c, 0xd5, 0xea, 0xfa, 0x0e, 0xd5, 0xea, 0x0a, 0x3e, 0x39, 0x47, 0xf5, 0xb7, 0x66, 0xe8, + 0xae, 0xd5, 0xb2, 0x2f, 0x2a, 0xd5, 0x68, 0x21, 0xe6, 0x30, 0x26, 0x77, 0xd3, 0x33, 0x95, 0xc9, + 0xdd, 0x83, 0x47, 0x94, 0xbb, 0x25, 0x01, 0x9c, 0xd2, 0x42, 0x3b, 0x30, 0xd9, 0x30, 0x1f, 0xc8, + 0x52, 0x71, 0x52, 0xcf, 0xf7, 0xf0, 0x40, 0x55, 0x4b, 0x7b, 0x3d, 0x63, 0x39, 0x4b, 0x0f, 0xb7, + 0x37, 0x81, 0x5e, 0x85, 0xa1, 0xf7, 0xc2, 0x98, 0x5d, 0x2b, 0x88, 0x83, 0x45, 0xc6, 0xa3, 0x0c, + 0xbd, 0x7e, 0xa3, 0xce, 0xca, 0x0f, 0xf6, 0xe6, 0x86, 0x6b, 0xa1, 0x2b, 0xff, 0x62, 0x55, 0x01, + 0x7d, 0xc9, 0x82, 0x53, 0xc6, 0x3e, 0x53, 0x3d, 0x87, 0xa3, 0xf4, 0xfc, 0x71, 0xd1, 0xf2, 0xa9, + 0xb5, 0x4e, 0x34, 0x71, 0xe7, 0xa6, 0xec, 0xdf, 0xe5, 0x26, 0x4c, 0x61, 0xd4, 0x20, 0x71, 0xcb, + 0x3f, 0x89, 0x4c, 0xf6, 0x37, 0x0c, 0x7b, 0xcb, 0x03, 0x30, 0xa2, 0xff, 0x7b, 0x8b, 0x19, 0xd1, + 0xd7, 0xc9, 0x76, 0xd3, 0x77, 0x92, 0x93, 0xf0, 0xee, 0xfd, 0x2c, 0x0c, 0x25, 0xa2, 0xb5, 0x62, + 0x69, 0xf8, 0xb5, 0xee, 0xb1, 0xcb, 0x05, 0x75, 0x30, 0xc9, 0x52, 0xac, 0x08, 0xda, 0xff, 0x9a, + 0x7f, 0x15, 0x09, 0x39, 0x01, 0x4b, 0xc1, 0x75, 0xd3, 0x52, 0xf0, 0x4c, 0xe1, 0xb1, 0x74, 0xb1, + 0x18, 0x7c, 0xdf, 0x1c, 0x01, 0xd3, 0x1f, 0x7e, 0x7a, 0x6e, 0x79, 0xec, 0x5f, 0xb1, 0x60, 0xba, + 0xd3, 0x75, 0x3b, 0x15, 0x30, 0xb8, 0xf6, 0xa2, 0xee, 0xbf, 0xd4, 0xac, 0xde, 0x12, 0xe5, 0x58, + 0x61, 0x14, 0xce, 0x8b, 0xdd, 0x5b, 0xea, 0xa6, 0x1b, 0x60, 0x3e, 0xb5, 0x86, 0x5e, 0xe3, 0xce, + 0xfc, 0x96, 0x7a, 0x0b, 0xad, 0x37, 0x47, 0x7e, 0xfb, 0x37, 0x4a, 0x30, 0xcd, 0x8d, 0xd0, 0x8b, + 0x3b, 0xa1, 0xe7, 0xd6, 0x42, 0x57, 0x84, 0x36, 0xb8, 0x30, 0xd2, 0xd4, 0x94, 0xcf, 0x62, 0xa9, + 0x60, 0x74, 0x75, 0x35, 0x15, 0xf8, 0xf5, 0x52, 0x6c, 0x50, 0xa5, 0xad, 0x90, 0x1d, 0xaf, 0xa1, + 0x6c, 0x9a, 0xa5, 0x9e, 0x4f, 0x06, 0xd5, 0xca, 0x8a, 0x46, 0x07, 0x1b, 0x54, 0x8f, 0xe1, 0x39, + 0x0b, 0xfb, 0x1f, 0x58, 0xf0, 0x48, 0x97, 0x74, 0x31, 0xb4, 0xb9, 0x7b, 0xcc, 0xf0, 0x2f, 0xde, + 0xf2, 0x53, 0xcd, 0xf1, 0xeb, 0x00, 0x2c, 0xa0, 0xe8, 0x0e, 0x00, 0x37, 0xe7, 0xb3, 0x97, 0xdd, + 0x4b, 0x45, 0xfc, 0x91, 0xda, 0x92, 0x32, 0x68, 0xf1, 0xfa, 0xea, 0x2d, 0x77, 0x8d, 0xaa, 0xfd, + 0xad, 0x32, 0xf4, 0xf3, 0x27, 0xa3, 0x6b, 0x30, 0xb8, 0xc5, 0xd3, 0xd7, 0xf6, 0x96, 0x3d, 0x37, + 0x55, 0x2e, 0x78, 0x01, 0x96, 0x64, 0xd0, 0x35, 0x98, 0xa2, 0x27, 0x8b, 0xe7, 0xf8, 0x55, 0xe2, + 0x3b, 0xbb, 0x52, 0x5b, 0xe5, 0x6f, 0x1c, 0xc8, 0x64, 0xdc, 0x53, 0x6b, 0xed, 0x28, 0xb8, 0x53, + 0x3d, 0xf4, 0x5a, 0x5b, 0xb6, 0x39, 0x9e, 0x16, 0x58, 0x49, 0xaa, 0x87, 0x67, 0x9c, 0xa3, 0xf2, + 0x74, 0xb3, 0x4d, 0x2f, 0xd7, 0x5e, 0xe6, 0x35, 0x75, 0x71, 0x13, 0x97, 0xf9, 0x16, 0xb4, 0x98, + 0x4f, 0xc5, 0xfa, 0x56, 0x44, 0xe2, 0xad, 0xd0, 0x77, 0xc5, 0xa3, 0x92, 0xa9, 0x6f, 0x41, 0x06, + 0x8e, 0xdb, 0x6a, 0x50, 0x2a, 0x1b, 0x8e, 0xe7, 0xb7, 0x22, 0x92, 0x52, 0x19, 0x30, 0xa9, 0xac, + 0x66, 0xe0, 0xb8, 0xad, 0x06, 0x5d, 0x5b, 0xa7, 0xc4, 0x3b, 0x84, 0x32, 0x38, 0x5a, 0xb0, 0xa0, + 0xcf, 0xc0, 0xa0, 0x74, 0x91, 0x2f, 0x94, 0xc3, 0x43, 0x38, 0x0e, 0xa8, 0x37, 0x0d, 0xb5, 0x37, + 0xaf, 0x84, 0x73, 0xbc, 0xa4, 0x77, 0x94, 0xf7, 0xee, 0xfe, 0xcc, 0x82, 0xa9, 0x0e, 0xae, 0x5e, + 0x9c, 0xa5, 0x6d, 0x7a, 0x71, 0xa2, 0x32, 0xee, 0x6b, 0x2c, 0x8d, 0x97, 0x63, 0x85, 0x41, 0x77, + 0x0b, 0x67, 0x9a, 0x59, 0x46, 0x29, 0x5c, 0x40, 0x04, 0xb4, 0x37, 0x46, 0x89, 0xce, 0x42, 0x5f, + 0x2b, 0x26, 0x91, 0x7c, 0x7c, 0x4e, 0xf2, 0x79, 0x66, 0x07, 0x64, 0x10, 0x2a, 0xb6, 0x6e, 0x2a, + 0x13, 0x9c, 0x26, 0xb6, 0x72, 0x23, 0x1c, 0x87, 0xd9, 0x5f, 0x2f, 0xc3, 0x78, 0xc6, 0xe5, 0x93, + 0x76, 0x64, 0x3b, 0x0c, 0xbc, 0x24, 0x54, 0x79, 0xd5, 0xf8, 0x7b, 0x57, 0xa4, 0xb9, 0x75, 0x4d, + 0x94, 0x63, 0x85, 0x81, 0x9e, 0x96, 0xef, 0x8d, 0x66, 0x5f, 0x12, 0x58, 0xaa, 0x1a, 0x4f, 0x8e, + 0x16, 0x7d, 0x05, 0xe4, 0x49, 0xe8, 0x6b, 0x86, 0xea, 0xf9, 0x68, 0xf5, 0x3d, 0xf1, 0x52, 0xb5, + 0x16, 0x86, 0x3e, 0x66, 0x40, 0xf4, 0x94, 0x18, 0x7d, 0xe6, 0xe6, 0x02, 0x3b, 0x6e, 0x18, 0x6b, + 0x53, 0xf0, 0x0c, 0x0c, 0xde, 0x25, 0xbb, 0x91, 0x17, 0x6c, 0x66, 0xef, 0x6d, 0xae, 0xf0, 0x62, + 0x2c, 0xe1, 0xe6, 0x4b, 0x1f, 0x83, 0xc7, 0xfc, 0xd2, 0xc7, 0x50, 0xee, 0x39, 0xf8, 0x1d, 0x0b, + 0xc6, 0x59, 0xb2, 0x51, 0x11, 0x9a, 0xef, 0x85, 0xc1, 0x09, 0xc8, 0x18, 0x4f, 0x42, 0x7f, 0x44, + 0x1b, 0xcd, 0xa6, 0xea, 0x67, 0x3d, 0xc1, 0x1c, 0x86, 0x1e, 0x83, 0x3e, 0xd6, 0x05, 0xfa, 0x19, + 0x47, 0x78, 0x4e, 0xf3, 0xaa, 0x93, 0x38, 0x98, 0x95, 0xb2, 0x28, 0x2b, 0x4c, 0x9a, 0xbe, 0xc7, + 0x3b, 0x9d, 0x9a, 0x5b, 0x1f, 0xb6, 0x28, 0xab, 0x8e, 0x9d, 0x7c, 0x50, 0x51, 0x56, 0x9d, 0x89, + 0x1f, 0x2e, 0xe7, 0xff, 0x8f, 0x12, 0x9c, 0xe9, 0x58, 0x2f, 0xbd, 0x01, 0x5e, 0x35, 0x6e, 0x80, + 0x2f, 0x64, 0x6e, 0x80, 0xed, 0xc3, 0x6b, 0x3f, 0x98, 0x3b, 0xe1, 0xce, 0x57, 0xb5, 0xe5, 0x13, + 0xbc, 0xaa, 0xed, 0x2b, 0x2a, 0xe2, 0xf4, 0xe7, 0x88, 0x38, 0x7f, 0x68, 0xc1, 0xa3, 0x1d, 0xa7, + 0xec, 0xa1, 0x0b, 0x6b, 0xeb, 0xd8, 0xcb, 0x2e, 0xda, 0xc9, 0x2f, 0x97, 0xbb, 0x8c, 0x8a, 0xe9, + 0x29, 0xe7, 0x28, 0x17, 0x62, 0xc0, 0x58, 0x08, 0x6f, 0x23, 0x9c, 0x03, 0xf1, 0x32, 0xac, 0xa0, + 0x28, 0xd6, 0xc2, 0xc2, 0x78, 0x27, 0x57, 0x8e, 0xb8, 0xa1, 0xe6, 0x4d, 0x3b, 0xb9, 0x9e, 0x6f, + 0x20, 0x1b, 0x2c, 0x76, 0x5b, 0xd3, 0x3c, 0xcb, 0x47, 0xd1, 0x3c, 0x47, 0x3a, 0x6b, 0x9d, 0x68, + 0x11, 0xc6, 0xb7, 0xbd, 0x80, 0x3d, 0x10, 0x6a, 0x4a, 0x4f, 0x2a, 0x36, 0xf7, 0x9a, 0x09, 0xc6, + 0x59, 0xfc, 0xd9, 0x57, 0x61, 0xf4, 0xe8, 0xd6, 0xb5, 0x1f, 0x97, 0xe1, 0x83, 0x87, 0x30, 0x05, + 0x7e, 0x3a, 0x18, 0xdf, 0x45, 0x3b, 0x1d, 0xda, 0xbe, 0x4d, 0x0d, 0xa6, 0x37, 0x5a, 0xbe, 0xbf, + 0xcb, 0xfc, 0xa7, 0x88, 0x2b, 0x31, 0x84, 0x50, 0xa3, 0x5e, 0x22, 0x5f, 0xed, 0x80, 0x83, 0x3b, + 0xd6, 0x44, 0x9f, 0x06, 0x14, 0xde, 0x61, 0xe9, 0x78, 0xdd, 0x34, 0x9f, 0x02, 0xfb, 0x04, 0xe5, + 0x74, 0xab, 0xde, 0x68, 0xc3, 0xc0, 0x1d, 0x6a, 0x51, 0x39, 0x95, 0x3d, 0x62, 0xae, 0xba, 0x95, + 0x91, 0x53, 0xb1, 0x0e, 0xc4, 0x26, 0x2e, 0xba, 0x04, 0x93, 0xce, 0x8e, 0xe3, 0xf1, 0xf4, 0x5a, + 0x92, 0x00, 0x17, 0x54, 0x95, 0xfd, 0x6a, 0x31, 0x8b, 0x80, 0xdb, 0xeb, 0xa0, 0xa6, 0x61, 0x90, + 0xe4, 0x89, 0xf8, 0x3f, 0x71, 0x84, 0x15, 0x5c, 0xd8, 0x44, 0x69, 0xff, 0x57, 0x8b, 0x1e, 0x7d, + 0x1d, 0xde, 0x92, 0xa4, 0x33, 0xa2, 0x0c, 0x6c, 0x5a, 0x98, 0x9b, 0x9a, 0x91, 0x65, 0x1d, 0x88, + 0x4d, 0x5c, 0xbe, 0x34, 0xe2, 0xd4, 0x9d, 0xdb, 0x90, 0x36, 0x45, 0x84, 0xa8, 0xc2, 0xa0, 0x12, + 0xb4, 0xeb, 0xed, 0x78, 0x71, 0x18, 0x89, 0x0d, 0xd4, 0xa3, 0x73, 0x6f, 0xca, 0x2f, 0xab, 0x9c, + 0x0c, 0x96, 0xf4, 0xec, 0x6f, 0x94, 0x60, 0x54, 0xb6, 0xf8, 0x7a, 0x2b, 0x4c, 0x9c, 0x13, 0x38, + 0xd2, 0x5f, 0x37, 0x8e, 0xf4, 0x85, 0x62, 0x01, 0xb3, 0xac, 0x73, 0x5d, 0x8f, 0xf2, 0xcf, 0x64, + 0x8e, 0xf2, 0x17, 0x7a, 0x21, 0x7a, 0xf8, 0x11, 0xfe, 0x6f, 0x2d, 0x98, 0x34, 0xf0, 0x4f, 0xe0, + 0x24, 0xa9, 0x99, 0x27, 0xc9, 0x73, 0x3d, 0x8c, 0xa6, 0xcb, 0x09, 0xf2, 0xed, 0x52, 0x66, 0x14, + 0xec, 0xe4, 0xf8, 0x02, 0xf4, 0x6d, 0x39, 0x91, 0x5b, 0x2c, 0xd7, 0x64, 0x5b, 0xf5, 0xf9, 0xcb, + 0x4e, 0xe4, 0x72, 0xfe, 0x7f, 0x5e, 0xbd, 0x74, 0xe5, 0x44, 0x6e, 0x6e, 0x94, 0x03, 0x6b, 0x14, + 0x5d, 0x84, 0x81, 0xb8, 0x11, 0x36, 0x95, 0x1f, 0xe8, 0x59, 0xfe, 0x0a, 0x16, 0x2d, 0x39, 0xd8, + 0x9b, 0x43, 0x66, 0x73, 0xb4, 0x18, 0x0b, 0xfc, 0xd9, 0x4d, 0xa8, 0xa8, 0xa6, 0x8f, 0xd5, 0x13, + 0xfe, 0xbf, 0x95, 0x61, 0xaa, 0xc3, 0x5a, 0x41, 0x5f, 0x34, 0xe6, 0xed, 0xd5, 0x9e, 0x17, 0xdb, + 0xfb, 0x9c, 0xb9, 0x2f, 0x32, 0x4d, 0xc9, 0x15, 0xab, 0xe3, 0x08, 0xcd, 0xdf, 0x8c, 0x49, 0xb6, + 0x79, 0x5a, 0x94, 0xdf, 0x3c, 0x6d, 0xf6, 0xc4, 0xa6, 0x9f, 0x36, 0xa4, 0x7a, 0x7a, 0xac, 0xdf, + 0xf9, 0xaf, 0xf5, 0xc1, 0x74, 0xa7, 0xc8, 0x7c, 0xf4, 0x15, 0x2b, 0xf3, 0xa0, 0xc4, 0x6b, 0xbd, + 0x87, 0xf7, 0xf3, 0x57, 0x26, 0x44, 0x36, 0x9b, 0x79, 0xf3, 0x89, 0x89, 0xdc, 0x19, 0x17, 0xad, + 0xb3, 0xf8, 0xa4, 0x88, 0x3f, 0x0e, 0x22, 0xb9, 0xc2, 0xa7, 0x8e, 0xd0, 0x15, 0xf1, 0xbe, 0x48, + 0x9c, 0x89, 0x4f, 0x92, 0xc5, 0xf9, 0xf1, 0x49, 0xb2, 0x0f, 0xb3, 0x1e, 0x0c, 0x6b, 0xe3, 0x3a, + 0xd6, 0x65, 0x70, 0x97, 0x1e, 0x51, 0x5a, 0xbf, 0x8f, 0x75, 0x29, 0xfc, 0x5d, 0x0b, 0x32, 0x4e, + 0x5b, 0xca, 0x2c, 0x63, 0x75, 0x35, 0xcb, 0x9c, 0x85, 0xbe, 0x28, 0xf4, 0x49, 0xf6, 0xb1, 0x03, + 0x1c, 0xfa, 0x04, 0x33, 0x88, 0x7a, 0xfc, 0xb6, 0xdc, 0xed, 0xf1, 0x5b, 0xaa, 0xa7, 0xfb, 0x64, + 0x87, 0x48, 0x23, 0x89, 0x62, 0xe3, 0x57, 0x69, 0x21, 0xe6, 0x30, 0xfb, 0xb7, 0xfa, 0x60, 0xaa, + 0x43, 0xb4, 0x1b, 0xd5, 0x90, 0x36, 0x9d, 0x84, 0xdc, 0x73, 0x76, 0xb3, 0x49, 0x57, 0x2f, 0xf1, + 0x62, 0x2c, 0xe1, 0xcc, 0xd9, 0x94, 0x27, 0x6e, 0xcb, 0x98, 0xae, 0x44, 0xbe, 0x36, 0x01, 0x3d, + 0xfe, 0x67, 0x52, 0x2f, 0x00, 0xc4, 0xb1, 0xbf, 0x12, 0x50, 0x09, 0xcf, 0x15, 0x4e, 0xad, 0x69, + 0xbe, 0xbf, 0xfa, 0x55, 0x01, 0xc1, 0x1a, 0x16, 0xaa, 0xc2, 0x44, 0x33, 0x0a, 0x13, 0x6e, 0x18, + 0xac, 0x72, 0x47, 0x88, 0x7e, 0x33, 0x9a, 0xaa, 0x96, 0x81, 0xe3, 0xb6, 0x1a, 0xe8, 0x65, 0x18, + 0x16, 0x11, 0x56, 0xb5, 0x30, 0xf4, 0x85, 0x19, 0x49, 0x5d, 0xc7, 0xd7, 0x53, 0x10, 0xd6, 0xf1, + 0xb4, 0x6a, 0xcc, 0xda, 0x38, 0xd8, 0xb1, 0x1a, 0xb7, 0x38, 0x6a, 0x78, 0x99, 0xfc, 0x1d, 0x43, + 0x85, 0xf2, 0x77, 0xa4, 0x86, 0xb5, 0x4a, 0xe1, 0x8b, 0x18, 0xc8, 0x35, 0x40, 0xfd, 0x41, 0x19, + 0x06, 0xf8, 0xa7, 0x38, 0x01, 0x29, 0xaf, 0x26, 0x4c, 0x4a, 0x85, 0x72, 0x25, 0xf0, 0x5e, 0xcd, + 0x57, 0x9d, 0xc4, 0xe1, 0xac, 0x49, 0xed, 0x90, 0xd4, 0x0c, 0x85, 0xe6, 0x8d, 0x3d, 0x34, 0x9b, + 0xb1, 0x94, 0x00, 0xa7, 0xa1, 0xed, 0xa8, 0x2d, 0x80, 0x98, 0x3d, 0xd5, 0x49, 0x69, 0x88, 0x8c, + 0xb0, 0x2f, 0x15, 0xea, 0x47, 0x5d, 0x55, 0xe3, 0xbd, 0x49, 0x97, 0xa5, 0x02, 0x60, 0x8d, 0xf6, + 0xec, 0x2b, 0x50, 0x51, 0xc8, 0x79, 0x2a, 0xe4, 0x88, 0xce, 0xda, 0xfe, 0x3f, 0x18, 0xcf, 0xb4, + 0xd5, 0x93, 0x06, 0xfa, 0x3b, 0x16, 0x8c, 0xf3, 0x2e, 0xaf, 0x04, 0x3b, 0x82, 0x15, 0x7c, 0xd9, + 0x82, 0x69, 0xbf, 0xc3, 0x4e, 0x14, 0x9f, 0xf9, 0x28, 0x7b, 0x58, 0x29, 0x9f, 0x9d, 0xa0, 0xb8, + 0x63, 0x6b, 0xe8, 0x1c, 0x0c, 0xf1, 0x97, 0x87, 0x1d, 0x5f, 0x78, 0x50, 0x8f, 0xf0, 0x5c, 0xd8, + 0xbc, 0x0c, 0x2b, 0xa8, 0xfd, 0x13, 0x0b, 0x26, 0xdb, 0x1e, 0xb2, 0x7f, 0x58, 0x86, 0x21, 0xb2, + 0x7e, 0x97, 0xba, 0x64, 0xfd, 0xd6, 0x47, 0x59, 0x3e, 0x74, 0x94, 0xbf, 0x61, 0x81, 0x58, 0xa1, + 0x27, 0xa0, 0x3f, 0xac, 0x99, 0xfa, 0xc3, 0x87, 0x8a, 0x2c, 0xfa, 0x2e, 0x8a, 0xc3, 0x2f, 0x95, + 0x60, 0x82, 0x23, 0xa4, 0x37, 0x32, 0x0f, 0xcb, 0xc7, 0xe9, 0xed, 0x35, 0x1a, 0xf5, 0x04, 0x68, + 0xe7, 0x91, 0x1a, 0xdf, 0xb2, 0xef, 0xd0, 0x6f, 0xf9, 0x17, 0x16, 0x20, 0x3e, 0x27, 0xd9, 0x67, + 0x9b, 0xf9, 0xe9, 0xa6, 0x99, 0x03, 0x52, 0xce, 0xa1, 0x20, 0x58, 0xc3, 0x7a, 0xc0, 0x43, 0xc8, + 0xdc, 0x87, 0x95, 0xf3, 0xef, 0xc3, 0x7a, 0x18, 0xf5, 0xef, 0x96, 0x21, 0xeb, 0x4a, 0x89, 0xde, + 0x81, 0x91, 0x86, 0xd3, 0x74, 0xee, 0x78, 0xbe, 0x97, 0x78, 0x24, 0x2e, 0x76, 0xe1, 0xbe, 0xac, + 0xd5, 0x10, 0xd7, 0x50, 0x5a, 0x09, 0x36, 0x28, 0xa2, 0x79, 0x80, 0x66, 0xe4, 0xed, 0x78, 0x3e, + 0xd9, 0x64, 0x1a, 0x0f, 0x8b, 0xc5, 0xe0, 0x77, 0xc7, 0xb2, 0x14, 0x6b, 0x18, 0x1d, 0x7c, 0xf7, + 0xcb, 0x27, 0xe1, 0xbb, 0xdf, 0xd7, 0xa3, 0xef, 0x7e, 0x7f, 0x21, 0xdf, 0x7d, 0x0c, 0xa7, 0xe5, + 0xe1, 0x4d, 0xff, 0xaf, 0x7a, 0x3e, 0x11, 0xb2, 0x1b, 0x8f, 0xd5, 0x98, 0xdd, 0xdf, 0x9b, 0x3b, + 0x8d, 0x3b, 0x62, 0xe0, 0x2e, 0x35, 0xed, 0x16, 0x4c, 0xd5, 0x49, 0xe4, 0xb1, 0x9c, 0x94, 0x6e, + 0xba, 0x97, 0x3e, 0x07, 0x95, 0x28, 0xb3, 0x8d, 0x7b, 0x0c, 0xc8, 0xd7, 0xb2, 0x98, 0xc9, 0x6d, + 0x9b, 0x92, 0xb4, 0xff, 0x46, 0x09, 0x06, 0x85, 0x13, 0xe5, 0x09, 0x08, 0x1f, 0x57, 0x0c, 0x13, + 0xd3, 0x33, 0x79, 0xfc, 0x8f, 0x75, 0xab, 0xab, 0x71, 0xa9, 0x9e, 0x31, 0x2e, 0x3d, 0x57, 0x8c, + 0xdc, 0xe1, 0x66, 0xa5, 0x7f, 0x5a, 0x86, 0x31, 0xd3, 0xa9, 0xf4, 0x04, 0xa6, 0xe5, 0x0d, 0x18, + 0x8c, 0x85, 0x7f, 0x73, 0xa9, 0x88, 0xcf, 0x5e, 0xf6, 0x13, 0xa7, 0x37, 0xf1, 0xc2, 0xa3, 0x59, + 0x92, 0xeb, 0xe8, 0x42, 0x5d, 0x3e, 0x11, 0x17, 0xea, 0x3c, 0x5f, 0xdf, 0xbe, 0x07, 0xe1, 0xeb, + 0x6b, 0xff, 0x80, 0xb1, 0x7c, 0xbd, 0xfc, 0x04, 0x8e, 0xf1, 0xd7, 0xcd, 0xc3, 0xe1, 0x7c, 0xa1, + 0x75, 0x27, 0xba, 0xd7, 0xe5, 0x38, 0xff, 0xae, 0x05, 0xc3, 0x02, 0xf1, 0x04, 0x06, 0xf0, 0x69, + 0x73, 0x00, 0x4f, 0x15, 0x1a, 0x40, 0x97, 0x9e, 0x7f, 0xa3, 0xa4, 0x7a, 0x5e, 0x13, 0x4f, 0xed, + 0xe7, 0x66, 0xe0, 0x1e, 0xa2, 0xaa, 0x5f, 0xd8, 0x08, 0x7d, 0x21, 0xc0, 0x3d, 0x96, 0x86, 0xe6, + 0xf1, 0xf2, 0x03, 0xed, 0x37, 0x56, 0xd8, 0x2c, 0x72, 0x2c, 0x8c, 0x12, 0x71, 0x80, 0x76, 0x7a, + 0xe8, 0xdf, 0x05, 0x48, 0x5f, 0x57, 0x17, 0x51, 0xad, 0xdd, 0x77, 0x6b, 0x2b, 0xf1, 0xfc, 0x79, + 0x2f, 0x48, 0xe2, 0x24, 0x9a, 0x5f, 0x0b, 0x92, 0x1b, 0x11, 0x17, 0xfa, 0xb5, 0x58, 0x3b, 0x45, + 0x0b, 0x6b, 0x74, 0x65, 0x10, 0x07, 0x6b, 0xa3, 0xdf, 0xbc, 0x41, 0xba, 0x2e, 0xca, 0xb1, 0xc2, + 0xb0, 0x5f, 0x61, 0x9c, 0x9d, 0x4d, 0x50, 0x6f, 0x61, 0x70, 0xbf, 0x38, 0xa0, 0xa6, 0x96, 0x99, + 0x85, 0xaf, 0xeb, 0xc1, 0x76, 0x45, 0xd9, 0x27, 0xed, 0x82, 0xee, 0x47, 0x9d, 0xc6, 0xe6, 0x21, + 0xd2, 0x76, 0xed, 0xf8, 0x4a, 0x61, 0x8e, 0xdc, 0xc3, 0x45, 0x23, 0x4b, 0x3a, 0xc8, 0x32, 0xad, + 0xad, 0xd5, 0xb2, 0x79, 0xd3, 0x97, 0x25, 0x00, 0xa7, 0x38, 0x68, 0x41, 0x28, 0x94, 0xdc, 0xe2, + 0xf2, 0xc1, 0x8c, 0x42, 0x29, 0xa7, 0x44, 0xd3, 0x28, 0x5f, 0x80, 0x61, 0xf5, 0x14, 0x4d, 0x8d, + 0x3f, 0x02, 0x52, 0xe1, 0xf2, 0xd5, 0x4a, 0x5a, 0x8c, 0x75, 0x1c, 0xb4, 0x06, 0x53, 0xae, 0x8a, + 0xd9, 0xa9, 0xb5, 0xee, 0xf8, 0x5e, 0x83, 0x56, 0xe5, 0xf1, 0xb6, 0x8f, 0xec, 0xef, 0xcd, 0x4d, + 0x55, 0xdb, 0xc1, 0xb8, 0x53, 0x1d, 0xb4, 0x0e, 0xe3, 0x31, 0x7f, 0x72, 0x47, 0x06, 0x66, 0x08, + 0x1b, 0xc4, 0xb3, 0xf2, 0xbe, 0xb3, 0x6e, 0x82, 0x0f, 0x58, 0x11, 0xe7, 0x0a, 0x32, 0x94, 0x23, + 0x4b, 0x02, 0xbd, 0x06, 0x63, 0xbe, 0xfe, 0x9e, 0x68, 0x4d, 0x98, 0x28, 0x94, 0x07, 0x9b, 0xf1, + 0xda, 0x68, 0x0d, 0x67, 0xb0, 0xd1, 0x1b, 0x30, 0xa3, 0x97, 0x88, 0x3c, 0x42, 0x4e, 0xb0, 0x49, + 0x62, 0xf1, 0x3c, 0xc7, 0x63, 0xfb, 0x7b, 0x73, 0x33, 0x57, 0xbb, 0xe0, 0xe0, 0xae, 0xb5, 0xd1, + 0x45, 0x18, 0x91, 0x33, 0xa9, 0x85, 0x31, 0xa5, 0xbe, 0x93, 0x1a, 0x0c, 0x1b, 0x98, 0xef, 0xef, + 0x5a, 0xf7, 0x0b, 0xb4, 0xb2, 0x76, 0x84, 0xa3, 0x77, 0x61, 0x44, 0xef, 0x63, 0xf6, 0x6c, 0xce, + 0x7f, 0xa3, 0x55, 0x88, 0x02, 0xaa, 0xe7, 0x3a, 0x0c, 0x1b, 0xb4, 0xed, 0x1b, 0x30, 0x50, 0xdf, + 0x8d, 0x1b, 0x89, 0x5f, 0x80, 0xbf, 0x3d, 0x69, 0x0c, 0x21, 0xdd, 0x7b, 0xec, 0xbd, 0x28, 0x31, + 0x22, 0x9b, 0xc0, 0xf8, 0xfa, 0x72, 0xad, 0x1e, 0x36, 0xee, 0x92, 0x64, 0x91, 0x6b, 0x6f, 0x58, + 0x70, 0x37, 0xeb, 0x88, 0x5c, 0xab, 0x03, 0x3f, 0xb4, 0xff, 0xd4, 0x82, 0x7e, 0xf6, 0xd6, 0x51, + 0xde, 0x3b, 0x59, 0x45, 0x3a, 0x8d, 0x5e, 0x86, 0x01, 0xb2, 0xb1, 0x41, 0x1a, 0x89, 0xd8, 0xc6, + 0x32, 0x56, 0x60, 0x60, 0x85, 0x95, 0xd2, 0xcd, 0xc9, 0x1a, 0xe3, 0x7f, 0xb1, 0x40, 0x46, 0x9f, + 0x85, 0x4a, 0xe2, 0x6d, 0x93, 0x45, 0xd7, 0x15, 0x06, 0xc5, 0xde, 0xdc, 0x57, 0x14, 0xb3, 0x58, + 0x97, 0x44, 0x70, 0x4a, 0xcf, 0xfe, 0x5a, 0x09, 0x20, 0x8d, 0xd4, 0xc9, 0x1b, 0xe6, 0x52, 0xdb, + 0x73, 0x60, 0x4f, 0x77, 0x78, 0x0e, 0x0c, 0xa5, 0x04, 0x3b, 0x3c, 0x06, 0xa6, 0xa6, 0xaa, 0x5c, + 0x68, 0xaa, 0xfa, 0x7a, 0x99, 0xaa, 0x65, 0x98, 0x4c, 0x23, 0x8d, 0xcc, 0x90, 0x4d, 0x96, 0x1c, + 0x74, 0x3d, 0x0b, 0xc4, 0xed, 0xf8, 0xf6, 0xd7, 0x2c, 0x10, 0x0e, 0x8f, 0x05, 0x56, 0xab, 0x2b, + 0x9f, 0xee, 0x31, 0xb2, 0x98, 0x3d, 0x5b, 0xc4, 0x17, 0x54, 0xe4, 0x2e, 0x53, 0xfb, 0xc7, 0xc8, + 0x58, 0x66, 0x50, 0xb5, 0x7f, 0xd3, 0x82, 0x61, 0x0e, 0xbe, 0xc6, 0x64, 0xea, 0xfc, 0x7e, 0xf5, + 0x94, 0x79, 0x96, 0xbd, 0x6a, 0x43, 0x09, 0xab, 0x0c, 0xa4, 0xfa, 0xab, 0x36, 0x12, 0x80, 0x53, + 0x1c, 0xf4, 0x0c, 0x0c, 0xc6, 0xad, 0x3b, 0x0c, 0x3d, 0xe3, 0xfd, 0x58, 0xe7, 0xc5, 0x58, 0xc2, + 0xed, 0x7f, 0x5e, 0x82, 0x89, 0xac, 0xf3, 0x2b, 0xc2, 0x30, 0xc0, 0x65, 0xec, 0xac, 0x78, 0x76, + 0x98, 0x2d, 0x47, 0x73, 0x9e, 0x05, 0xfe, 0x36, 0x33, 0x33, 0xba, 0x0b, 0x4a, 0x68, 0x03, 0x86, + 0xdd, 0xf0, 0x5e, 0x70, 0xcf, 0x89, 0xdc, 0xc5, 0xda, 0x9a, 0xf8, 0x12, 0x39, 0xee, 0x4a, 0xd5, + 0xb4, 0x82, 0xee, 0x9a, 0xcb, 0x6c, 0x0b, 0x29, 0x08, 0xeb, 0x84, 0xa9, 0x4e, 0xd9, 0x08, 0x83, + 0x0d, 0x6f, 0xf3, 0x9a, 0xd3, 0x2c, 0x76, 0x31, 0xbf, 0x2c, 0xd1, 0xb5, 0x36, 0x46, 0x45, 0x8e, + 0x06, 0x0e, 0xc0, 0x29, 0x49, 0xfb, 0xd7, 0xa7, 0xc1, 0x58, 0x0b, 0x46, 0x7a, 0x58, 0xeb, 0x81, + 0xa7, 0x87, 0x7d, 0x0b, 0x86, 0xc8, 0x76, 0x33, 0xd9, 0xad, 0x7a, 0x51, 0xb1, 0x64, 0xdf, 0x2b, + 0x02, 0xbb, 0x9d, 0xba, 0x84, 0x60, 0x45, 0xb1, 0x4b, 0xb2, 0xdf, 0xf2, 0x43, 0x91, 0xec, 0xb7, + 0xef, 0x2f, 0x25, 0xd9, 0xef, 0x1b, 0x30, 0xb8, 0xe9, 0x25, 0x98, 0x34, 0x43, 0x91, 0xf4, 0x22, + 0x67, 0xf1, 0x5c, 0xe2, 0xc8, 0xed, 0x69, 0x20, 0x05, 0x00, 0x4b, 0x72, 0x68, 0x5d, 0x6d, 0xaa, + 0x81, 0x22, 0x67, 0x79, 0xbb, 0xad, 0xaf, 0xe3, 0xb6, 0x12, 0xc9, 0x7d, 0x07, 0xdf, 0x7f, 0x72, + 0x5f, 0x95, 0x92, 0x77, 0xe8, 0x41, 0xa5, 0xe4, 0x35, 0x52, 0x1b, 0x57, 0x8e, 0x23, 0xb5, 0xf1, + 0xd7, 0x2c, 0x38, 0xd5, 0xec, 0x94, 0x18, 0x5c, 0x24, 0xd7, 0xfd, 0xe4, 0x11, 0x52, 0xa5, 0x1b, + 0x4d, 0xb3, 0x54, 0x02, 0x1d, 0xd1, 0x70, 0xe7, 0x86, 0x65, 0x8e, 0xe4, 0xe1, 0xf7, 0x9f, 0x23, + 0xf9, 0xb8, 0xb3, 0xf0, 0xa6, 0x19, 0x93, 0x47, 0x8f, 0x25, 0x63, 0xf2, 0xd8, 0x03, 0xcc, 0x98, + 0xac, 0xe5, 0x3a, 0x1e, 0x7f, 0xb0, 0xb9, 0x8e, 0xb7, 0xcc, 0x73, 0x89, 0xa7, 0xd6, 0x7d, 0xb9, + 0xf0, 0xb9, 0x64, 0xb4, 0x70, 0xf8, 0xc9, 0xc4, 0xb3, 0x3e, 0x4f, 0xbe, 0xcf, 0xac, 0xcf, 0x46, + 0xee, 0x64, 0x74, 0x1c, 0xb9, 0x93, 0xdf, 0xd1, 0x4f, 0xd0, 0xa9, 0x22, 0x2d, 0xa8, 0x83, 0xb2, + 0xbd, 0x85, 0x4e, 0x67, 0x68, 0x7b, 0x76, 0xe6, 0xe9, 0x93, 0xce, 0xce, 0x7c, 0xea, 0x18, 0xb3, + 0x33, 0x9f, 0x3e, 0xd1, 0xec, 0xcc, 0x8f, 0x3c, 0x24, 0xd9, 0x99, 0x67, 0x4e, 0x2a, 0x3b, 0xf3, + 0xa3, 0x0f, 0x34, 0x3b, 0x33, 0xfd, 0x74, 0x4d, 0x19, 0x42, 0x36, 0x33, 0x5b, 0xe4, 0xd3, 0x75, + 0x8c, 0x38, 0xe3, 0x9f, 0x4e, 0x81, 0x70, 0x4a, 0xd4, 0xfe, 0x2b, 0x70, 0xe6, 0xf0, 0xa5, 0x9b, + 0x7a, 0x6b, 0xd4, 0x52, 0x9b, 0x59, 0xc6, 0x5b, 0x83, 0x89, 0x85, 0x1a, 0x56, 0xe1, 0xf4, 0xb1, + 0xdf, 0xb6, 0xe0, 0x91, 0x2e, 0xd9, 0x15, 0x0b, 0xc7, 0x5f, 0x36, 0x61, 0xbc, 0x69, 0x56, 0x2d, + 0x1c, 0xce, 0x6d, 0x64, 0x73, 0x54, 0x3e, 0xf2, 0x19, 0x00, 0xce, 0x92, 0x5f, 0xfa, 0xd0, 0x0f, + 0x7f, 0x7c, 0xe6, 0x03, 0x3f, 0xfa, 0xf1, 0x99, 0x0f, 0xfc, 0xf1, 0x8f, 0xcf, 0x7c, 0xe0, 0xe7, + 0xf6, 0xcf, 0x58, 0x3f, 0xdc, 0x3f, 0x63, 0xfd, 0x68, 0xff, 0x8c, 0xf5, 0x67, 0xfb, 0x67, 0xac, + 0xaf, 0xfd, 0xe4, 0xcc, 0x07, 0xde, 0x2c, 0xed, 0xbc, 0xf0, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, + 0x5f, 0x32, 0x87, 0xa4, 0xbe, 0xc8, 0x00, 0x00, } diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto b/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto index cc52ea4c9c4..6fa50557c88 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto +++ b/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto @@ -2140,6 +2140,10 @@ message PersistentVolumeSource { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional optional PortworxVolumeSource portworxVolume = 18; + + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + optional ScaleIOVolumeSource scaleIO = 19; } // PersistentVolumeSpec is the specification of a persistent volume. @@ -3210,6 +3214,50 @@ message SELinuxOptions { optional string level = 4; } +// ScaleIOVolumeSource represents a persistent ScaleIO volume +message ScaleIOVolumeSource { + // The host address of the ScaleIO API Gateway. + optional string gateway = 1; + + // The name of the storage system as configured in ScaleIO. + optional string system = 2; + + // SecretRef references to the secret for ScaleIO user and other + // sensitive information. If this is not provided, Login operation will fail. + optional LocalObjectReference secretRef = 3; + + // Flag to enable/disable SSL communication with Gateway, default false + // +optional + optional bool sslEnabled = 4; + + // The name of the Protection Domain for the configured storage (defaults to "default"). + // +optional + optional string protectionDomain = 5; + + // The Storage Pool associated with the protection domain (defaults to "default"). + // +optional + optional string storagePool = 6; + + // Indicates whether the storage for a volume should be thick or thin (defaults to "thin"). + // +optional + optional string storageMode = 7; + + // The name of a volume already created in the ScaleIO system + // that is associated with this volume source. + optional string volumeName = 8; + + // Filesystem type to mount. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // +optional + optional string fsType = 9; + + // Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + optional bool readOnly = 10; +} + // Secret holds secret data of a certain type. The total bytes of the values in // the Data field must be less than MaxSecretSize bytes. message Secret { @@ -3840,11 +3888,15 @@ message VolumeSource { optional PhotonPersistentDiskVolumeSource photonPersistentDisk = 23; // Items for all in one resources secrets, configmaps, and downward API - optional ProjectedVolumeSource projected = 25; + optional ProjectedVolumeSource projected = 26; // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional optional PortworxVolumeSource portworxVolume = 24; + + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + optional ScaleIOVolumeSource scaleIO = 25; } // Represents a vSphere volume resource. diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go b/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go index 6fbb85a603e..8eefc7c906c 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go @@ -1222,7 +1222,7 @@ func (x *Volume) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [26]bool + var yyq2 [27]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[1] = x.VolumeSource.HostPath != nil && x.HostPath != nil @@ -1250,9 +1250,10 @@ func (x *Volume) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[23] = x.VolumeSource.PhotonPersistentDisk != nil && x.PhotonPersistentDisk != nil yyq2[24] = x.VolumeSource.Projected != nil && x.Projected != nil yyq2[25] = x.VolumeSource.PortworxVolume != nil && x.PortworxVolume != nil + yyq2[26] = x.VolumeSource.ScaleIO != nil && x.ScaleIO != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(26) + r.EncodeArrayStart(27) } else { yynn2 = 1 for _, b := range yyq2 { @@ -2207,6 +2208,43 @@ func (x *Volume) CodecEncodeSelf(e *codec1978.Encoder) { } } } + var yyn81 bool + if x.VolumeSource.ScaleIO == nil { + yyn81 = true + goto LABEL81 + } + LABEL81: + if yyr2 || yy2arr2 { + if yyn81 { + r.EncodeNil() + } else { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[26] { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } + } else { + if yyq2[26] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("scaleIO")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if yyn81 { + r.EncodeNil() + } else { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -2630,6 +2668,20 @@ func (x *Volume) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } x.PortworxVolume.CodecDecodeSelf(d) } + case "scaleIO": + if x.VolumeSource.ScaleIO == nil { + x.VolumeSource.ScaleIO = new(ScaleIOVolumeSource) + } + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -2641,16 +2693,16 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj31 int - var yyb31 bool - var yyhl31 bool = l >= 0 - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + var yyj32 int + var yyb32 bool + var yyhl32 bool = l >= 0 + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2658,24 +2710,24 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Name = "" } else { - yyv32 := &x.Name - yym33 := z.DecBinary() - _ = yym33 + yyv33 := &x.Name + yym34 := z.DecBinary() + _ = yym34 if false { } else { - *((*string)(yyv32)) = r.DecodeString() + *((*string)(yyv33)) = r.DecodeString() } } if x.VolumeSource.HostPath == nil { x.VolumeSource.HostPath = new(HostPathVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2693,13 +2745,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.EmptyDir == nil { x.VolumeSource.EmptyDir = new(EmptyDirVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2717,13 +2769,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.GCEPersistentDisk == nil { x.VolumeSource.GCEPersistentDisk = new(GCEPersistentDiskVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2741,13 +2793,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.AWSElasticBlockStore == nil { x.VolumeSource.AWSElasticBlockStore = new(AWSElasticBlockStoreVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2765,13 +2817,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.GitRepo == nil { x.VolumeSource.GitRepo = new(GitRepoVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2789,13 +2841,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Secret == nil { x.VolumeSource.Secret = new(SecretVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2813,13 +2865,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.NFS == nil { x.VolumeSource.NFS = new(NFSVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2837,13 +2889,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.ISCSI == nil { x.VolumeSource.ISCSI = new(ISCSIVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2861,13 +2913,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Glusterfs == nil { x.VolumeSource.Glusterfs = new(GlusterfsVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2885,13 +2937,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.PersistentVolumeClaim == nil { x.VolumeSource.PersistentVolumeClaim = new(PersistentVolumeClaimVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2909,13 +2961,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.RBD == nil { x.VolumeSource.RBD = new(RBDVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2933,13 +2985,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.FlexVolume == nil { x.VolumeSource.FlexVolume = new(FlexVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2957,13 +3009,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Cinder == nil { x.VolumeSource.Cinder = new(CinderVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2981,13 +3033,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.CephFS == nil { x.VolumeSource.CephFS = new(CephFSVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3005,13 +3057,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Flocker == nil { x.VolumeSource.Flocker = new(FlockerVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3029,13 +3081,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.DownwardAPI == nil { x.VolumeSource.DownwardAPI = new(DownwardAPIVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3053,13 +3105,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.FC == nil { x.VolumeSource.FC = new(FCVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3077,13 +3129,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.AzureFile == nil { x.VolumeSource.AzureFile = new(AzureFileVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3101,13 +3153,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.ConfigMap == nil { x.VolumeSource.ConfigMap = new(ConfigMapVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3125,13 +3177,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.VsphereVolume == nil { x.VolumeSource.VsphereVolume = new(VsphereVirtualDiskVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3149,13 +3201,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Quobyte == nil { x.VolumeSource.Quobyte = new(QuobyteVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3173,13 +3225,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.AzureDisk == nil { x.VolumeSource.AzureDisk = new(AzureDiskVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3197,13 +3249,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.PhotonPersistentDisk == nil { x.VolumeSource.PhotonPersistentDisk = new(PhotonPersistentDiskVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3221,13 +3273,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Projected == nil { x.VolumeSource.Projected = new(ProjectedVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3245,13 +3297,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.PortworxVolume == nil { x.VolumeSource.PortworxVolume = new(PortworxVolumeSource) } - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l } else { - yyb31 = r.CheckBreak() + yyb32 = r.CheckBreak() } - if yyb31 { + if yyb32 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3266,18 +3318,42 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PortworxVolume.CodecDecodeSelf(d) } - for { - yyj31++ - if yyhl31 { - yyb31 = yyj31 > l - } else { - yyb31 = r.CheckBreak() + if x.VolumeSource.ScaleIO == nil { + x.VolumeSource.ScaleIO = new(ScaleIOVolumeSource) + } + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l + } else { + yyb32 = r.CheckBreak() + } + if yyb32 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil } - if yyb31 { + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } + for { + yyj32++ + if yyhl32 { + yyb32 = yyj32 > l + } else { + yyb32 = r.CheckBreak() + } + if yyb32 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj31-1, "") + z.DecStructFieldNotFound(yyj32-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -3296,7 +3372,7 @@ func (x *VolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [25]bool + var yyq2 [26]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.HostPath != nil @@ -3324,9 +3400,10 @@ func (x *VolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[22] = x.PhotonPersistentDisk != nil yyq2[23] = x.Projected != nil yyq2[24] = x.PortworxVolume != nil + yyq2[25] = x.ScaleIO != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(25) + r.EncodeArrayStart(26) } else { yynn2 = 0 for _, b := range yyq2 { @@ -3912,6 +3989,29 @@ func (x *VolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[25] { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[25] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("scaleIO")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -4248,6 +4348,17 @@ func (x *VolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } x.PortworxVolume.CodecDecodeSelf(d) } + case "scaleIO": + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -4259,16 +4370,16 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj29 int - var yyb29 bool - var yyhl29 bool = l >= 0 - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + var yyj30 int + var yyb30 bool + var yyhl30 bool = l >= 0 + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4283,13 +4394,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.HostPath.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4304,13 +4415,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.EmptyDir.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4325,13 +4436,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.GCEPersistentDisk.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4346,13 +4457,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.AWSElasticBlockStore.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4367,13 +4478,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.GitRepo.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4388,13 +4499,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Secret.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4409,13 +4520,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.NFS.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4430,13 +4541,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.ISCSI.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4451,13 +4562,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Glusterfs.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4472,13 +4583,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PersistentVolumeClaim.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4493,13 +4604,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.RBD.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4514,13 +4625,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.FlexVolume.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4535,13 +4646,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Cinder.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4556,13 +4667,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.CephFS.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4577,13 +4688,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Flocker.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4598,13 +4709,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.DownwardAPI.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4619,13 +4730,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.FC.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4640,13 +4751,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.AzureFile.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4661,13 +4772,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.ConfigMap.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4682,13 +4793,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.VsphereVolume.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4703,13 +4814,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Quobyte.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4724,13 +4835,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.AzureDisk.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4745,13 +4856,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PhotonPersistentDisk.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4766,13 +4877,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Projected.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4787,18 +4898,39 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PortworxVolume.CodecDecodeSelf(d) } - for { - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l - } else { - yyb29 = r.CheckBreak() + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil } - if yyb29 { + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } + for { + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj29-1, "") + z.DecStructFieldNotFound(yyj30-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -5051,7 +5183,7 @@ func (x *PersistentVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [18]bool + var yyq2 [19]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.GCEPersistentDisk != nil @@ -5072,9 +5204,10 @@ func (x *PersistentVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[15] = x.AzureDisk != nil yyq2[16] = x.PhotonPersistentDisk != nil yyq2[17] = x.PortworxVolume != nil + yyq2[18] = x.ScaleIO != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(18) + r.EncodeArrayStart(19) } else { yynn2 = 0 for _, b := range yyq2 { @@ -5499,6 +5632,29 @@ func (x *PersistentVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[18] { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[18] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("scaleIO")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -5758,6 +5914,17 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Deco } x.PortworxVolume.CodecDecodeSelf(d) } + case "scaleIO": + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -5769,16 +5936,16 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj22 int - var yyb22 bool - var yyhl22 bool = l >= 0 - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + var yyj23 int + var yyb23 bool + var yyhl23 bool = l >= 0 + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5793,13 +5960,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.GCEPersistentDisk.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5814,13 +5981,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.AWSElasticBlockStore.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5835,13 +6002,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.HostPath.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5856,13 +6023,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.Glusterfs.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5877,13 +6044,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.NFS.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5898,13 +6065,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.RBD.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5919,13 +6086,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.ISCSI.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5940,13 +6107,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.Cinder.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5961,13 +6128,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.CephFS.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5982,13 +6149,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.FC.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6003,13 +6170,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.Flocker.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6024,13 +6191,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.FlexVolume.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6045,13 +6212,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.AzureFile.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6066,13 +6233,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.VsphereVolume.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6087,13 +6254,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.Quobyte.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6108,13 +6275,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.AzureDisk.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6129,13 +6296,13 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.PhotonPersistentDisk.CodecDecodeSelf(d) } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb22 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb22 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6150,18 +6317,39 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } x.PortworxVolume.CodecDecodeSelf(d) } - for { - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil } - if yyb22 { + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } + for { + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj22-1, "") + z.DecStructFieldNotFound(yyj23-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -6571,7 +6759,7 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [23]bool + var yyq2 [24]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = len(x.Capacity) != 0 @@ -6593,13 +6781,14 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[16] = x.PersistentVolumeSource.AzureDisk != nil && x.AzureDisk != nil yyq2[17] = x.PersistentVolumeSource.PhotonPersistentDisk != nil && x.PhotonPersistentDisk != nil yyq2[18] = x.PersistentVolumeSource.PortworxVolume != nil && x.PortworxVolume != nil - yyq2[19] = len(x.AccessModes) != 0 - yyq2[20] = x.ClaimRef != nil - yyq2[21] = x.PersistentVolumeReclaimPolicy != "" - yyq2[22] = x.StorageClassName != "" + yyq2[19] = x.PersistentVolumeSource.ScaleIO != nil && x.ScaleIO != nil + yyq2[20] = len(x.AccessModes) != 0 + yyq2[21] = x.ClaimRef != nil + yyq2[22] = x.PersistentVolumeReclaimPolicy != "" + yyq2[23] = x.StorageClassName != "" var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(23) + r.EncodeArrayStart(24) } else { yynn2 = 0 for _, b := range yyq2 { @@ -7299,14 +7488,51 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } } } + var yyn60 bool + if x.PersistentVolumeSource.ScaleIO == nil { + yyn60 = true + goto LABEL60 + } + LABEL60: + if yyr2 || yy2arr2 { + if yyn60 { + r.EncodeNil() + } else { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[19] { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } + } else { + if yyq2[19] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("scaleIO")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if yyn60 { + r.EncodeNil() + } else { + if x.ScaleIO == nil { + r.EncodeNil() + } else { + x.ScaleIO.CodecEncodeSelf(e) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[19] { + if yyq2[20] { if x.AccessModes == nil { r.EncodeNil() } else { - yym61 := z.EncBinary() - _ = yym61 + yym64 := z.EncBinary() + _ = yym64 if false { } else { h.encSlicePersistentVolumeAccessMode(([]PersistentVolumeAccessMode)(x.AccessModes), e) @@ -7316,15 +7542,15 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { r.EncodeNil() } } else { - if yyq2[19] { + if yyq2[20] { z.EncSendContainerState(codecSelfer_containerMapKey1234) r.EncodeString(codecSelferC_UTF81234, string("accessModes")) z.EncSendContainerState(codecSelfer_containerMapValue1234) if x.AccessModes == nil { r.EncodeNil() } else { - yym62 := z.EncBinary() - _ = yym62 + yym65 := z.EncBinary() + _ = yym65 if false { } else { h.encSlicePersistentVolumeAccessMode(([]PersistentVolumeAccessMode)(x.AccessModes), e) @@ -7334,7 +7560,7 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[20] { + if yyq2[21] { if x.ClaimRef == nil { r.EncodeNil() } else { @@ -7344,7 +7570,7 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { r.EncodeNil() } } else { - if yyq2[20] { + if yyq2[21] { z.EncSendContainerState(codecSelfer_containerMapKey1234) r.EncodeString(codecSelferC_UTF81234, string("claimRef")) z.EncSendContainerState(codecSelfer_containerMapValue1234) @@ -7357,13 +7583,13 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[21] { + if yyq2[22] { x.PersistentVolumeReclaimPolicy.CodecEncodeSelf(e) } else { r.EncodeString(codecSelferC_UTF81234, "") } } else { - if yyq2[21] { + if yyq2[22] { z.EncSendContainerState(codecSelfer_containerMapKey1234) r.EncodeString(codecSelferC_UTF81234, string("persistentVolumeReclaimPolicy")) z.EncSendContainerState(codecSelfer_containerMapValue1234) @@ -7372,9 +7598,9 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[22] { - yym70 := z.EncBinary() - _ = yym70 + if yyq2[23] { + yym73 := z.EncBinary() + _ = yym73 if false { } else { r.EncodeString(codecSelferC_UTF81234, string(x.StorageClassName)) @@ -7383,12 +7609,12 @@ func (x *PersistentVolumeSpec) CodecEncodeSelf(e *codec1978.Encoder) { r.EncodeString(codecSelferC_UTF81234, "") } } else { - if yyq2[22] { + if yyq2[23] { z.EncSendContainerState(codecSelfer_containerMapKey1234) r.EncodeString(codecSelferC_UTF81234, string("storageClassName")) z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym71 := z.EncBinary() - _ = yym71 + yym74 := z.EncBinary() + _ = yym74 if false { } else { r.EncodeString(codecSelferC_UTF81234, string(x.StorageClassName)) @@ -7715,16 +7941,30 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decode } x.PortworxVolume.CodecDecodeSelf(d) } + case "scaleIO": + if x.PersistentVolumeSource.ScaleIO == nil { + x.PersistentVolumeSource.ScaleIO = new(ScaleIOVolumeSource) + } + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } case "accessModes": if r.TryDecodeAsNil() { x.AccessModes = nil } else { - yyv23 := &x.AccessModes - yym24 := z.DecBinary() - _ = yym24 + yyv24 := &x.AccessModes + yym25 := z.DecBinary() + _ = yym25 if false { } else { - h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv23), d) + h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv24), d) } } case "claimRef": @@ -7742,19 +7982,19 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decode if r.TryDecodeAsNil() { x.PersistentVolumeReclaimPolicy = "" } else { - yyv26 := &x.PersistentVolumeReclaimPolicy - yyv26.CodecDecodeSelf(d) + yyv27 := &x.PersistentVolumeReclaimPolicy + yyv27.CodecDecodeSelf(d) } case "storageClassName": if r.TryDecodeAsNil() { x.StorageClassName = "" } else { - yyv27 := &x.StorageClassName - yym28 := z.DecBinary() - _ = yym28 + yyv28 := &x.StorageClassName + yym29 := z.DecBinary() + _ = yym29 if false { } else { - *((*string)(yyv27)) = r.DecodeString() + *((*string)(yyv28)) = r.DecodeString() } } default: @@ -7768,16 +8008,16 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj29 int - var yyb29 bool - var yyhl29 bool = l >= 0 - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + var yyj30 int + var yyb30 bool + var yyhl30 bool = l >= 0 + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7785,19 +8025,19 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if r.TryDecodeAsNil() { x.Capacity = nil } else { - yyv30 := &x.Capacity - yyv30.CodecDecodeSelf(d) + yyv31 := &x.Capacity + yyv31.CodecDecodeSelf(d) } if x.PersistentVolumeSource.GCEPersistentDisk == nil { x.PersistentVolumeSource.GCEPersistentDisk = new(GCEPersistentDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7815,13 +8055,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.AWSElasticBlockStore == nil { x.PersistentVolumeSource.AWSElasticBlockStore = new(AWSElasticBlockStoreVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7839,13 +8079,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.HostPath == nil { x.PersistentVolumeSource.HostPath = new(HostPathVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7863,13 +8103,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.Glusterfs == nil { x.PersistentVolumeSource.Glusterfs = new(GlusterfsVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7887,13 +8127,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.NFS == nil { x.PersistentVolumeSource.NFS = new(NFSVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7911,13 +8151,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.RBD == nil { x.PersistentVolumeSource.RBD = new(RBDVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7935,13 +8175,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.ISCSI == nil { x.PersistentVolumeSource.ISCSI = new(ISCSIVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7959,13 +8199,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.Cinder == nil { x.PersistentVolumeSource.Cinder = new(CinderVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -7983,13 +8223,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.CephFS == nil { x.PersistentVolumeSource.CephFS = new(CephFSVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8007,13 +8247,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.FC == nil { x.PersistentVolumeSource.FC = new(FCVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8031,13 +8271,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.Flocker == nil { x.PersistentVolumeSource.Flocker = new(FlockerVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8055,13 +8295,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.FlexVolume == nil { x.PersistentVolumeSource.FlexVolume = new(FlexVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8079,13 +8319,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.AzureFile == nil { x.PersistentVolumeSource.AzureFile = new(AzureFileVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8103,13 +8343,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.VsphereVolume == nil { x.PersistentVolumeSource.VsphereVolume = new(VsphereVirtualDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8127,13 +8367,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.Quobyte == nil { x.PersistentVolumeSource.Quobyte = new(QuobyteVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8151,13 +8391,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.AzureDisk == nil { x.PersistentVolumeSource.AzureDisk = new(AzureDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8175,13 +8415,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.PhotonPersistentDisk == nil { x.PersistentVolumeSource.PhotonPersistentDisk = new(PhotonPersistentDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8199,13 +8439,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if x.PersistentVolumeSource.PortworxVolume == nil { x.PersistentVolumeSource.PortworxVolume = new(PortworxVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8220,13 +8460,37 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco } x.PortworxVolume.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l - } else { - yyb29 = r.CheckBreak() + if x.PersistentVolumeSource.ScaleIO == nil { + x.PersistentVolumeSource.ScaleIO = new(ScaleIOVolumeSource) } - if yyb29 { + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ScaleIO != nil { + x.ScaleIO = nil + } + } else { + if x.ScaleIO == nil { + x.ScaleIO = new(ScaleIOVolumeSource) + } + x.ScaleIO.CodecDecodeSelf(d) + } + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8234,21 +8498,21 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if r.TryDecodeAsNil() { x.AccessModes = nil } else { - yyv49 := &x.AccessModes - yym50 := z.DecBinary() - _ = yym50 + yyv51 := &x.AccessModes + yym52 := z.DecBinary() + _ = yym52 if false { } else { - h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv49), d) + h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv51), d) } } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8263,13 +8527,13 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco } x.ClaimRef.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8277,16 +8541,16 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if r.TryDecodeAsNil() { x.PersistentVolumeReclaimPolicy = "" } else { - yyv52 := &x.PersistentVolumeReclaimPolicy - yyv52.CodecDecodeSelf(d) + yyv54 := &x.PersistentVolumeReclaimPolicy + yyv54.CodecDecodeSelf(d) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -8294,26 +8558,26 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco if r.TryDecodeAsNil() { x.StorageClassName = "" } else { - yyv53 := &x.StorageClassName - yym54 := z.DecBinary() - _ = yym54 + yyv55 := &x.StorageClassName + yym56 := z.DecBinary() + _ = yym56 if false { } else { - *((*string)(yyv53)) = r.DecodeString() + *((*string)(yyv55)) = r.DecodeString() } } for { - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj29-1, "") + z.DecStructFieldNotFound(yyj30-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -18097,6 +18361,702 @@ func (x *PortworxVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Deco z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x *ScaleIOVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [10]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[3] = x.SSLEnabled != false + yyq2[4] = x.ProtectionDomain != "" + yyq2[5] = x.StoragePool != "" + yyq2[6] = x.StorageMode != "" + yyq2[7] = x.VolumeName != "" + yyq2[8] = x.FSType != "" + yyq2[9] = x.ReadOnly != false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(10) + } else { + yynn2 = 3 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Gateway)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("gateway")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Gateway)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.System)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("system")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.System)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.SecretRef == nil { + r.EncodeNil() + } else { + x.SecretRef.CodecEncodeSelf(e) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("secretRef")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.SecretRef == nil { + r.EncodeNil() + } else { + x.SecretRef.CodecEncodeSelf(e) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[3] { + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeBool(bool(x.SSLEnabled)) + } + } else { + r.EncodeBool(false) + } + } else { + if yyq2[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("sslEnabled")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + r.EncodeBool(bool(x.SSLEnabled)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[4] { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.ProtectionDomain)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[4] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("protectionDomain")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym17 := z.EncBinary() + _ = yym17 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.ProtectionDomain)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[5] { + yym19 := z.EncBinary() + _ = yym19 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StoragePool)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[5] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("storagePool")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym20 := z.EncBinary() + _ = yym20 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StoragePool)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[6] { + yym22 := z.EncBinary() + _ = yym22 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StorageMode)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[6] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("storageMode")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym23 := z.EncBinary() + _ = yym23 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StorageMode)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[7] { + yym25 := z.EncBinary() + _ = yym25 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[7] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("volumeName")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym26 := z.EncBinary() + _ = yym26 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[8] { + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.FSType)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[8] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("fsType")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym29 := z.EncBinary() + _ = yym29 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.FSType)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[9] { + yym31 := z.EncBinary() + _ = yym31 + if false { + } else { + r.EncodeBool(bool(x.ReadOnly)) + } + } else { + r.EncodeBool(false) + } + } else { + if yyq2[9] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("readOnly")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym32 := z.EncBinary() + _ = yym32 + if false { + } else { + r.EncodeBool(bool(x.ReadOnly)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *ScaleIOVolumeSource) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *ScaleIOVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "gateway": + if r.TryDecodeAsNil() { + x.Gateway = "" + } else { + yyv4 := &x.Gateway + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "system": + if r.TryDecodeAsNil() { + x.System = "" + } else { + yyv6 := &x.System + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "secretRef": + if r.TryDecodeAsNil() { + if x.SecretRef != nil { + x.SecretRef = nil + } + } else { + if x.SecretRef == nil { + x.SecretRef = new(LocalObjectReference) + } + x.SecretRef.CodecDecodeSelf(d) + } + case "sslEnabled": + if r.TryDecodeAsNil() { + x.SSLEnabled = false + } else { + yyv9 := &x.SSLEnabled + yym10 := z.DecBinary() + _ = yym10 + if false { + } else { + *((*bool)(yyv9)) = r.DecodeBool() + } + } + case "protectionDomain": + if r.TryDecodeAsNil() { + x.ProtectionDomain = "" + } else { + yyv11 := &x.ProtectionDomain + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*string)(yyv11)) = r.DecodeString() + } + } + case "storagePool": + if r.TryDecodeAsNil() { + x.StoragePool = "" + } else { + yyv13 := &x.StoragePool + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + case "storageMode": + if r.TryDecodeAsNil() { + x.StorageMode = "" + } else { + yyv15 := &x.StorageMode + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + case "volumeName": + if r.TryDecodeAsNil() { + x.VolumeName = "" + } else { + yyv17 := &x.VolumeName + yym18 := z.DecBinary() + _ = yym18 + if false { + } else { + *((*string)(yyv17)) = r.DecodeString() + } + } + case "fsType": + if r.TryDecodeAsNil() { + x.FSType = "" + } else { + yyv19 := &x.FSType + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + *((*string)(yyv19)) = r.DecodeString() + } + } + case "readOnly": + if r.TryDecodeAsNil() { + x.ReadOnly = false + } else { + yyv21 := &x.ReadOnly + yym22 := z.DecBinary() + _ = yym22 + if false { + } else { + *((*bool)(yyv21)) = r.DecodeBool() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *ScaleIOVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj23 int + var yyb23 bool + var yyhl23 bool = l >= 0 + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Gateway = "" + } else { + yyv24 := &x.Gateway + yym25 := z.DecBinary() + _ = yym25 + if false { + } else { + *((*string)(yyv24)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.System = "" + } else { + yyv26 := &x.System + yym27 := z.DecBinary() + _ = yym27 + if false { + } else { + *((*string)(yyv26)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.SecretRef != nil { + x.SecretRef = nil + } + } else { + if x.SecretRef == nil { + x.SecretRef = new(LocalObjectReference) + } + x.SecretRef.CodecDecodeSelf(d) + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.SSLEnabled = false + } else { + yyv29 := &x.SSLEnabled + yym30 := z.DecBinary() + _ = yym30 + if false { + } else { + *((*bool)(yyv29)) = r.DecodeBool() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ProtectionDomain = "" + } else { + yyv31 := &x.ProtectionDomain + yym32 := z.DecBinary() + _ = yym32 + if false { + } else { + *((*string)(yyv31)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.StoragePool = "" + } else { + yyv33 := &x.StoragePool + yym34 := z.DecBinary() + _ = yym34 + if false { + } else { + *((*string)(yyv33)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.StorageMode = "" + } else { + yyv35 := &x.StorageMode + yym36 := z.DecBinary() + _ = yym36 + if false { + } else { + *((*string)(yyv35)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.VolumeName = "" + } else { + yyv37 := &x.VolumeName + yym38 := z.DecBinary() + _ = yym38 + if false { + } else { + *((*string)(yyv37)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.FSType = "" + } else { + yyv39 := &x.FSType + yym40 := z.DecBinary() + _ = yym40 + if false { + } else { + *((*string)(yyv39)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ReadOnly = false + } else { + yyv41 := &x.ReadOnly + yym42 := z.DecBinary() + _ = yym42 + if false { + } else { + *((*bool)(yyv41)) = r.DecodeBool() + } + } + for { + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj23-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x *ConfigMapVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -66063,7 +67023,7 @@ func (x codecSelfer1234) decSlicePersistentVolume(v *[]PersistentVolume, d *code yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 520) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 528) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] @@ -67842,7 +68802,7 @@ func (x codecSelfer1234) decSliceVolume(v *[]Volume, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 216) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 224) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/types.go b/staging/src/k8s.io/client-go/pkg/api/v1/types.go index acbb1dfe1f2..12adc933495 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/types.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/types.go @@ -331,6 +331,9 @@ type VolumeSource struct { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional PortworxVolume *PortworxVolumeSource `json:"portworxVolume,omitempty" protobuf:"bytes,24,opt,name=portworxVolume"` + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + ScaleIO *ScaleIOVolumeSource `json:"scaleIO,omitempty" protobuf:"bytes,25,opt,name=scaleIO"` } // PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. @@ -419,6 +422,9 @@ type PersistentVolumeSource struct { // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine // +optional PortworxVolume *PortworxVolumeSource `json:"portworxVolume,omitempty" protobuf:"bytes,18,opt,name=portworxVolume"` + // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + // +optional + ScaleIO *ScaleIOVolumeSource `json:"scaleIO,omitempty" protobuf:"bytes,19,opt,name=scaleIO"` } const ( @@ -1138,6 +1144,41 @@ type PortworxVolumeSource struct { ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,3,opt,name=readOnly"` } +// ScaleIOVolumeSource represents a persistent ScaleIO volume +type ScaleIOVolumeSource struct { + // The host address of the ScaleIO API Gateway. + Gateway string `json:"gateway" protobuf:"bytes,1,opt,name=gateway"` + // The name of the storage system as configured in ScaleIO. + System string `json:"system" protobuf:"bytes,2,opt,name=system"` + // SecretRef references to the secret for ScaleIO user and other + // sensitive information. If this is not provided, Login operation will fail. + SecretRef *LocalObjectReference `json:"secretRef" protobuf:"bytes,3,opt,name=secretRef"` + // Flag to enable/disable SSL communication with Gateway, default false + // +optional + SSLEnabled bool `json:"sslEnabled,omitempty" protobuf:"varint,4,opt,name=sslEnabled"` + // The name of the Protection Domain for the configured storage (defaults to "default"). + // +optional + ProtectionDomain string `json:"protectionDomain,omitempty" protobuf:"bytes,5,opt,name=protectionDomain"` + // The Storage Pool associated with the protection domain (defaults to "default"). + // +optional + StoragePool string `json:"storagePool,omitempty" protobuf:"bytes,6,opt,name=storagePool"` + // Indicates whether the storage for a volume should be thick or thin (defaults to "thin"). + // +optional + StorageMode string `json:"storageMode,omitempty" protobuf:"bytes,7,opt,name=storageMode"` + // The name of a volume already created in the ScaleIO system + // that is associated with this volume source. + VolumeName string `json:"volumeName,omitempty" protobuf:"bytes,8,opt,name=volumeName"` + // Filesystem type to mount. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // +optional + FSType string `json:"fsType,omitempty" protobuf:"bytes,9,opt,name=fsType"` + // Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,10,opt,name=readOnly"` +} + // Adapts a ConfigMap into a volume. // // The contents of the target ConfigMap's Data field will be presented in a diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go index 3a12a42e4e5..36740cc8817 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go @@ -1124,6 +1124,7 @@ var map_PersistentVolumeSource = map[string]string{ "azureDisk": "AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.", "photonPersistentDisk": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine", "portworxVolume": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine", + "scaleIO": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", } func (PersistentVolumeSource) SwaggerDoc() map[string]string { @@ -1640,6 +1641,24 @@ func (SELinuxOptions) SwaggerDoc() map[string]string { return map_SELinuxOptions } +var map_ScaleIOVolumeSource = map[string]string{ + "": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "gateway": "The host address of the ScaleIO API Gateway.", + "system": "The name of the storage system as configured in ScaleIO.", + "secretRef": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail.", + "sslEnabled": "Flag to enable/disable SSL communication with Gateway, default false", + "protectionDomain": "The name of the Protection Domain for the configured storage (defaults to \"default\").", + "storagePool": "The Storage Pool associated with the protection domain (defaults to \"default\").", + "storageMode": "Indicates whether the storage for a volume should be thick or thin (defaults to \"thin\").", + "volumeName": "The name of a volume already created in the ScaleIO system that is associated with this volume source.", + "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "readOnly": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", +} + +func (ScaleIOVolumeSource) SwaggerDoc() map[string]string { + return map_ScaleIOVolumeSource +} + var map_Secret = map[string]string{ "": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", "metadata": "Standard object's metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", @@ -1911,6 +1930,7 @@ var map_VolumeSource = map[string]string{ "photonPersistentDisk": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine", "projected": "Items for all in one resources secrets, configmaps, and downward API", "portworxVolume": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine", + "scaleIO": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", } func (VolumeSource) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go index 96ee31815fe..c57c8cc2522 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go @@ -317,6 +317,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_ResourceRequirements_To_v1_ResourceRequirements, Convert_v1_SELinuxOptions_To_api_SELinuxOptions, Convert_api_SELinuxOptions_To_v1_SELinuxOptions, + Convert_v1_ScaleIOVolumeSource_To_api_ScaleIOVolumeSource, + Convert_api_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource, Convert_v1_Secret_To_api_Secret, Convert_api_Secret_To_v1_Secret, Convert_v1_SecretEnvSource_To_api_SecretEnvSource, @@ -2711,6 +2713,7 @@ func autoConvert_v1_PersistentVolumeSource_To_api_PersistentVolumeSource(in *Per out.AzureDisk = (*api.AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk)) out.PhotonPersistentDisk = (*api.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) out.PortworxVolume = (*api.PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume)) + out.ScaleIO = (*api.ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO)) return nil } @@ -2737,6 +2740,7 @@ func autoConvert_api_PersistentVolumeSource_To_v1_PersistentVolumeSource(in *api out.AzureDisk = (*AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk)) out.PhotonPersistentDisk = (*PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) out.PortworxVolume = (*PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume)) + out.ScaleIO = (*ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO)) return nil } @@ -3887,6 +3891,42 @@ func Convert_api_SELinuxOptions_To_v1_SELinuxOptions(in *api.SELinuxOptions, out return autoConvert_api_SELinuxOptions_To_v1_SELinuxOptions(in, out, s) } +func autoConvert_v1_ScaleIOVolumeSource_To_api_ScaleIOVolumeSource(in *ScaleIOVolumeSource, out *api.ScaleIOVolumeSource, s conversion.Scope) error { + out.Gateway = in.Gateway + out.System = in.System + out.SecretRef = (*api.LocalObjectReference)(unsafe.Pointer(in.SecretRef)) + out.SSLEnabled = in.SSLEnabled + out.ProtectionDomain = in.ProtectionDomain + out.StoragePool = in.StoragePool + out.StorageMode = in.StorageMode + out.VolumeName = in.VolumeName + out.FSType = in.FSType + out.ReadOnly = in.ReadOnly + return nil +} + +func Convert_v1_ScaleIOVolumeSource_To_api_ScaleIOVolumeSource(in *ScaleIOVolumeSource, out *api.ScaleIOVolumeSource, s conversion.Scope) error { + return autoConvert_v1_ScaleIOVolumeSource_To_api_ScaleIOVolumeSource(in, out, s) +} + +func autoConvert_api_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in *api.ScaleIOVolumeSource, out *ScaleIOVolumeSource, s conversion.Scope) error { + out.Gateway = in.Gateway + out.System = in.System + out.SecretRef = (*LocalObjectReference)(unsafe.Pointer(in.SecretRef)) + out.SSLEnabled = in.SSLEnabled + out.ProtectionDomain = in.ProtectionDomain + out.StoragePool = in.StoragePool + out.StorageMode = in.StorageMode + out.VolumeName = in.VolumeName + out.FSType = in.FSType + out.ReadOnly = in.ReadOnly + return nil +} + +func Convert_api_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in *api.ScaleIOVolumeSource, out *ScaleIOVolumeSource, s conversion.Scope) error { + return autoConvert_api_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in, out, s) +} + func autoConvert_v1_Secret_To_api_Secret(in *Secret, out *api.Secret, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.Data = *(*map[string][]byte)(unsafe.Pointer(&in.Data)) @@ -4487,6 +4527,7 @@ func autoConvert_v1_VolumeSource_To_api_VolumeSource(in *VolumeSource, out *api. out.PhotonPersistentDisk = (*api.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) out.Projected = (*api.ProjectedVolumeSource)(unsafe.Pointer(in.Projected)) out.PortworxVolume = (*api.PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume)) + out.ScaleIO = (*api.ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO)) return nil } @@ -4520,6 +4561,7 @@ func autoConvert_api_VolumeSource_To_v1_VolumeSource(in *api.VolumeSource, out * out.PhotonPersistentDisk = (*PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) out.Projected = (*ProjectedVolumeSource)(unsafe.Pointer(in.Projected)) out.PortworxVolume = (*PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume)) + out.ScaleIO = (*ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO)) return nil } diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.deepcopy.go index 76fa388827c..463e946800d 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.deepcopy.go @@ -176,6 +176,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ResourceQuotaStatus, InType: reflect.TypeOf(&ResourceQuotaStatus{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ResourceRequirements, InType: reflect.TypeOf(&ResourceRequirements{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SELinuxOptions, InType: reflect.TypeOf(&SELinuxOptions{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ScaleIOVolumeSource, InType: reflect.TypeOf(&ScaleIOVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_Secret, InType: reflect.TypeOf(&Secret{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecretEnvSource, InType: reflect.TypeOf(&SecretEnvSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecretKeySelector, InType: reflect.TypeOf(&SecretKeySelector{})}, @@ -2026,6 +2027,13 @@ func DeepCopy_v1_PersistentVolumeSource(in interface{}, out interface{}, c *conv *out = new(PortworxVolumeSource) **out = **in } + if in.ScaleIO != nil { + in, out := &in.ScaleIO, &out.ScaleIO + *out = new(ScaleIOVolumeSource) + if err := DeepCopy_v1_ScaleIOVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } @@ -2872,6 +2880,20 @@ func DeepCopy_v1_SELinuxOptions(in interface{}, out interface{}, c *conversion.C } } +func DeepCopy_v1_ScaleIOVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*ScaleIOVolumeSource) + out := out.(*ScaleIOVolumeSource) + *out = *in + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + *out = new(LocalObjectReference) + **out = **in + } + return nil + } +} + func DeepCopy_v1_Secret(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*Secret) @@ -3445,6 +3467,13 @@ func DeepCopy_v1_VolumeSource(in interface{}, out interface{}, c *conversion.Clo *out = new(PortworxVolumeSource) **out = **in } + if in.ScaleIO != nil { + in, out := &in.ScaleIO, &out.ScaleIO + *out = new(ScaleIOVolumeSource) + if err := DeepCopy_v1_ScaleIOVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.defaults.go b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.defaults.go index 981734f1902..121b39185c1 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.defaults.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.defaults.go @@ -137,6 +137,9 @@ func SetObjectDefaults_PersistentVolume(in *PersistentVolume) { if in.Spec.PersistentVolumeSource.AzureDisk != nil { SetDefaults_AzureDiskVolumeSource(in.Spec.PersistentVolumeSource.AzureDisk) } + if in.Spec.PersistentVolumeSource.ScaleIO != nil { + SetDefaults_ScaleIOVolumeSource(in.Spec.PersistentVolumeSource.ScaleIO) + } } func SetObjectDefaults_PersistentVolumeClaim(in *PersistentVolumeClaim) { @@ -204,6 +207,9 @@ func SetObjectDefaults_Pod(in *Pod) { } } } + if a.VolumeSource.ScaleIO != nil { + SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.InitContainers { a := &in.Spec.InitContainers[i] @@ -349,6 +355,9 @@ func SetObjectDefaults_PodTemplate(in *PodTemplate) { } } } + if a.VolumeSource.ScaleIO != nil { + SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Template.Spec.InitContainers { a := &in.Template.Spec.InitContainers[i] @@ -488,6 +497,9 @@ func SetObjectDefaults_ReplicationController(in *ReplicationController) { } } } + if a.VolumeSource.ScaleIO != nil { + SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/staging/src/k8s.io/client-go/pkg/api/zz_generated.deepcopy.go b/staging/src/k8s.io/client-go/pkg/api/zz_generated.deepcopy.go index 2d56e395184..c018bcc4eef 100644 --- a/staging/src/k8s.io/client-go/pkg/api/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/client-go/pkg/api/zz_generated.deepcopy.go @@ -179,6 +179,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ResourceQuotaStatus, InType: reflect.TypeOf(&ResourceQuotaStatus{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ResourceRequirements, InType: reflect.TypeOf(&ResourceRequirements{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SELinuxOptions, InType: reflect.TypeOf(&SELinuxOptions{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ScaleIOVolumeSource, InType: reflect.TypeOf(&ScaleIOVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_Secret, InType: reflect.TypeOf(&Secret{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecretEnvSource, InType: reflect.TypeOf(&SecretEnvSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecretKeySelector, InType: reflect.TypeOf(&SecretKeySelector{})}, @@ -2070,6 +2071,13 @@ func DeepCopy_api_PersistentVolumeSource(in interface{}, out interface{}, c *con *out = new(PortworxVolumeSource) **out = **in } + if in.ScaleIO != nil { + in, out := &in.ScaleIO, &out.ScaleIO + *out = new(ScaleIOVolumeSource) + if err := DeepCopy_api_ScaleIOVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } @@ -2911,6 +2919,20 @@ func DeepCopy_api_SELinuxOptions(in interface{}, out interface{}, c *conversion. } } +func DeepCopy_api_ScaleIOVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*ScaleIOVolumeSource) + out := out.(*ScaleIOVolumeSource) + *out = *in + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + *out = new(LocalObjectReference) + **out = **in + } + return nil + } +} + func DeepCopy_api_Secret(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*Secret) @@ -3472,6 +3494,13 @@ func DeepCopy_api_VolumeSource(in interface{}, out interface{}, c *conversion.Cl *out = new(PortworxVolumeSource) **out = **in } + if in.ScaleIO != nil { + in, out := &in.ScaleIO, &out.ScaleIO + *out = new(ScaleIOVolumeSource) + if err := DeepCopy_api_ScaleIOVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } diff --git a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/zz_generated.defaults.go b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/zz_generated.defaults.go index 0876cddf591..9b822c84cb6 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/zz_generated.defaults.go +++ b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/zz_generated.defaults.go @@ -80,6 +80,9 @@ func SetObjectDefaults_Deployment(in *Deployment) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -218,6 +221,9 @@ func SetObjectDefaults_StatefulSet(in *StatefulSet) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/staging/src/k8s.io/client-go/pkg/apis/batch/v1/zz_generated.defaults.go b/staging/src/k8s.io/client-go/pkg/apis/batch/v1/zz_generated.defaults.go index 746355f4834..417024f62d7 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/batch/v1/zz_generated.defaults.go +++ b/staging/src/k8s.io/client-go/pkg/apis/batch/v1/zz_generated.defaults.go @@ -78,6 +78,9 @@ func SetObjectDefaults_Job(in *Job) { } } } + if a.VolumeSource.ScaleIO != nil { + api_v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/staging/src/k8s.io/client-go/pkg/apis/batch/v2alpha1/zz_generated.defaults.go b/staging/src/k8s.io/client-go/pkg/apis/batch/v2alpha1/zz_generated.defaults.go index a0496024d90..d9e84bb516b 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/batch/v2alpha1/zz_generated.defaults.go +++ b/staging/src/k8s.io/client-go/pkg/apis/batch/v2alpha1/zz_generated.defaults.go @@ -81,6 +81,9 @@ func SetObjectDefaults_CronJob(in *CronJob) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.JobTemplate.Spec.Template.Spec.InitContainers { a := &in.Spec.JobTemplate.Spec.Template.Spec.InitContainers[i] @@ -219,6 +222,9 @@ func SetObjectDefaults_Job(in *Job) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -356,6 +362,9 @@ func SetObjectDefaults_JobTemplate(in *JobTemplate) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Template.Spec.Template.Spec.InitContainers { a := &in.Template.Spec.Template.Spec.InitContainers[i] diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/types.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/types.go index f071d81f018..096ef15915d 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/types.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/types.go @@ -918,6 +918,7 @@ var ( PhotonPersistentDisk FSType = "photonPersistentDisk" Projected FSType = "projected" PortworxVolume FSType = "portworxVolume" + ScaleIO FSType = "scaleIO" All FSType = "*" ) diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.defaults.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.defaults.go index 4dd2ef8f4b2..770faa513f7 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.defaults.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.defaults.go @@ -84,6 +84,9 @@ func SetObjectDefaults_DaemonSet(in *DaemonSet) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -222,6 +225,9 @@ func SetObjectDefaults_Deployment(in *Deployment) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -371,6 +377,9 @@ func SetObjectDefaults_ReplicaSet(in *ReplicaSet) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/staging/src/k8s.io/client-go/pkg/apis/settings/v1alpha1/zz_generated.defaults.go b/staging/src/k8s.io/client-go/pkg/apis/settings/v1alpha1/zz_generated.defaults.go index 15626f1aaca..c178a3072c2 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/settings/v1alpha1/zz_generated.defaults.go +++ b/staging/src/k8s.io/client-go/pkg/apis/settings/v1alpha1/zz_generated.defaults.go @@ -84,6 +84,9 @@ func SetObjectDefaults_PodPreset(in *PodPreset) { } } } + if a.VolumeSource.ScaleIO != nil { + v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } } } diff --git a/vendor/BUILD b/vendor/BUILD index c0ba4e0a7d9..50e92bbd585 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -16262,3 +16262,32 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_library( + name = "github.com/codedellemc/goscaleio", + srcs = [ + "github.com/codedellemc/goscaleio/api.go", + "github.com/codedellemc/goscaleio/certs.go", + "github.com/codedellemc/goscaleio/device.go", + "github.com/codedellemc/goscaleio/instance.go", + "github.com/codedellemc/goscaleio/protectiondomain.go", + "github.com/codedellemc/goscaleio/scsiinitiator.go", + "github.com/codedellemc/goscaleio/sdc.go", + "github.com/codedellemc/goscaleio/sds.go", + "github.com/codedellemc/goscaleio/storagepool.go", + "github.com/codedellemc/goscaleio/system.go", + "github.com/codedellemc/goscaleio/user.go", + "github.com/codedellemc/goscaleio/volume.go", + ], + tags = ["automanaged"], + deps = [ + "//vendor:github.com/Sirupsen/logrus", + "//vendor:github.com/codedellemc/goscaleio/types/v1", + ], +) + +go_library( + name = "github.com/codedellemc/goscaleio/types/v1", + srcs = ["github.com/codedellemc/goscaleio/types/v1/types.go"], + tags = ["automanaged"], +) diff --git a/vendor/github.com/codedellemc/goscaleio/.gitignore b/vendor/github.com/codedellemc/goscaleio/.gitignore new file mode 100644 index 00000000000..a67c18279fb --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/.gitignore @@ -0,0 +1,420 @@ +*.*-e +.*-e +*-e +vendor/ +.build/ +.rpmbuild/ +example +release/* +golang-crosscompile/ +.project +*.d +*.out +.gaesdk/ + +# Created by https://www.gitignore.io + +### Windows ### +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +### OSX ### +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +### Eclipse ### +*.pydevproject +.metadata +.gradle +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# PDT-specific +.buildpath + +# sbteclipse plugin +.target + +# TeXlipse plugin +.texlipse + + +### Go ### +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof + + +### SublimeText ### +# cache files for sublime text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# workspace files are user-specific +*.sublime-workspace + +# project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using SublimeText +# *.sublime-project + +# sftp configuration file +sftp-config.json + + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Visual Studo 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding addin-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +*.[Cc]ache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties + + +### Java ### +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties diff --git a/vendor/github.com/codedellemc/goscaleio/.travis.yml b/vendor/github.com/codedellemc/goscaleio/.travis.yml new file mode 100644 index 00000000000..4cb22c9de91 --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/.travis.yml @@ -0,0 +1,10 @@ +language: go + +install: + - go get -t ./... + - go get code.google.com/p/go.tools/cmd/cover + - go get github.com/mattn/goveralls + +script: + - PATH="$HOME/gopath/bin:$PATH" + - script/coverage --coveralls diff --git a/vendor/github.com/codedellemc/goscaleio/LICENSE b/vendor/github.com/codedellemc/goscaleio/LICENSE new file mode 100644 index 00000000000..e06d2081865 --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/LICENSE @@ -0,0 +1,202 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/vendor/github.com/codedellemc/goscaleio/README.md b/vendor/github.com/codedellemc/goscaleio/README.md new file mode 100644 index 00000000000..facc255ad9d --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/README.md @@ -0,0 +1,80 @@ +# Goscaleio +The *Goscaleio* project represents API bindings that can be used to provide ScaleIO functionality into other Go applications. + + +- [Current State](#state) +- [Usage](#usage) +- [Licensing](#licensing) +- [Support](#support) + +## Use Cases +Any application written in Go can take advantage of these bindings. Specifically, things that are involved in monitoring, management, and more specifically infrastructrue as code would find these bindings relevant. + + +## Current State +Early build-out and pre-documentation stages. The basics around authentication and object models are there. + + +## Usage + +### Logging in + + client, err := goscaleio.NewClient() + if err != nil { + log.Fatalf("err: %v", err) + } + + _, err = client.Authenticate(&goscaleio.ConfigConnect{endpoint, username, password}) + if err != nil { + log.Fatalf("error authenticating: %v", err) + } + + fmt.Println("Successfuly logged in to ScaleIO Gateway at", client.SIOEndpoint.String()) + + +### Reusing the authentication token +Once a client struct is created via the ```NewClient()``` function, you can replace the ```Token``` with the saved token. + + client, err := goscaleio.NewClient() + if err != nil { + log.Fatalf("error with NewClient: %s", err) + } + + client.Token = oldToken + +### Get Systems +Retrieving systems is the first step after authentication which enables you to work with other necessary methods. + +#### All Systems + + systems, err := client.GetInstance() + if err != nil { + log.Fatalf("err: problem getting instance %v", err) + } + +#### Find a System + + system, err := client.FindSystem(systemid,"","") + if err != nil { + log.Fatalf("err: problem getting instance %v", err) + } + + +### Get Protection Domains +Once you have a ```System``` struct you can then get other things like ```Protection Domains```. + + protectiondomains, err := system.GetProtectionDomain() + if err != nil { + log.Fatalf("error getting protection domains: %v", err) + } + + +Licensing +--------- +Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +Support +------- +Please file bugs and issues at the Github issues page. For more general discussions you can contact the EMC Code team at Google Groups or tagged with **EMC** on Stackoverflow.com. The code and documentation are released with no warranties or SLAs and are intended to be supported through a community driven process. diff --git a/vendor/github.com/codedellemc/goscaleio/api.go b/vendor/github.com/codedellemc/goscaleio/api.go new file mode 100644 index 00000000000..82c839caf41 --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/api.go @@ -0,0 +1,401 @@ +package goscaleio + +import ( + "bytes" + "crypto/tls" + "crypto/x509" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "regexp" + "strings" + "time" + + log "github.com/Sirupsen/logrus" + types "github.com/codedellemc/goscaleio/types/v1" +) + +type Client struct { + Token string + SIOEndpoint url.URL + Http http.Client + Insecure string + ShowBody bool + configConnect *ConfigConnect +} + +type Cluster struct { +} + +type ConfigConnect struct { + Endpoint string + Version string + Username string + Password string +} + +type ClientPersistent struct { + configConnect *ConfigConnect + client *Client +} + +func (client *Client) getVersion() (string, error) { + endpoint := client.SIOEndpoint + endpoint.Path = "/api/version" + + req := client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", client.Token) + + resp, err := client.retryCheckResp(&client.Http, req) + if err != nil { + return "", fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", errors.New("error reading body") + } + + version := string(bs) + + if client.ShowBody { + log.WithField("body", version).Debug( + "printing version message body") + } + + version = strings.TrimRight(version, `"`) + version = strings.TrimLeft(version, `"`) + + versionRX := regexp.MustCompile(`^(\d+?\.\d+?).*$`) + if m := versionRX.FindStringSubmatch(version); len(m) > 0 { + return m[1], nil + } + return version, nil +} + +func (client *Client) updateVersion() error { + + version, err := client.getVersion() + if err != nil { + return err + } + client.configConnect.Version = version + + return nil +} + +func (client *Client) Authenticate(configConnect *ConfigConnect) (Cluster, error) { + + configConnect.Version = client.configConnect.Version + client.configConnect = configConnect + + endpoint := client.SIOEndpoint + endpoint.Path += "/login" + + req := client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth(configConnect.Username, configConnect.Password) + + httpClient := &client.Http + resp, errBody, err := client.checkResp(httpClient.Do(req)) + if errBody == nil && err != nil { + return Cluster{}, err + } else if errBody != nil && err != nil { + if resp == nil { + return Cluster{}, errors.New("Problem getting response from endpoint") + } + return Cluster{}, errors.New(errBody.Message) + } + defer resp.Body.Close() + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return Cluster{}, errors.New("error reading body") + } + + token := string(bs) + + if client.ShowBody { + log.WithField("body", token).Debug( + "printing authentication message body") + } + + token = strings.TrimRight(token, `"`) + token = strings.TrimLeft(token, `"`) + client.Token = token + + if client.configConnect.Version == "" { + err = client.updateVersion() + if err != nil { + return Cluster{}, errors.New("error getting version of ScaleIO") + } + } + + return Cluster{}, nil +} + +//https://github.com/chrislusf/teeproxy/blob/master/teeproxy.go +type nopCloser struct { + io.Reader +} + +func (nopCloser) Close() error { return nil } + +func DuplicateRequest(request *http.Request) (request1 *http.Request, request2 *http.Request) { + request1 = &http.Request{ + Method: request.Method, + URL: request.URL, + Proto: "HTTP/1.1", + ProtoMajor: 1, + ProtoMinor: 1, + Header: request.Header, + Host: request.Host, + ContentLength: request.ContentLength, + } + request2 = &http.Request{ + Method: request.Method, + URL: request.URL, + Proto: "HTTP/1.1", + ProtoMajor: 1, + ProtoMinor: 1, + Header: request.Header, + Host: request.Host, + ContentLength: request.ContentLength, + } + + if request.Body != nil { + b1 := new(bytes.Buffer) + b2 := new(bytes.Buffer) + w := io.MultiWriter(b1, b2) + io.Copy(w, request.Body) + request1.Body = nopCloser{b1} + request2.Body = nopCloser{b2} + + defer request.Body.Close() + } + + return +} + +func (client *Client) retryCheckResp(httpClient *http.Client, req *http.Request) (*http.Response, error) { + + req1, req2 := DuplicateRequest(req) + resp, errBody, err := client.checkResp(httpClient.Do(req1)) + if errBody == nil && err != nil { + return &http.Response{}, err + } else if errBody != nil && err != nil { + if resp == nil { + return nil, errors.New("Problem getting response from endpoint") + } + + if resp.StatusCode == 401 && errBody.MajorErrorCode == 0 { + _, err := client.Authenticate(client.configConnect) + if err != nil { + return nil, fmt.Errorf("Error re-authenticating: %s", err) + } + + ioutil.ReadAll(resp.Body) + resp.Body.Close() + + req2.SetBasicAuth("", client.Token) + resp, errBody, err = client.checkResp(httpClient.Do(req2)) + if err != nil { + return &http.Response{}, errors.New(errBody.Message) + } + } else { + return &http.Response{}, errors.New(errBody.Message) + } + } + + return resp, nil +} + +func (client *Client) checkResp(resp *http.Response, err error) (*http.Response, *types.Error, error) { + if err != nil { + return resp, &types.Error{}, err + } + + switch i := resp.StatusCode; { + // Valid request, return the response. + case i == 200 || i == 201 || i == 202 || i == 204: + return resp, &types.Error{}, nil + // Invalid request, parse the XML error returned and return it. + case i == 400 || i == 401 || i == 403 || i == 404 || i == 405 || i == 406 || i == 409 || i == 415 || i == 500 || i == 503 || i == 504: + errBody, err := client.parseErr(resp) + return resp, errBody, err + // Unhandled response. + default: + return nil, &types.Error{}, fmt.Errorf("unhandled API response, please report this issue, status code: %s", resp.Status) + } +} + +func (client *Client) decodeBody(resp *http.Response, out interface{}) error { + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + if client.ShowBody { + var prettyJSON bytes.Buffer + _ = json.Indent(&prettyJSON, body, "", " ") + log.WithField("body", prettyJSON.String()).Debug( + "print decoded body") + } + + if err = json.Unmarshal(body, &out); err != nil { + return err + } + + return nil +} + +func (client *Client) parseErr(resp *http.Response) (*types.Error, error) { + + errBody := new(types.Error) + + // if there was an error decoding the body, just return that + if err := client.decodeBody(resp, errBody); err != nil { + return &types.Error{}, fmt.Errorf("error parsing error body for non-200 request: %s", err) + } + + return errBody, fmt.Errorf("API (%d) Error: %d: %s", resp.StatusCode, errBody.MajorErrorCode, errBody.Message) +} + +func (c *Client) NewRequest(params map[string]string, method string, u url.URL, body io.Reader) *http.Request { + + if log.GetLevel() == log.DebugLevel && c.ShowBody && body != nil { + buf := new(bytes.Buffer) + buf.ReadFrom(body) + log.WithField("body", buf.String()).Debug("print new request body") + } + + p := url.Values{} + + for k, v := range params { + p.Add(k, v) + } + + u.RawQuery = p.Encode() + + req, _ := http.NewRequest(method, u.String(), body) + + return req + +} + +func NewClient() (client *Client, err error) { + return NewClientWithArgs( + os.Getenv("GOSCALEIO_ENDPOINT"), + os.Getenv("GOSCALEIO_VERSION"), + os.Getenv("GOSCALEIO_INSECURE") == "true", + os.Getenv("GOSCALEIO_USECERTS") == "true") +} + +func NewClientWithArgs( + endpoint string, + version string, + insecure, + useCerts bool) (client *Client, err error) { + + fields := map[string]interface{}{ + "endpoint": endpoint, + "insecure": insecure, + "useCerts": useCerts, + "version": version, + } + + var uri *url.URL + + if endpoint != "" { + uri, err = url.ParseRequestURI(endpoint) + if err != nil { + return &Client{}, + withFieldsE(fields, "error parsing endpoint", err) + } + } else { + return &Client{}, + withFields(fields, "endpoint is required") + } + + client = &Client{ + SIOEndpoint: *uri, + Http: http.Client{ + Transport: &http.Transport{ + TLSHandshakeTimeout: 120 * time.Second, + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: insecure, + }, + }, + }, + } + + if useCerts { + pool := x509.NewCertPool() + pool.AppendCertsFromPEM(pemCerts) + + client.Http.Transport = &http.Transport{ + TLSHandshakeTimeout: 120 * time.Second, + TLSClientConfig: &tls.Config{ + RootCAs: pool, + InsecureSkipVerify: insecure, + }, + } + } + + client.configConnect = &ConfigConnect{ + Version: version, + } + + return client, nil +} + +func GetLink(links []*types.Link, rel string) (*types.Link, error) { + for _, link := range links { + if link.Rel == rel { + return link, nil + } + } + + return &types.Link{}, errors.New("Couldn't find link") +} + +func withFields(fields map[string]interface{}, message string) error { + return withFieldsE(fields, message, nil) +} + +func withFieldsE( + fields map[string]interface{}, message string, inner error) error { + + if fields == nil { + fields = make(map[string]interface{}) + } + + if inner != nil { + fields["inner"] = inner + } + + x := 0 + l := len(fields) + + var b bytes.Buffer + for k, v := range fields { + if x < l-1 { + b.WriteString(fmt.Sprintf("%s=%v,", k, v)) + } else { + b.WriteString(fmt.Sprintf("%s=%v", k, v)) + } + x = x + 1 + } + + return newf("%s %s", message, b.String()) +} + +func newf(format string, a ...interface{}) error { + return errors.New(fmt.Sprintf(format, a)) +} diff --git a/vendor/github.com/codedellemc/goscaleio/certs.go b/vendor/github.com/codedellemc/goscaleio/certs.go new file mode 100644 index 00000000000..976d8f3274c --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/certs.go @@ -0,0 +1,4232 @@ +package goscaleio + +//https://raw.githubusercontent.com/kelseyhightower/contributors/master/certs.go + +var pemCerts = []byte(` +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB +VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp +bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R +dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw +MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy +dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 +ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM +EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj +lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ +znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH +2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 +k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs +2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD +VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG +KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ +8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R +FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE +DNuxUCAKGkq6ahq97BvIxYSazQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx +CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp +ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa +QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw +NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft +ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu +QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG +qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL +fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ +Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 +Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ +54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b +MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j +ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej +YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt +A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF +rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ +pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB +lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy +YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 +7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs +YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 +xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc +unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ +Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp +ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 +gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 +jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ +XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD +W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ +RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r +MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk +BYn8eNZcLCZDqQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc +MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp +b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT +AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs +aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H +j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K +f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 +IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw +FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht +QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm +/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ +k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ +MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC +seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ +hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ +eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U +DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj +B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 +ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX +l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB +HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B +5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 +WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP +gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ +DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu +BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs +h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk +LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg +isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z +NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI ++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R +hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ +mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP +Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s +EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 +mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC +e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow +dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET +MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE +AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw +CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg +YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE +Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX +mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD +XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW +S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp +FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD +AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu +ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z +ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv +Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw +DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 +yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq +EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB +EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN +PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD +TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 +MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF +Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh +IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 +dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO +V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC +GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN +v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB +AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB +Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO +76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK +OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH +ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi +yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL +buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj +2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC +Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g +Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 +aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa +Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg +SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo +aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp +ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z +7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// +DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx +zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 +hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs +4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u +gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY +NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 +j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG +52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB +echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI +zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy +wy39FCqQmbkHzJ8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0 +MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG +EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT +CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK +8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2 +98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb +2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC +ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi +Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB +o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl +ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD +AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL +AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd +foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M +cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq +8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp +hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk +Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw +PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu +MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx +GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL +MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf +HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh +gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW +v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue +Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr +9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt +6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 +MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl +Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 +ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq +hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p +iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC +dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL +kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL +hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp +Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp +a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx +MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg +R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU +MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT +L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H +5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC +90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 +c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE +VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP +qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S +/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj +/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X +KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV +BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt +ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 +MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl +a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h +4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk +tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s +tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL +dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 +c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um +TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z ++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O +Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW +OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW +fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 +l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw +FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ +8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI +6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO +TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME +wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY +Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn +xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q +DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q +Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t +hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 +7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 +QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN +AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp +dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw +MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw +CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ +MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB +SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz +ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH +LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP +PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL +2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w +ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC +MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk +AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 +AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz +AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz +AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f +BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY +P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi +CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g +kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 +HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS +na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q +qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z +TbvGRNs2yyqcjg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw +cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy +b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z +ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 +NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN +TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p +Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u +uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ +LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA +vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 +Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx +62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB +AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw +LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP +BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB +AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov +MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 +ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT +AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh +ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo +AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa +AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln +bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p +Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP +PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv +Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB +EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu +w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj +cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV +HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI +VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS +BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS +b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS +8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds +ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl +7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR +hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ +MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD +EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz +aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w +MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l +dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh +bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq +eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe +r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 +3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd +vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l +mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC +wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg +hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 +TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg +ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg +dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 +b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl +c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 +ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 +dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu +ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo +ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 +Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u +ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA +A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ +MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ +NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR +VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY +83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 +macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF +UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ +R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN +MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw +JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ +WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj +SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl +u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy +A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk +Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 +MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr +aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC +IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A +cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA +YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA +bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA +bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA +aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA +ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA +YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA +ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA +LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 +Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y +eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw +CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G +A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu +Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn +lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt +b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg +9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF +ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC +IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcp +MRIwEAYDVQQHEwlTdHV0dGdhcnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fz +c2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVTLVRSVVNUIEF1dGhlbnRpY2F0aW9u +IGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0wNTA2MjIwMDAwMDBa +Fw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFkZW4t +V3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMg +RGV1dHNjaGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJV +U1QgQXV0aGVudGljYXRpb24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBO +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1 +toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob4QSwI7+Vio5bG0F/WsPo +TUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXLg3KSwlOy +ggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1 +XgqfeN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteF +hy+S8dF2g08LOlk3KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm +7QIDAQABo4GSMIGPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEG +MCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJvbmxpbmUxLTIwNDgtNTAdBgNV +HQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAUD8oeXHngovMp +ttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFo +LtU96G7m1R08P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersF +iXOMy6ZNwPv2AtawB6MDwidAnwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0y +h9WUUpY6RsZxlj33mA6ykaqP2vROJAA5VeitF7nTNCtKqUDMFypVZUF0Qn71wK/I +k63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8bHz2eBIPdltkdOpQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGGTCCBAGgAwIBAgIIPtVRGeZNzn4wDQYJKoZIhvcNAQELBQAwajEhMB8GA1UE +AxMYU0cgVFJVU1QgU0VSVklDRVMgUkFDSU5FMRwwGgYDVQQLExMwMDAyIDQzNTI1 +Mjg5NTAwMDIyMRowGAYDVQQKExFTRyBUUlVTVCBTRVJWSUNFUzELMAkGA1UEBhMC +RlIwHhcNMTAwOTA2MTI1MzQyWhcNMzAwOTA1MTI1MzQyWjBqMSEwHwYDVQQDExhT +RyBUUlVTVCBTRVJWSUNFUyBSQUNJTkUxHDAaBgNVBAsTEzAwMDIgNDM1MjUyODk1 +MDAwMjIxGjAYBgNVBAoTEVNHIFRSVVNUIFNFUlZJQ0VTMQswCQYDVQQGEwJGUjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANqoVgLsfJXwTukK0rcHoyKL +ULO5Lhk9V9sZqtIr5M5C4myh5F0lHjMdtkXRtPpZilZwyW0IdmlwmubHnAgwE/7m +0ZJoYT5MEfJu8rF7V1ZLCb3cD9lxDOiaN94iEByZXtaxFwfTpDktwhpz/cpLKQfC +eSnIyCauLMT8I8hL4oZWDyj9tocbaF85ZEX9aINsdSQePHWZYfrSFPipS7HYfad4 +0hNiZbXWvn5qA7y1svxkMMPQwpk9maTTzdGxxFOHe0wTE2Z/v9VlU2j5XB7ltP82 +mUWjn2LAfxGCAVTeD2WlOa6dSEyJoxA74OaD9bDaLB56HFwfAKzMq6dgZLPGxXvH +VUZ0PJCBDkqOWZ1UsEixUkw7mO6r2jS3U81J2i/rlb4MVxH2lkwEeVyZ1eXkvm/q +R+5RS+8iJq612BGqQ7t4vwt+tN3PdB0lqYljseI0gcSINTjiAg0PE8nVKoIV8IrE +QzJW5FMdHay2z32bll0eZOl0c8RW5BZKUm2SOdPhTQ4/YrnerbUdZbldUv5dCamc +tKQM2S9FdqXPjmqanqqwEaHrYcbrPx78ZrQSnUZ/MhaJvnFFr5Eh2f2Tv7QCkUL/ +SR/tixVo3R+OrJvdggWcRGkWZBdWX0EPSk8ED2VQhpOX7EW/XcIc3M/E2DrmeAXQ +xVVVqV7+qzohu+VyFPcLAgMBAAGjgcIwgb8wHQYDVR0OBBYEFCkgy/HDD9oGjhOT +h/5fYBopu/O2MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUKSDL8cMP2gaO +E5OH/l9gGim787YwEQYDVR0gBAowCDAGBgRVHSAAMEkGA1UdHwRCMEAwPqA8oDqG +OGh0dHA6Ly9jcmwuc2d0cnVzdHNlcnZpY2VzLmNvbS9yYWNpbmUtR3JvdXBlU0cv +TGF0ZXN0Q1JMMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEATEZn +4ERQ9cW2urJRCiUTHbfHiC4fuStkoMuTiFJZqmD1zClSF/8E5ze0MRFGfisebKeL +PEeaXvSqXZA7RT2fSsmKe47A7j55i5KjyJRKuCgRa6YlX129x8j7g09VMeZc8BN8 +471/Kiw3N5RJr4QfFCeiWBCPCjk3GhIgQY8Z9qkfGe2yNLKtfTNEi18KB0PydkVF +La3kjQ4A/QQIqudr+xe9sAhWDjUqcvCz5006Tw3c82ASszhkjNv54SaNL+9O6CRH +PjY0imkPKGuLh8a9hSb50+tpIVZgkdb34GLCqHGuLt5mI7VSRqakSDcsfwEWVxH3 +Jw0O5Q/WkEXhHj8h3NL8FhgTPk1qsiZqQF4leP049KxYejcbmEAEx47J1MRnYbGY +rvDNDty5r2WDewoEij9hqvddQYbmxkzCTzpcVuooO6dEz8hKZPVyYC3jQ7hK4HU8 +MuSqFtcRucFF2ZtmY2blIrc07rrVdC8lZPOBVMt33lfUk+OsBzE6PlwDg1dTx/D+ +aNglUE0SyObhlY1nqzyTPxcCujjXnvcwpT09RAEzGpqfjtCf8e4wiHPvriQZupdz +FcHscQyEZLV77LxpPqRtCRY2yko5isune8YdfucziMm+MG2chZUh6Uc7Bn6B4upG +5nBYgOao8p0LadEziVkw82TTC/bOKwn7fRB2LhA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx +MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG +29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk +oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk +3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL +qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN +nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX +ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H +DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO +TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w +zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr +jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r +0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f +2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP +ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF +y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA +tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL +6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 +uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL +acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh +k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q +VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh +b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R +fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv +/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI +REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx +srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv +aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT +woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n +Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W +t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N +8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 +9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 +wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw +ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp +dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 +IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD +VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy +dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg +MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx +UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD +1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH +oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR +HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ +5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv +idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL +OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC +NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f +46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB +UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth +7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G +A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB +bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x +XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T +PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 +Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 +WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL +Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm +7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S +nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN +vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB +WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI +fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb +I+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa +Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV +BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l +dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE +AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B +YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 +hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l +L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm +SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM +1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw +Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 +aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u +7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 +xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ +rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim +eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk +USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f +zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi +TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW +NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV +Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx +IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs +cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 +MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl +bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD +DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r +WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU +Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs +HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj +z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf +SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl +AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG +KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P +AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j +BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC +VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX +ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB +ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd +/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB +A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn +k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 +iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv +2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE-----`) diff --git a/vendor/github.com/codedellemc/goscaleio/device.go b/vendor/github.com/codedellemc/goscaleio/device.go new file mode 100644 index 00000000000..d29cb4e4174 --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/device.go @@ -0,0 +1,110 @@ +package goscaleio + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "reflect" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +type Device struct { + Device *types.Device + client *Client +} + +func NewDevice(client *Client) *Device { + return &Device{ + Device: new(types.Device), + client: client, + } +} + +func NewDeviceEx(client *Client, device *types.Device) *Device { + return &Device{ + Device: device, + client: client, + } +} + +func (storagePool *StoragePool) AttachDevice(path string, sdsID string) (string, error) { + endpoint := storagePool.client.SIOEndpoint + + deviceParam := &types.DeviceParam{} + deviceParam.Name = path + deviceParam.DeviceCurrentPathname = path + deviceParam.StoragePoolID = storagePool.StoragePool.ID + deviceParam.SdsID = sdsID + deviceParam.TestMode = "testAndActivate" + + jsonOutput, err := json.Marshal(&deviceParam) + if err != nil { + return "", fmt.Errorf("error marshaling: %s", err) + } + endpoint.Path = fmt.Sprintf("/api/types/Device/instances") + + req := storagePool.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", storagePool.client.Token) + req.Header.Add("Accept", "application/json;version="+storagePool.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+storagePool.client.configConnect.Version) + + resp, err := storagePool.client.retryCheckResp(&storagePool.client.Http, req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", errors.New("error reading body") + } + + var dev types.DeviceResp + err = json.Unmarshal(bs, &dev) + if err != nil { + return "", err + } + + return dev.ID, nil +} + +func (storagePool *StoragePool) GetDevice() (devices []types.Device, err error) { + endpoint := storagePool.client.SIOEndpoint + endpoint.Path = fmt.Sprintf("/api/instances/StoragePool::%v/relationships/Device", storagePool.StoragePool.ID) + + req := storagePool.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", storagePool.client.Token) + req.Header.Add("Accept", "application/json;version="+storagePool.client.configConnect.Version) + + resp, err := storagePool.client.retryCheckResp(&storagePool.client.Http, req) + if err != nil { + return []types.Device{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = storagePool.client.decodeBody(resp, &devices); err != nil { + return []types.Device{}, fmt.Errorf("error decoding instances response: %s", err) + } + + return devices, nil +} + +func (storagePool *StoragePool) FindDevice(field, value string) (device *types.Device, err error) { + devices, err := storagePool.GetDevice() + if err != nil { + return &types.Device{}, nil + } + + for _, device := range devices { + valueOf := reflect.ValueOf(device) + switch { + case reflect.Indirect(valueOf).FieldByName(field).String() == value: + return &device, nil + } + } + + return &types.Device{}, errors.New("Couldn't find DEV") +} diff --git a/vendor/github.com/codedellemc/goscaleio/instance.go b/vendor/github.com/codedellemc/goscaleio/instance.go new file mode 100644 index 00000000000..b5c41f2ee6c --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/instance.go @@ -0,0 +1,228 @@ +package goscaleio + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "strings" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +func (client *Client) GetInstance(systemhref string) (systems []*types.System, err error) { + + endpoint := client.SIOEndpoint + if systemhref == "" { + endpoint.Path += "/types/System/instances" + } else { + endpoint.Path = systemhref + } + + req := client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", client.Token) + req.Header.Add("Accept", "application/json;version="+client.configConnect.Version) + + resp, err := client.retryCheckResp(&client.Http, req) + if err != nil { + return []*types.System{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if systemhref == "" { + if err = client.decodeBody(resp, &systems); err != nil { + return []*types.System{}, fmt.Errorf("error decoding instances response: %s", err) + } + } else { + system := &types.System{} + if err = client.decodeBody(resp, &system); err != nil { + return []*types.System{}, fmt.Errorf("error decoding instances response: %s", err) + } + systems = append(systems, system) + } + + // bs, err := ioutil.ReadAll(resp.Body) + // if err != nil { + // return types.Systems{}, errors.New("error reading body") + // } + + return systems, nil +} + +func (client *Client) GetVolume(volumehref, volumeid, ancestorvolumeid, volumename string, getSnapshots bool) (volumes []*types.Volume, err error) { + + endpoint := client.SIOEndpoint + + if volumename != "" { + volumeid, err = client.FindVolumeID(volumename) + if err != nil && err.Error() == "Not found" { + return nil, nil + } + if err != nil { + return []*types.Volume{}, fmt.Errorf("Error: problem finding volume: %s", err) + } + } + + if volumeid != "" { + endpoint.Path = fmt.Sprintf("/api/instances/Volume::%s", volumeid) + } else if volumehref == "" { + endpoint.Path = "/api/types/Volume/instances" + } else { + endpoint.Path = volumehref + } + + req := client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", client.Token) + req.Header.Add("Accept", "application/json;version="+client.configConnect.Version) + + resp, err := client.retryCheckResp(&client.Http, req) + if err != nil { + return []*types.Volume{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if volumehref == "" && volumeid == "" { + if err = client.decodeBody(resp, &volumes); err != nil { + return []*types.Volume{}, fmt.Errorf("error decoding storage pool response: %s", err) + } + var volumesNew []*types.Volume + for _, volume := range volumes { + if (!getSnapshots && volume.AncestorVolumeID == ancestorvolumeid) || (getSnapshots && volume.AncestorVolumeID != "") { + volumesNew = append(volumesNew, volume) + } + } + volumes = volumesNew + } else { + volume := &types.Volume{} + if err = client.decodeBody(resp, &volume); err != nil { + return []*types.Volume{}, fmt.Errorf("error decoding instances response: %s", err) + } + volumes = append(volumes, volume) + } + return volumes, nil +} + +func (client *Client) FindVolumeID(volumename string) (volumeID string, err error) { + + endpoint := client.SIOEndpoint + + volumeQeryIdByKeyParam := &types.VolumeQeryIdByKeyParam{} + volumeQeryIdByKeyParam.Name = volumename + + jsonOutput, err := json.Marshal(&volumeQeryIdByKeyParam) + if err != nil { + return "", fmt.Errorf("error marshaling: %s", err) + } + endpoint.Path = fmt.Sprintf("/api/types/Volume/instances/action/queryIdByKey") + + req := client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", client.Token) + req.Header.Add("Accept", "application/json;version="+client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+client.configConnect.Version) + + resp, err := client.retryCheckResp(&client.Http, req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", errors.New("error reading body") + } + + volumeID = string(bs) + + volumeID = strings.TrimRight(volumeID, `"`) + volumeID = strings.TrimLeft(volumeID, `"`) + + return volumeID, nil +} + +func (client *Client) CreateVolume(volume *types.VolumeParam, storagePoolName string) (volumeResp *types.VolumeResp, err error) { + + endpoint := client.SIOEndpoint + + endpoint.Path = "/api/types/Volume/instances" + + storagePool, err := client.FindStoragePool("", storagePoolName, "") + if err != nil { + return nil, err + } + + volume.StoragePoolID = storagePool.ID + volume.ProtectionDomainID = storagePool.ProtectionDomainID + + jsonOutput, err := json.Marshal(&volume) + if err != nil { + return &types.VolumeResp{}, fmt.Errorf("error marshaling: %s", err) + } + + req := client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", client.Token) + req.Header.Add("Accept", "application/json;version="+client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+client.configConnect.Version) + + resp, err := client.retryCheckResp(&client.Http, req) + if err != nil { + return &types.VolumeResp{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = client.decodeBody(resp, &volumeResp); err != nil { + return &types.VolumeResp{}, fmt.Errorf("error decoding volume creation response: %s", err) + } + + return volumeResp, nil +} + +func (client *Client) GetStoragePool(storagepoolhref string) (storagePools []*types.StoragePool, err error) { + + endpoint := client.SIOEndpoint + + if storagepoolhref == "" { + endpoint.Path = "/api/types/StoragePool/instances" + } else { + endpoint.Path = storagepoolhref + } + + req := client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", client.Token) + req.Header.Add("Accept", "application/json;version="+client.configConnect.Version) + + resp, err := client.retryCheckResp(&client.Http, req) + if err != nil { + return []*types.StoragePool{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if storagepoolhref == "" { + if err = client.decodeBody(resp, &storagePools); err != nil { + return []*types.StoragePool{}, fmt.Errorf("error decoding storage pool response: %s", err) + } + } else { + storagePool := &types.StoragePool{} + if err = client.decodeBody(resp, &storagePool); err != nil { + return []*types.StoragePool{}, fmt.Errorf("error decoding instances response: %s", err) + } + storagePools = append(storagePools, storagePool) + } + return storagePools, nil +} + +func (client *Client) FindStoragePool(id, name, href string) (storagePool *types.StoragePool, err error) { + storagePools, err := client.GetStoragePool(href) + if err != nil { + return &types.StoragePool{}, fmt.Errorf("Error getting storage pool %s", err) + } + + for _, storagePool = range storagePools { + if storagePool.ID == id || storagePool.Name == name || href != "" { + return storagePool, nil + } + } + + return &types.StoragePool{}, errors.New("Couldn't find storage pool") + +} diff --git a/vendor/github.com/codedellemc/goscaleio/protectiondomain.go b/vendor/github.com/codedellemc/goscaleio/protectiondomain.go new file mode 100644 index 00000000000..5731136379d --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/protectiondomain.go @@ -0,0 +1,131 @@ +package goscaleio + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +type ProtectionDomain struct { + ProtectionDomain *types.ProtectionDomain + client *Client +} + +func NewProtectionDomain(client *Client) *ProtectionDomain { + return &ProtectionDomain{ + ProtectionDomain: new(types.ProtectionDomain), + client: client, + } +} + +func NewProtectionDomainEx(client *Client, pd *types.ProtectionDomain) *ProtectionDomain { + return &ProtectionDomain{ + ProtectionDomain: pd, + client: client, + } +} + +func (system *System) CreateProtectionDomain(name string) (string, error) { + endpoint := system.client.SIOEndpoint + + protectionDomainParam := &types.ProtectionDomainParam{} + protectionDomainParam.Name = name + + jsonOutput, err := json.Marshal(&protectionDomainParam) + if err != nil { + return "", fmt.Errorf("error marshaling: %s", err) + } + endpoint.Path = fmt.Sprintf("/api/types/ProtectionDomain/instances") + + req := system.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", system.client.Token) + req.Header.Add("Accept", "application/json;version="+system.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+system.client.configConnect.Version) + + resp, err := system.client.retryCheckResp(&system.client.Http, req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", errors.New("error reading body") + } + + var pd types.ProtectionDomainResp + err = json.Unmarshal(bs, &pd) + if err != nil { + return "", err + } + + return pd.ID, nil +} + +func (system *System) GetProtectionDomain(protectiondomainhref string) (protectionDomains []*types.ProtectionDomain, err error) { + + endpoint := system.client.SIOEndpoint + + if protectiondomainhref == "" { + link, err := GetLink(system.System.Links, "/api/System/relationship/ProtectionDomain") + if err != nil { + return []*types.ProtectionDomain{}, errors.New("Error: problem finding link") + } + + endpoint.Path = link.HREF + } else { + endpoint.Path = protectiondomainhref + } + + req := system.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", system.client.Token) + req.Header.Add("Accept", "application/json;version="+system.client.configConnect.Version) + + resp, err := system.client.retryCheckResp(&system.client.Http, req) + if err != nil { + return []*types.ProtectionDomain{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if protectiondomainhref == "" { + if err = system.client.decodeBody(resp, &protectionDomains); err != nil { + return []*types.ProtectionDomain{}, fmt.Errorf("error decoding instances response: %s", err) + } + } else { + protectionDomain := &types.ProtectionDomain{} + if err = system.client.decodeBody(resp, &protectionDomain); err != nil { + return []*types.ProtectionDomain{}, fmt.Errorf("error decoding instances response: %s", err) + } + protectionDomains = append(protectionDomains, protectionDomain) + + } + // + // bs, err := ioutil.ReadAll(resp.Body) + // if err != nil { + // return []types.ProtectionDomain{}, errors.New("error reading body") + // } + // + // fmt.Println(string(bs)) + // log.Fatalf("here") + // return []types.ProtectionDomain{}, nil + return protectionDomains, nil +} + +func (system *System) FindProtectionDomain(id, name, href string) (protectionDomain *types.ProtectionDomain, err error) { + protectionDomains, err := system.GetProtectionDomain(href) + if err != nil { + return &types.ProtectionDomain{}, fmt.Errorf("Error getting protection domains %s", err) + } + + for _, protectionDomain = range protectionDomains { + if protectionDomain.ID == id || protectionDomain.Name == name || href != "" { + return protectionDomain, nil + } + } + + return &types.ProtectionDomain{}, errors.New("Couldn't find protection domain") +} diff --git a/vendor/github.com/codedellemc/goscaleio/scsiinitiator.go b/vendor/github.com/codedellemc/goscaleio/scsiinitiator.go new file mode 100644 index 00000000000..3c4d2443397 --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/scsiinitiator.go @@ -0,0 +1,35 @@ +package goscaleio + +import ( + "fmt" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +func (system *System) GetScsiInitiator() (scsiInitiators []types.ScsiInitiator, err error) { + endpoint := system.client.SIOEndpoint + endpoint.Path = fmt.Sprintf("/api/instances/System::%v/relationships/ScsiInitiator", system.System.ID) + + req := system.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", system.client.Token) + req.Header.Add("Accept", "application/json;version="+system.client.configConnect.Version) + + resp, err := system.client.retryCheckResp(&system.client.Http, req) + if err != nil { + return []types.ScsiInitiator{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = system.client.decodeBody(resp, &scsiInitiators); err != nil { + return []types.ScsiInitiator{}, fmt.Errorf("error decoding instances response: %s", err) + } + + // bs, err := ioutil.ReadAll(resp.Body) + // if err != nil { + // return types.ScsiInitiator{}, errors.New("error reading body") + // } + // + // log.Fatalf("here") + // return types.ScsiInitiator{}, nil + return scsiInitiators, nil +} diff --git a/vendor/github.com/codedellemc/goscaleio/sdc.go b/vendor/github.com/codedellemc/goscaleio/sdc.go new file mode 100644 index 00000000000..97d2fb70f09 --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/sdc.go @@ -0,0 +1,188 @@ +package goscaleio + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "log" + "os/exec" + "reflect" + "strings" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +type Sdc struct { + Sdc *types.Sdc + client *Client +} + +func NewSdc(client *Client, sdc *types.Sdc) *Sdc { + return &Sdc{ + Sdc: sdc, + client: client, + } +} + +func (system *System) GetSdc() (sdcs []types.Sdc, err error) { + endpoint := system.client.SIOEndpoint + endpoint.Path = fmt.Sprintf("/api/instances/System::%v/relationships/Sdc", system.System.ID) + + req := system.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", system.client.Token) + req.Header.Add("Accept", "application/json;version="+system.client.configConnect.Version) + + resp, err := system.client.retryCheckResp(&system.client.Http, req) + if err != nil { + return []types.Sdc{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = system.client.decodeBody(resp, &sdcs); err != nil { + return []types.Sdc{}, fmt.Errorf("error decoding instances response: %s", err) + } + + // bs, err := ioutil.ReadAll(resp.Body) + // if err != nil { + // return []types.Sdc{}, errors.New("error reading body") + // } + // + // fmt.Println(string(bs)) + // log.Fatalf("here") + // return []types.Sdc{}, nil + return sdcs, nil +} + +func (system *System) FindSdc(field, value string) (sdc *Sdc, err error) { + sdcs, err := system.GetSdc() + if err != nil { + return &Sdc{}, nil + } + + for _, sdc := range sdcs { + valueOf := reflect.ValueOf(sdc) + switch { + case reflect.Indirect(valueOf).FieldByName(field).String() == value: + return NewSdc(system.client, &sdc), nil + } + } + + return &Sdc{}, errors.New("Couldn't find SDC") +} + +func (sdc *Sdc) GetStatistics() (statistics *types.Statistics, err error) { + endpoint := sdc.client.SIOEndpoint + + link, err := GetLink(sdc.Sdc.Links, "/api/Sdc/relationship/Statistics") + if err != nil { + return &types.Statistics{}, errors.New("Error: problem finding link") + } + endpoint.Path = link.HREF + + req := sdc.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", sdc.client.Token) + req.Header.Add("Accept", "application/json;version="+sdc.client.configConnect.Version) + + resp, err := sdc.client.retryCheckResp(&sdc.client.Http, req) + if err != nil { + return &types.Statistics{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = sdc.client.decodeBody(resp, &statistics); err != nil { + return &types.Statistics{}, fmt.Errorf("error decoding instances response: %s", err) + } + + return statistics, nil +} + +func (sdc *Sdc) GetVolume() (volumes []*types.Volume, err error) { + endpoint := sdc.client.SIOEndpoint + + link, err := GetLink(sdc.Sdc.Links, "/api/Sdc/relationship/Volume") + if err != nil { + return []*types.Volume{}, errors.New("Error: problem finding link") + } + endpoint.Path = link.HREF + + req := sdc.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", sdc.client.Token) + req.Header.Add("Accept", "application/json;version="+sdc.client.configConnect.Version) + + resp, err := sdc.client.retryCheckResp(&sdc.client.Http, req) + if err != nil { + return []*types.Volume{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = sdc.client.decodeBody(resp, &volumes); err != nil { + return []*types.Volume{}, fmt.Errorf("error decoding instances response: %s", err) + } + + return volumes, nil +} + +func GetSdcLocalGUID() (sdcGUID string, err error) { + + // get sdc kernel guid + // /bin/emc/scaleio/drv_cfg --query_guid + // sdcKernelGuid := "271bad82-08ee-44f2-a2b1-7e2787c27be1" + + out, err := exec.Command("/opt/emc/scaleio/sdc/bin/drv_cfg", "--query_guid").Output() + if err != nil { + return "", fmt.Errorf("Error querying volumes: ", err) + } + + sdcGUID = strings.Replace(string(out), "\n", "", -1) + + return sdcGUID, nil +} + +func (volume *Volume) MapVolumeSdc(mapVolumeSdcParam *types.MapVolumeSdcParam) (err error) { + endpoint := volume.client.SIOEndpoint + + endpoint.Path = fmt.Sprintf("/api/instances/Volume::%s/action/addMappedSdc", volume.Volume.ID) + + jsonOutput, err := json.Marshal(&mapVolumeSdcParam) + if err != nil { + log.Fatalf("error marshaling: %s", err) + } + + req := volume.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", volume.client.Token) + req.Header.Add("Accept", "application/json;version="+volume.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+volume.client.configConnect.Version) + + resp, err := volume.client.retryCheckResp(&volume.client.Http, req) + if err != nil { + return fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + return nil +} + +func (volume *Volume) UnmapVolumeSdc(unmapVolumeSdcParam *types.UnmapVolumeSdcParam) (err error) { + endpoint := volume.client.SIOEndpoint + + endpoint.Path = fmt.Sprintf("/api/instances/Volume::%s/action/removeMappedSdc", volume.Volume.ID) + + jsonOutput, err := json.Marshal(&unmapVolumeSdcParam) + if err != nil { + return fmt.Errorf("error marshaling: %s", err) + } + + req := volume.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", volume.client.Token) + req.Header.Add("Accept", "application/json;version="+volume.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+volume.client.configConnect.Version) + + resp, err := volume.client.retryCheckResp(&volume.client.Http, req) + if err != nil { + return fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + return nil +} diff --git a/vendor/github.com/codedellemc/goscaleio/sds.go b/vendor/github.com/codedellemc/goscaleio/sds.go new file mode 100644 index 00000000000..7ca5483ed84 --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/sds.go @@ -0,0 +1,122 @@ +package goscaleio + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "reflect" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +type Sds struct { + Sds *types.Sds + client *Client +} + +func NewSds(client *Client) *Sds { + return &Sds{ + Sds: new(types.Sds), + client: client, + } +} + +func NewSdsEx(client *Client, sds *types.Sds) *Sds { + return &Sds{ + Sds: sds, + client: client, + } +} + +func (protectionDomain *ProtectionDomain) CreateSds(name string, ipList []string) (string, error) { + endpoint := protectionDomain.client.SIOEndpoint + + sdsParam := &types.SdsParam{} + sdsParam.Name = name + sdsParam.ProtectionDomainID = protectionDomain.ProtectionDomain.ID + + if len(ipList) == 0 { + return "", fmt.Errorf("Must provide at least 1 SDS IP") + } else if len(ipList) == 1 { + sdsIP := types.SdsIp{IP: ipList[0], Role: "all"} + sdsIPList := &types.SdsIpList{sdsIP} + sdsParam.IPList = append(sdsParam.IPList, sdsIPList) + } else if len(ipList) >= 2 { + sdsIP1 := types.SdsIp{IP: ipList[0], Role: "sdcOnly"} + sdsIP2 := types.SdsIp{IP: ipList[1], Role: "sdsOnly"} + sdsIPList1 := &types.SdsIpList{sdsIP1} + sdsIPList2 := &types.SdsIpList{sdsIP2} + sdsParam.IPList = append(sdsParam.IPList, sdsIPList1) + sdsParam.IPList = append(sdsParam.IPList, sdsIPList2) + } + + jsonOutput, err := json.Marshal(&sdsParam) + if err != nil { + return "", fmt.Errorf("error marshaling: %s", err) + } + endpoint.Path = fmt.Sprintf("/api/types/Sds/instances") + + req := protectionDomain.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", protectionDomain.client.Token) + req.Header.Add("Accept", "application/json;version="+protectionDomain.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+protectionDomain.client.configConnect.Version) + + resp, err := protectionDomain.client.retryCheckResp(&protectionDomain.client.Http, req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", errors.New("error reading body") + } + + var sds types.SdsResp + err = json.Unmarshal(bs, &sds) + if err != nil { + return "", err + } + + return sds.ID, nil +} + +func (protectionDomain *ProtectionDomain) GetSds() (sdss []types.Sds, err error) { + endpoint := protectionDomain.client.SIOEndpoint + endpoint.Path = fmt.Sprintf("/api/instances/ProtectionDomain::%v/relationships/Sds", protectionDomain.ProtectionDomain.ID) + + req := protectionDomain.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", protectionDomain.client.Token) + req.Header.Add("Accept", "application/json;version="+protectionDomain.client.configConnect.Version) + + resp, err := protectionDomain.client.retryCheckResp(&protectionDomain.client.Http, req) + if err != nil { + return []types.Sds{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = protectionDomain.client.decodeBody(resp, &sdss); err != nil { + return []types.Sds{}, fmt.Errorf("error decoding instances response: %s", err) + } + + return sdss, nil +} + +func (protectionDomain *ProtectionDomain) FindSds(field, value string) (sds *types.Sds, err error) { + sdss, err := protectionDomain.GetSds() + if err != nil { + return &types.Sds{}, nil + } + + for _, sds := range sdss { + valueOf := reflect.ValueOf(sds) + switch { + case reflect.Indirect(valueOf).FieldByName(field).String() == value: + return &sds, nil + } + } + + return &types.Sds{}, errors.New("Couldn't find SDS") +} diff --git a/vendor/github.com/codedellemc/goscaleio/storagepool.go b/vendor/github.com/codedellemc/goscaleio/storagepool.go new file mode 100644 index 00000000000..d1a16277c1e --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/storagepool.go @@ -0,0 +1,148 @@ +package goscaleio + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +type StoragePool struct { + StoragePool *types.StoragePool + client *Client +} + +func NewStoragePool(client *Client) *StoragePool { + return &StoragePool{ + StoragePool: new(types.StoragePool), + client: client, + } +} + +func NewStoragePoolEx(client *Client, pool *types.StoragePool) *StoragePool { + return &StoragePool{ + StoragePool: pool, + client: client, + } +} + +func (protectionDomain *ProtectionDomain) CreateStoragePool(name string) (string, error) { + endpoint := protectionDomain.client.SIOEndpoint + + storagePoolParam := &types.StoragePoolParam{} + storagePoolParam.Name = name + storagePoolParam.ProtectionDomainID = protectionDomain.ProtectionDomain.ID + + jsonOutput, err := json.Marshal(&storagePoolParam) + if err != nil { + return "", fmt.Errorf("error marshaling: %s", err) + } + endpoint.Path = fmt.Sprintf("/api/types/StoragePool/instances") + + req := protectionDomain.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", protectionDomain.client.Token) + req.Header.Add("Accept", "application/json;version="+protectionDomain.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+protectionDomain.client.configConnect.Version) + + resp, err := protectionDomain.client.retryCheckResp(&protectionDomain.client.Http, req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", errors.New("error reading body") + } + + var sp types.StoragePoolResp + err = json.Unmarshal(bs, &sp) + if err != nil { + return "", err + } + + return sp.ID, nil +} + +func (protectionDomain *ProtectionDomain) GetStoragePool(storagepoolhref string) (storagePools []*types.StoragePool, err error) { + + endpoint := protectionDomain.client.SIOEndpoint + + if storagepoolhref == "" { + link, err := GetLink(protectionDomain.ProtectionDomain.Links, "/api/ProtectionDomain/relationship/StoragePool") + if err != nil { + return []*types.StoragePool{}, errors.New("Error: problem finding link") + } + endpoint.Path = link.HREF + } else { + endpoint.Path = storagepoolhref + } + + req := protectionDomain.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", protectionDomain.client.Token) + req.Header.Add("Accept", "application/json;version="+protectionDomain.client.configConnect.Version) + + resp, err := protectionDomain.client.retryCheckResp(&protectionDomain.client.Http, req) + if err != nil { + return []*types.StoragePool{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if storagepoolhref == "" { + if err = protectionDomain.client.decodeBody(resp, &storagePools); err != nil { + return []*types.StoragePool{}, fmt.Errorf("error decoding storage pool response: %s", err) + } + } else { + storagePool := &types.StoragePool{} + if err = protectionDomain.client.decodeBody(resp, &storagePool); err != nil { + return []*types.StoragePool{}, fmt.Errorf("error decoding instances response: %s", err) + } + storagePools = append(storagePools, storagePool) + } + return storagePools, nil +} + +func (protectionDomain *ProtectionDomain) FindStoragePool(id, name, href string) (storagePool *types.StoragePool, err error) { + storagePools, err := protectionDomain.GetStoragePool(href) + if err != nil { + return &types.StoragePool{}, fmt.Errorf("Error getting protection domains %s", err) + } + + for _, storagePool = range storagePools { + if storagePool.ID == id || storagePool.Name == name || href != "" { + return storagePool, nil + } + } + + return &types.StoragePool{}, errors.New("Couldn't find protection domain") + +} + +func (storagePool *StoragePool) GetStatistics() (statistics *types.Statistics, err error) { + link, err := GetLink(storagePool.StoragePool.Links, "/api/StoragePool/relationship/Statistics") + if err != nil { + return &types.Statistics{}, errors.New("Error: problem finding link") + } + + endpoint := storagePool.client.SIOEndpoint + endpoint.Path = link.HREF + + req := storagePool.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", storagePool.client.Token) + req.Header.Add("Accept", "application/json;version="+storagePool.client.configConnect.Version) + + resp, err := storagePool.client.retryCheckResp(&storagePool.client.Http, req) + if err != nil { + return &types.Statistics{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = storagePool.client.decodeBody(resp, &statistics); err != nil { + return &types.Statistics{}, fmt.Errorf("error decoding instances response: %s", err) + } + + return statistics, nil +} diff --git a/vendor/github.com/codedellemc/goscaleio/system.go b/vendor/github.com/codedellemc/goscaleio/system.go new file mode 100644 index 00000000000..9b67c843e5b --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/system.go @@ -0,0 +1,106 @@ +package goscaleio + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +type System struct { + System *types.System + client *Client +} + +func NewSystem(client *Client) *System { + return &System{ + System: new(types.System), + client: client, + } +} + +func (client *Client) FindSystem(instanceID, name, href string) (*System, error) { + systems, err := client.GetInstance(href) + if err != nil { + return &System{}, fmt.Errorf("err: problem getting instances: %s", err) + } + + for _, system := range systems { + if system.ID == instanceID || system.Name == name || href != "" { + outSystem := NewSystem(client) + outSystem.System = system + return outSystem, nil + } + } + return &System{}, fmt.Errorf("err: systemid or systemname not found") +} + +func (system *System) GetStatistics() (statistics *types.Statistics, err error) { + endpoint := system.client.SIOEndpoint + // endpoint.Path = fmt.Sprintf("/api/instances/System::%v/relationships/Statistics", system.System.ID) + + link, err := GetLink(system.System.Links, "/api/System/relationship/Statistics") + if err != nil { + return &types.Statistics{}, errors.New("Error: problem finding link") + } + + endpoint.Path = link.HREF + + req := system.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", system.client.Token) + req.Header.Add("Accept", "application/json;version="+system.client.configConnect.Version) + + resp, err := system.client.retryCheckResp(&system.client.Http, req) + if err != nil { + return &types.Statistics{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = system.client.decodeBody(resp, &statistics); err != nil { + return &types.Statistics{}, fmt.Errorf("error decoding instances response: %s", err) + } + + // bs, err := ioutil.ReadAll(resp.Body) + // if err != nil { + // return errors.New("error reading body") + // } + // + // fmt.Println(string(bs)) + return statistics, nil +} + +func (system *System) CreateSnapshotConsistencyGroup(snapshotVolumesParam *types.SnapshotVolumesParam) (snapshotVolumesResp *types.SnapshotVolumesResp, err error) { + endpoint := system.client.SIOEndpoint + + link, err := GetLink(system.System.Links, "self") + if err != nil { + return &types.SnapshotVolumesResp{}, errors.New("Error: problem finding link") + } + + endpoint.Path = fmt.Sprintf("%v/action/snapshotVolumes", link.HREF) + + jsonOutput, err := json.Marshal(&snapshotVolumesParam) + if err != nil { + return &types.SnapshotVolumesResp{}, fmt.Errorf("error marshaling: %s", err) + } + + req := system.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", system.client.Token) + req.Header.Add("Accept", "application/json;version="+system.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+system.client.configConnect.Version) + + resp, err := system.client.retryCheckResp(&system.client.Http, req) + if err != nil { + return &types.SnapshotVolumesResp{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = system.client.decodeBody(resp, &snapshotVolumesResp); err != nil { + return &types.SnapshotVolumesResp{}, fmt.Errorf("error decoding snapshotvolumes response: %s", err) + } + + return snapshotVolumesResp, nil + +} diff --git a/vendor/github.com/codedellemc/goscaleio/types/v1/types.go b/vendor/github.com/codedellemc/goscaleio/types/v1/types.go new file mode 100644 index 00000000000..252cad90fdf --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/types/v1/types.go @@ -0,0 +1,388 @@ +package goscaleio + +type Error struct { + Message string `xml:"message,attr"` + MajorErrorCode int `xml:"majorErrorCode,attr"` + MinorErrorCode string `xml:"minorErrorCode,attr"` + VendorSpecificErrorCode string `xml:"vendorSpecificErrorCode,attr,omitempty"` + StackTrace string `xml:"stackTrace,attr,omitempty"` +} + +// type session struct { +// Link []*types.Link `xml:"Link"` +// } + +type System struct { + MdmMode string `json:"mdmMode"` + MdmClusterState string `json:"mdmClusterState"` + SecondaryMdmActorIPList []string `json:"secondaryMdmActorIpList"` + InstallID string `json:"installId"` + PrimaryActorIPList []string `json:"primaryMdmActorIpList"` + SystemVersionName string `json:"systemVersionName"` + CapacityAlertHighThresholdPercent int `json:"capacityAlertHighThresholdPercent"` + CapacityAlertCriticalThresholdPercent int `json:"capacityAlertCriticalThresholdPercent"` + RemoteReadOnlyLimitState bool `json:"remoteReadOnlyLimitState"` + PrimaryMdmActorPort int `json:"primaryMdmActorPort"` + SecondaryMdmActorPort int `json:"secondaryMdmActorPort"` + TiebreakerMdmActorPort int `json:"tiebreakerMdmActorPort"` + MdmManagementPort int `json:"mdmManagementPort"` + TiebreakerMdmIPList []string `json:"tiebreakerMdmIpList"` + MdmManagementIPList []string `json:"mdmManagementIPList"` + DefaultIsVolumeObfuscated bool `json:"defaultIsVolumeObfuscated"` + RestrictedSdcModeEnabled bool `json:"restrictedSdcModeEnabled"` + Swid string `json:"swid"` + DaysInstalled int `json:"daysInstalled"` + MaxCapacityInGb string `json:"maxCapacityInGb"` + CapacityTimeLeftInDays string `json:"capacityTimeLeftInDays"` + EnterpriseFeaturesEnabled bool `json:"enterpriseFeaturesEnabled"` + IsInitialLicense bool `json:"isInitialLicense"` + Name string `json:"name"` + ID string `json:"id"` + Links []*Link `json:"links"` +} + +type Link struct { + Rel string `json:"rel"` + HREF string `json:"href"` +} + +type BWC struct { + TotalWeightInKb int `json:"totalWeightInKb"` + NumOccured int `json:"numOccured"` + NumSeconds int `json:"numSeconds"` +} + +type Statistics struct { + PrimaryReadFromDevBwc BWC `json:"primaryReadFromDevBwc"` + NumOfStoragePools int `json:"numOfStoragePools"` + ProtectedCapacityInKb int `json:"protectedCapacityInKb"` + MovingCapacityInKb int `json:"movingCapacityInKb"` + SnapCapacityInUseOccupiedInKb int `json:"snapCapacityInUseOccupiedInKb"` + SnapCapacityInUseInKb int `json:"snapCapacityInUseInKb"` + ActiveFwdRebuildCapacityInKb int `json:"activeFwdRebuildCapacityInKb"` + DegradedHealthyVacInKb int `json:"degradedHealthyVacInKb"` + ActiveMovingRebalanceJobs int `json:"activeMovingRebalanceJobs"` + TotalReadBwc BWC `json:"totalReadBwc"` + MaxCapacityInKb int `json:"maxCapacityInKb"` + PendingBckRebuildCapacityInKb int `json:"pendingBckRebuildCapacityInKb"` + ActiveMovingOutFwdRebuildJobs int `json:"activeMovingOutFwdRebuildJobs"` + CapacityLimitInKb int `json:"capacityLimitInKb"` + SecondaryVacInKb int `json:"secondaryVacInKb"` + PendingFwdRebuildCapacityInKb int `json:"pendingFwdRebuildCapacityInKb"` + ThinCapacityInUseInKb int `json:"thinCapacityInUseInKb"` + AtRestCapacityInKb int `json:"atRestCapacityInKb"` + ActiveMovingInBckRebuildJobs int `json:"activeMovingInBckRebuildJobs"` + DegradedHealthyCapacityInKb int `json:"degradedHealthyCapacityInKb"` + NumOfScsiInitiators int `json:"numOfScsiInitiators"` + NumOfUnmappedVolumes int `json:"numOfUnmappedVolumes"` + FailedCapacityInKb int `json:"failedCapacityInKb"` + SecondaryReadFromDevBwc BWC `json:"secondaryReadFromDevBwc"` + NumOfVolumes int `json:"numOfVolumes"` + SecondaryWriteBwc BWC `json:"secondaryWriteBwc"` + ActiveBckRebuildCapacityInKb int `json:"activeBckRebuildCapacityInKb"` + FailedVacInKb int `json:"failedVacInKb"` + PendingMovingCapacityInKb int `json:"pendingMovingCapacityInKb"` + ActiveMovingInRebalanceJobs int `json:"activeMovingInRebalanceJobs"` + PendingMovingInRebalanceJobs int `json:"pendingMovingInRebalanceJobs"` + BckRebuildReadBwc BWC `json:"bckRebuildReadBwc"` + DegradedFailedVacInKb int `json:"degradedFailedVacInKb"` + NumOfSnapshots int `json:"numOfSnapshots"` + RebalanceCapacityInKb int `json:"rebalanceCapacityInKb"` + fwdRebuildReadBwc BWC `json:"fwdRebuildReadBwc"` + NumOfSdc int `json:"numOfSdc"` + ActiveMovingInFwdRebuildJobs int `json:"activeMovingInFwdRebuildJobs"` + NumOfVtrees int `json:"numOfVtrees"` + ThickCapacityInUseInKb int `json:"thickCapacityInUseInKb"` + ProtectedVacInKb int `json:"protectedVacInKb"` + PendingMovingInBckRebuildJobs int `json:"pendingMovingInBckRebuildJobs"` + CapacityAvailableForVolumeAllocationInKb int `json:"capacityAvailableForVolumeAllocationInKb"` + PendingRebalanceCapacityInKb int `json:"pendingRebalanceCapacityInKb"` + PendingMovingRebalanceJobs int `json:"pendingMovingRebalanceJobs"` + NumOfProtectionDomains int `json:"numOfProtectionDomains"` + NumOfSds int `json:"numOfSds"` + CapacityInUseInKb int `json:"capacityInUseInKb"` + BckRebuildWriteBwc BWC `json:"bckRebuildWriteBwc"` + DegradedFailedCapacityInKb int `json:"degradedFailedCapacityInKb"` + NumOfThinBaseVolumes int `json:"numOfThinBaseVolumes"` + PendingMovingOutFwdRebuildJobs int `json:"pendingMovingOutFwdRebuildJobs"` + SecondaryReadBwc BWC `json:"secondaryReadBwc"` + PendingMovingOutBckRebuildJobs int `json:"pendingMovingOutBckRebuildJobs"` + RebalanceWriteBwc BWC `json:"rebalanceWriteBwc"` + PrimaryReadBwc BWC `json:"primaryReadBwc"` + NumOfVolumesInDeletion int `json:"numOfVolumesInDeletion"` + NumOfDevices int `json:"numOfDevices"` + RebalanceReadBwc BWC `json:"rebalanceReadBwc"` + InUseVacInKb int `json:"inUseVacInKb"` + UnreachableUnusedCapacityInKb int `json:"unreachableUnusedCapacityInKb"` + TotalWriteBwc BWC `json:"totalWriteBwc"` + SpareCapacityInKb int `json:"spareCapacityInKb"` + ActiveMovingOutBckRebuildJobs int `json:"activeMovingOutBckRebuildJobs"` + PrimaryVacInKb int `json:"primaryVacInKb"` + NumOfThickBaseVolumes int `json:"numOfThickBaseVolumes"` + BckRebuildCapacityInKb int `json:"bckRebuildCapacityInKb"` + NumOfMappedToAllVolumes int `json:"numOfMappedToAllVolumes"` + ActiveMovingCapacityInKb int `json:"activeMovingCapacityInKb"` + PendingMovingInFwdRebuildJobs int `json:"pendingMovingInFwdRebuildJobs"` + ActiveRebalanceCapacityInKb int `json:"activeRebalanceCapacityInKb"` + RmcacheSizeInKb int `json:"rmcacheSizeInKb"` + FwdRebuildCapacityInKb int `json:"fwdRebuildCapacityInKb"` + FwdRebuildWriteBwc BWC `json:"fwdRebuildWriteBwc"` + PrimaryWriteBwc BWC `json:"primaryWriteBwc"` +} + +type User struct { + SystemID string `json:"systemId"` + UserRole string `json:"userRole"` + PasswordChangeRequire bool `json:"passwordChangeRequired"` + Name string `json:"name"` + ID string `json:"id"` + Links []*Link `json:"links"` +} + +type ScsiInitiator struct { + Name string `json:"name"` + IQN string `json:"iqn"` + SystemID string `json:"systemID"` + Links []*Link `json:"links"` +} + +type ProtectionDomain struct { + SystemID string `json:"systemId"` + RebuildNetworkThrottlingInKbps int `json:"rebuildNetworkThrottlingInKbps"` + RebalanceNetworkThrottlingInKbps int `json:"rebalanceNetworkThrottlingInKbps"` + OverallIoNetworkThrottlingInKbps int `json:"overallIoNetworkThrottlingInKbps"` + OverallIoNetworkThrottlingEnabled bool `json:"overallIoNetworkThrottlingEnabled"` + RebuildNetworkThrottlingEnabled bool `json:"rebuildNetworkThrottlingEnabled"` + RebalanceNetworkThrottlingEnabled bool `json:"rebalanceNetworkThrottlingEnabled"` + ProtectionDomainState string `json:"protectionDomainState"` + Name string `json:"name"` + ID string `json:"id"` + Links []*Link `json:"links"` +} + +type ProtectionDomainParam struct { + Name string `json:"name"` +} + +type ProtectionDomainResp struct { + ID string `json:"id"` +} + +type Sdc struct { + SystemID string `json:"systemId"` + SdcApproved bool `json:"sdcApproved"` + SdcIp string `json:"SdcIp"` + OnVmWare bool `json:"onVmWare"` + SdcGuid string `json:"sdcGuid"` + MdmConnectionState string `json:"mdmConnectionState"` + Name string `json:"name"` + ID string `json:"id"` + Links []*Link `json:"links"` +} + +type SdsIp struct { + IP string `json:"ip"` + Role string `json:"role"` +} + +type SdsIpList struct { + SdsIP SdsIp `json:"SdsIp"` +} + +type Sds struct { + ID string `json:"id"` + Name string `json:"name,omitempty"` + ProtectionDomainID string `json:"protectionDomainId"` + IPList []*SdsIpList `json:"ipList"` + Port int `json:"port,omitempty"` + SdsState string `json:"sdsState"` + MembershipState string `json:"membershipState"` + MdmConnectionState string `json:"mdmConnectionState"` + DrlMode string `json:"drlMode,omitempty"` + RmcacheEnabled bool `json:"rmcacheEnabled,omitempty"` + RmcacheSizeInKb int `json:"rmcacheSizeInKb,omitempty"` + RmcacheFrozen bool `json:"rmcacheFrozen,omitempty"` + IsOnVMware bool `json:"isOnVmWare,omitempty"` + FaultSetID string `json:"faultSetId,omitempty"` + NumOfIoBuffers int `json:"numOfIoBuffers,omitempty"` + RmcacheMemoryAllocationState string `json:"RmcacheMemoryAllocationState,omitempty"` +} + +type DeviceInfo struct { + DevicePath string `json:"devicePath"` + StoragePoolID string `json:"storagePoolId"` + DeviceName string `json:"deviceName,omitempty"` +} + +type SdsParam struct { + Name string `json:"name,omitempty"` + IPList []*SdsIpList `json:"sdsIpList"` + Port int `json:"sdsPort,omitempty"` + DrlMode string `json:"drlMode,omitempty"` + RmcacheEnabled bool `json:"rmcacheEnabled,omitempty"` + RmcacheSizeInKb int `json:"rmcacheSizeInKb,omitempty"` + RmcacheFrozen bool `json:"rmcacheFrozen,omitempty"` + ProtectionDomainID string `json:"protectionDomainId"` + FaultSetID string `json:"faultSetId,omitempty"` + NumOfIoBuffers int `json:"numOfIoBuffers,omitempty"` + DeviceInfoList []*DeviceInfo `json:"deviceInfoList,omitempty"` + ForceClean bool `json:"forceClean,omitempty"` + DeviceTestTimeSecs int `json:"deviceTestTimeSecs ,omitempty"` + DeviceTestMode string `json:"deviceTestMode,omitempty"` +} + +type SdsResp struct { + ID string `json:"id"` +} + +type Device struct { + ID string `json:"id,omitempty"` + Name string `json:"name,omitempty"` + DeviceCurrentPathname string `json:"deviceCurrentPathname"` + DeviceOriginalPathname string `json:"deviceOriginalPathname,omitempty"` + DeviceState string `json:"deviceState,omitempty"` + ErrorState string `json:"errorState,omitempty"` + CapacityLimitInKb int `json:"capacityLimitInKb,omitempty"` + MaxCapacityInKb int `json:"maxCapacityInKb,omitempty"` + StoragePoolID string `json:"storagePoolId"` + SdsID string `json:"sdsId"` +} + +type DeviceParam struct { + Name string `json:"name,omitempty"` + DeviceCurrentPathname string `json:"deviceCurrentPathname"` + CapacityLimitInKb int `json:"capacityLimitInKb,omitempty"` + StoragePoolID string `json:"storagePoolId"` + SdsID string `json:"sdsId"` + TestTimeSecs int `json:"testTimeSecs,omitempty"` + TestMode string `json:"testMode,omitempty"` +} + +type DeviceResp struct { + ID string `json:"id"` +} + +type StoragePool struct { + ProtectionDomainID string `json:"protectionDomainId"` + RebalanceioPriorityPolicy string `json:"rebalanceIoPriorityPolicy"` + RebuildioPriorityPolicy string `json:"rebuildIoPriorityPolicy"` + RebuildioPriorityBwLimitPerDeviceInKbps int `json:"rebuildIoPriorityBwLimitPerDeviceInKbps"` + RebuildioPriorityNumOfConcurrentIosPerDevice int `json:"rebuildIoPriorityNumOfConcurrentIosPerDevice"` + RebalanceioPriorityNumOfConcurrentIosPerDevice int `json:"rebalanceIoPriorityNumOfConcurrentIosPerDevice"` + RebalanceioPriorityBwLimitPerDeviceInKbps int `json:"rebalanceIoPriorityBwLimitPerDeviceInKbps"` + RebuildioPriorityAppIopsPerDeviceThreshold int `json:"rebuildIoPriorityAppIopsPerDeviceThreshold"` + RebalanceioPriorityAppIopsPerDeviceThreshold int `json:"rebalanceIoPriorityAppIopsPerDeviceThreshold"` + RebuildioPriorityAppBwPerDeviceThresholdInKbps int `json:"rebuildIoPriorityAppBwPerDeviceThresholdInKbps"` + RebalanceioPriorityAppBwPerDeviceThresholdInKbps int `json:"rebalanceIoPriorityAppBwPerDeviceThresholdInKbps"` + RebuildioPriorityQuietPeriodInMsec int `json:"rebuildIoPriorityQuietPeriodInMsec"` + RebalanceioPriorityQuietPeriodInMsec int `json:"rebalanceIoPriorityQuietPeriodInMsec"` + ZeroPaddingEnabled bool `json:"zeroPaddingEnabled"` + UseRmcache bool `json:"useRmcache"` + SparePercentage int `json:"sparePercentage"` + RmCacheWriteHandlingMode string `json:"rmcacheWriteHandlingMode"` + RebuildEnabled bool `json:"rebuildEnabled"` + RebalanceEnabled bool `json:"rebalanceEnabled"` + NumofParallelRebuildRebalanceJobsPerDevice int `json:"numOfParallelRebuildRebalanceJobsPerDevice"` + Name string `json:"name"` + ID string `json:"id"` + Links []*Link `json:"links"` +} + +type StoragePoolParam struct { + Name string `json:"name"` + SparePercentage int `json:"sparePercentage,omitempty"` + RebuildEnabled bool `json:"rebuildEnabled,omitempty"` + RebalanceEnabled bool `json:"rebalanceEnabled,omitempty"` + ProtectionDomainID string `json:"protectionDomainId"` + ZeroPaddingEnabled bool `json:"zeroPaddingEnabled,omitempty"` + UseRmcache bool `json:"useRmcache,omitempty"` + RmcacheWriteHandlingMode string `json:"rmcacheWriteHandlingMode,omitempty"` +} + +type StoragePoolResp struct { + ID string `json:"id"` +} + +type MappedSdcInfo struct { + SdcID string `json:"sdcId"` + SdcIP string `json:"sdcIp"` + LimitIops int `json:"limitIops"` + LimitBwInMbps int `json:"limitBwInMbps"` +} + +type Volume struct { + StoragePoolID string `json:"storagePoolId"` + UseRmCache bool `json:"useRmcache"` + MappingToAllSdcsEnabled bool `json:"mappingToAllSdcsEnabled"` + MappedSdcInfo []*MappedSdcInfo `json:"mappedSdcInfo"` + IsObfuscated bool `json:"isObfuscated"` + VolumeType string `json:"volumeType"` + ConsistencyGroupID string `json:"consistencyGroupId"` + VTreeID string `json:"vtreeId"` + AncestorVolumeID string `json:"ancestorVolumeId"` + MappedScsiInitiatorInfo string `json:"mappedScsiInitiatorInfo"` + SizeInKb int `json:"sizeInKb"` + CreationTime int `json:"creationTime"` + Name string `json:"name"` + ID string `json:"id"` + Links []*Link `json:"links"` +} + +type VolumeParam struct { + ProtectionDomainID string `json:"protectionDomainId,omitempty"` + StoragePoolID string `json:"storagePoolId,omitempty"` + UseRmCache string `json:"useRmcache,omitempty"` + VolumeType string `json:"volumeType,omitempty"` + VolumeSizeInKb string `json:"volumeSizeInKb,omitempty"` + Name string `json:"name,omitempty"` +} + +type VolumeResp struct { + ID string `json:"id"` +} + +type VolumeQeryIdByKeyParam struct { + Name string `json:"name"` +} + +type VolumeQeryBySelectedIdsParam struct { + IDs []string `json:"ids"` +} + +type MapVolumeSdcParam struct { + SdcID string `json:"sdcId,omitempty"` + AllowMultipleMappings string `json:"allowMultipleMappings,omitempty"` + AllSdcs string `json:"allSdcs,omitempty"` +} + +type UnmapVolumeSdcParam struct { + SdcID string `json:"sdcId,omitempty"` + IgnoreScsiInitiators string `json:"ignoreScsiInitiators,omitempty"` + AllSdcs string `json:"allSdcs,omitempty"` +} + +type SnapshotDef struct { + VolumeID string `json:"volumeId,omitempty"` + SnapshotName string `json:"snapshotName,omitempty"` +} + +type SnapshotVolumesParam struct { + SnapshotDefs []*SnapshotDef `json:"snapshotDefs"` +} + +type SnapshotVolumesResp struct { + VolumeIDList []string `json:"volumeIdList"` + SnapshotGroupID string `json:"snapshotGroupId"` +} + +type VTree struct { + ID string `json:"id"` + Name string `json:"name"` + BaseVolumeID string `json:"baseVolumeId"` + StoragePoolID string `json:"storagePoolId"` + Links []*Link `json:"links"` +} + +type RemoveVolumeParam struct { + RemoveMode string `json:"removeMode"` +} diff --git a/vendor/github.com/codedellemc/goscaleio/user.go b/vendor/github.com/codedellemc/goscaleio/user.go new file mode 100644 index 00000000000..417a9b8fa90 --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/user.go @@ -0,0 +1,35 @@ +package goscaleio + +import ( + "fmt" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +func (system *System) GetUser() (user []types.User, err error) { + endpoint := system.client.SIOEndpoint + endpoint.Path = fmt.Sprintf("/api/instances/System::%v/relationships/User", system.System.ID) + + req := system.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", system.client.Token) + req.Header.Add("Accept", "application/json;version="+system.client.configConnect.Version) + + resp, err := system.client.retryCheckResp(&system.client.Http, req) + if err != nil { + return []types.User{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = system.client.decodeBody(resp, &user); err != nil { + return []types.User{}, fmt.Errorf("error decoding instances response: %s", err) + } + + // bs, err := ioutil.ReadAll(resp.Body) + // if err != nil { + // return types.User{}, errors.New("error reading body") + // } + // + // fmt.Println(string(bs)) + // return types.User{}, nil + return user, nil +} diff --git a/vendor/github.com/codedellemc/goscaleio/volume.go b/vendor/github.com/codedellemc/goscaleio/volume.go new file mode 100644 index 00000000000..f5b59cb403a --- /dev/null +++ b/vendor/github.com/codedellemc/goscaleio/volume.go @@ -0,0 +1,278 @@ +package goscaleio + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "os/exec" + "path/filepath" + "regexp" + "sort" + "strings" + + types "github.com/codedellemc/goscaleio/types/v1" +) + +type SdcMappedVolume struct { + MdmID string + VolumeID string + SdcDevice string + // Mounted bool + // MountPath bool + // Mapped bool +} + +type Volume struct { + Volume *types.Volume + client *Client +} + +func NewVolume(client *Client) *Volume { + return &Volume{ + Volume: new(types.Volume), + client: client, + } +} + +func (storagePool *StoragePool) GetVolume(volumehref, volumeid, ancestorvolumeid, volumename string, getSnapshots bool) (volumes []*types.Volume, err error) { + + endpoint := storagePool.client.SIOEndpoint + + if volumename != "" { + volumeid, err = storagePool.FindVolumeID(volumename) + if err != nil && err.Error() == "Not found" { + return nil, nil + } + if err != nil { + return []*types.Volume{}, fmt.Errorf("Error: problem finding volume: %s", err) + } + } + + if volumeid != "" { + endpoint.Path = fmt.Sprintf("/api/instances/Volume::%s", volumeid) + } else if volumehref == "" { + link, err := GetLink(storagePool.StoragePool.Links, "/api/StoragePool/relationship/Volume") + if err != nil { + return []*types.Volume{}, errors.New("Error: problem finding link") + } + endpoint.Path = link.HREF + } else { + endpoint.Path = volumehref + } + + req := storagePool.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", storagePool.client.Token) + req.Header.Add("Accept", "application/json;version="+storagePool.client.configConnect.Version) + + resp, err := storagePool.client.retryCheckResp(&storagePool.client.Http, req) + if err != nil { + return []*types.Volume{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if volumehref == "" && volumeid == "" { + if err = storagePool.client.decodeBody(resp, &volumes); err != nil { + return []*types.Volume{}, fmt.Errorf("error decoding storage pool response: %s", err) + } + var volumesNew []*types.Volume + for _, volume := range volumes { + if (!getSnapshots && volume.AncestorVolumeID == ancestorvolumeid) || (getSnapshots && volume.AncestorVolumeID != "") { + volumesNew = append(volumesNew, volume) + } + } + volumes = volumesNew + } else { + volume := &types.Volume{} + if err = storagePool.client.decodeBody(resp, &volume); err != nil { + return []*types.Volume{}, fmt.Errorf("error decoding instances response: %s", err) + } + volumes = append(volumes, volume) + } + return volumes, nil +} + +func (storagePool *StoragePool) FindVolumeID(volumename string) (volumeID string, err error) { + + endpoint := storagePool.client.SIOEndpoint + + volumeQeryIdByKeyParam := &types.VolumeQeryIdByKeyParam{} + volumeQeryIdByKeyParam.Name = volumename + + jsonOutput, err := json.Marshal(&volumeQeryIdByKeyParam) + if err != nil { + return "", fmt.Errorf("error marshaling: %s", err) + } + endpoint.Path = fmt.Sprintf("/api/types/Volume/instances/action/queryIdByKey") + + req := storagePool.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", storagePool.client.Token) + req.Header.Add("Accept", "application/json;version="+storagePool.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+storagePool.client.configConnect.Version) + + resp, err := storagePool.client.retryCheckResp(&storagePool.client.Http, req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", errors.New("error reading body") + } + + volumeID = string(bs) + + volumeID = strings.TrimRight(volumeID, `"`) + volumeID = strings.TrimLeft(volumeID, `"`) + + return volumeID, nil +} + +func GetLocalVolumeMap() (mappedVolumes []*SdcMappedVolume, err error) { + + // get sdc kernel guid + // /bin/emc/scaleio/drv_cfg --query_guid + // sdcKernelGuid := "271bad82-08ee-44f2-a2b1-7e2787c27be1" + + mappedVolumesMap := make(map[string]*SdcMappedVolume) + + out, err := exec.Command("/opt/emc/scaleio/sdc/bin/drv_cfg", "--query_vols").Output() + if err != nil { + return []*SdcMappedVolume{}, fmt.Errorf("Error querying volumes: ", err) + } + + result := string(out) + lines := strings.Split(result, "\n") + + for _, line := range lines { + split := strings.Split(line, " ") + if split[0] == "VOL-ID" { + mappedVolume := &SdcMappedVolume{MdmID: split[3], VolumeID: split[1]} + mdmVolumeID := fmt.Sprintf("%s-%s", mappedVolume.MdmID, mappedVolume.VolumeID) + mappedVolumesMap[mdmVolumeID] = mappedVolume + } + } + + diskIDPath := "/dev/disk/by-id" + files, _ := ioutil.ReadDir(diskIDPath) + r, _ := regexp.Compile(`^emc-vol-\w*-\w*$`) + for _, f := range files { + matched := r.MatchString(f.Name()) + if matched { + mdmVolumeID := strings.Replace(f.Name(), "emc-vol-", "", 1) + devPath, _ := filepath.EvalSymlinks(fmt.Sprintf("%s/%s", diskIDPath, f.Name())) + if _, ok := mappedVolumesMap[mdmVolumeID]; ok { + mappedVolumesMap[mdmVolumeID].SdcDevice = devPath + } + } + } + + keys := make([]string, 0, len(mappedVolumesMap)) + for key := range mappedVolumesMap { + keys = append(keys, key) + } + sort.Strings(keys) + + for _, key := range keys { + mappedVolumes = append(mappedVolumes, mappedVolumesMap[key]) + } + + return mappedVolumes, nil +} + +func (storagePool *StoragePool) CreateVolume(volume *types.VolumeParam) (volumeResp *types.VolumeResp, err error) { + + endpoint := storagePool.client.SIOEndpoint + + endpoint.Path = "/api/types/Volume/instances" + + volume.StoragePoolID = storagePool.StoragePool.ID + volume.ProtectionDomainID = storagePool.StoragePool.ProtectionDomainID + + jsonOutput, err := json.Marshal(&volume) + if err != nil { + return &types.VolumeResp{}, fmt.Errorf("error marshaling: %s", err) + } + + req := storagePool.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + req.SetBasicAuth("", storagePool.client.Token) + req.Header.Add("Accept", "application/json;version="+storagePool.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+storagePool.client.configConnect.Version) + + resp, err := storagePool.client.retryCheckResp(&storagePool.client.Http, req) + if err != nil { + return &types.VolumeResp{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = storagePool.client.decodeBody(resp, &volumeResp); err != nil { + return &types.VolumeResp{}, fmt.Errorf("error decoding volume creation response: %s", err) + } + + return volumeResp, nil +} + +func (volume *Volume) GetVTree() (vtree *types.VTree, err error) { + + endpoint := volume.client.SIOEndpoint + + link, err := GetLink(volume.Volume.Links, "/api/parent/relationship/vtreeId") + if err != nil { + return &types.VTree{}, errors.New("Error: problem finding link") + } + endpoint.Path = link.HREF + + req := volume.client.NewRequest(map[string]string{}, "GET", endpoint, nil) + req.SetBasicAuth("", volume.client.Token) + req.Header.Add("Accept", "application/json;version="+volume.client.configConnect.Version) + + resp, err := volume.client.retryCheckResp(&volume.client.Http, req) + if err != nil { + return &types.VTree{}, fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + if err = volume.client.decodeBody(resp, &vtree); err != nil { + return &types.VTree{}, fmt.Errorf("error decoding vtree response: %s", err) + } + return vtree, nil +} + +func (volume *Volume) RemoveVolume(removeMode string) (err error) { + + endpoint := volume.client.SIOEndpoint + + link, err := GetLink(volume.Volume.Links, "self") + if err != nil { + return errors.New("Error: problem finding link") + } + endpoint.Path = fmt.Sprintf("%v/action/removeVolume", link.HREF) + + if removeMode == "" { + removeMode = "ONLY_ME" + } + removeVolumeParam := &types.RemoveVolumeParam{ + RemoveMode: removeMode, + } + + jsonOutput, err := json.Marshal(&removeVolumeParam) + if err != nil { + return fmt.Errorf("error marshaling: %s", err) + } + + req := volume.client.NewRequest(map[string]string{}, "POST", endpoint, bytes.NewBufferString(string(jsonOutput))) + + req.SetBasicAuth("", volume.client.Token) + req.Header.Add("Accept", "application/json;version="+volume.client.configConnect.Version) + req.Header.Add("Content-Type", "application/json;version="+volume.client.configConnect.Version) + + resp, err := volume.client.retryCheckResp(&volume.client.Http, req) + if err != nil { + return fmt.Errorf("problem getting response: %v", err) + } + defer resp.Body.Close() + + return nil +}