diff --git a/pkg/kubelet/api/v1alpha1/runtime/api.pb.go b/pkg/kubelet/api/v1alpha1/runtime/api.pb.go index 2af5f19702d..8ad505a85c2 100644 --- a/pkg/kubelet/api/v1alpha1/runtime/api.pb.go +++ b/pkg/kubelet/api/v1alpha1/runtime/api.pb.go @@ -641,17 +641,7 @@ type PodSandboxConfig struct { // and the CRI). Whenever possible, however, runtime authors SHOULD // consider proposing new typed fields for any new features instead. // - // 1. AppArmor - // - // key: container.apparmor.security.beta.kubernetes.io/ - // description: apparmor profile for a container in this pod. - // value: - // * runtime/default: equivalent to not specifying a profile. - // * localhost/: profile loaded on the node - // (localhost) by name. The possible profile names are detailed at - // http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference - // - // 2. Seccomp + // 1. Seccomp // // key: security.alpha.kubernetes.io/seccomp/pod // description: the seccomp profile for the containers of an entire pod. @@ -668,7 +658,7 @@ type PodSandboxConfig struct { // local seccomp profile root. Note that profile root is set in // kubelet, and it is not passed in CRI yet, see https://issues.k8s.io/36997. // - // 3. Sysctls + // 2. Sysctls // // key: security.alpha.kubernetes.io/sysctls // description: list of safe sysctls which are set for the sandbox. @@ -1350,6 +1340,12 @@ type LinuxContainerSecurityContext struct { // List of groups applied to the first process run in the container, in // addition to the container's primary GID. SupplementalGroups []int64 `protobuf:"varint,8,rep,packed,name=supplemental_groups,json=supplementalGroups" json:"supplemental_groups,omitempty"` + // AppArmor profile for the container, candidate values are: + // * runtime/default: equivalent to not specifying a profile. + // * localhost/: profile loaded on the node + // (localhost) by name. The possible profile names are detailed at + // http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference + ApparmorProfile string `protobuf:"bytes,9,opt,name=apparmor_profile,json=apparmorProfile,proto3" json:"apparmor_profile,omitempty"` } func (m *LinuxContainerSecurityContext) Reset() { *m = LinuxContainerSecurityContext{} } @@ -1414,6 +1410,13 @@ func (m *LinuxContainerSecurityContext) GetSupplementalGroups() []int64 { return nil } +func (m *LinuxContainerSecurityContext) GetApparmorProfile() string { + if m != nil { + return m.ApparmorProfile + } + return "" +} + // LinuxContainerConfig contains platform-specific configuration for // Linux-based containers. type LinuxContainerConfig struct { @@ -5214,6 +5217,12 @@ func (m *LinuxContainerSecurityContext) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintApi(dAtA, i, uint64(j24)) i += copy(dAtA[i:], dAtA25[:j24]) } + if len(m.ApparmorProfile) > 0 { + dAtA[i] = 0x4a + i++ + i = encodeVarintApi(dAtA, i, uint64(len(m.ApparmorProfile))) + i += copy(dAtA[i:], m.ApparmorProfile) + } return i, nil } @@ -7657,6 +7666,10 @@ func (m *LinuxContainerSecurityContext) Size() (n int) { } n += 1 + sovApi(uint64(l)) + l } + l = len(m.ApparmorProfile) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } return n } @@ -8899,6 +8912,7 @@ func (this *LinuxContainerSecurityContext) String() string { `RunAsUsername:` + fmt.Sprintf("%v", this.RunAsUsername) + `,`, `ReadonlyRootfs:` + fmt.Sprintf("%v", this.ReadonlyRootfs) + `,`, `SupplementalGroups:` + fmt.Sprintf("%v", this.SupplementalGroups) + `,`, + `ApparmorProfile:` + fmt.Sprintf("%v", this.ApparmorProfile) + `,`, `}`, }, "") return s @@ -14394,6 +14408,35 @@ func (m *LinuxContainerSecurityContext) Unmarshal(dAtA []byte) error { } else { return fmt.Errorf("proto: wrong wireType = %d for field SupplementalGroups", wireType) } + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ApparmorProfile", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + 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 ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ApparmorProfile = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -20654,226 +20697,227 @@ var ( func init() { proto.RegisterFile("api.proto", fileDescriptorApi) } var fileDescriptorApi = []byte{ - // 3528 bytes of a gzipped FileDescriptorProto + // 3550 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, 0x95, 0x04, 0x40, 0x82, 0xc0, 0x03, 0x01, 0x82, 0x4d, 0x8a, 0x84, 0x40, 0x89, 0xa2, 0xc6, 0x92, 0x2c, 0xc9, 0x16, 0x2d, 0xd1, 0x5e, 0x69, 0x2d, 0x5b, 0xb2, 0x61, 0x92, 0x72, 0xd1, 0x92, 0x20, 0x7a, 0x20, 0x79, 0xed, 0xf5, 0x61, 0x76, 0x88, 0x69, 0x82, 0x23, 0x01, 0x33, 0xe3, 0x99, 0x86, - 0x2c, 0xee, 0x69, 0x8f, 0x7b, 0xd9, 0x2a, 0xef, 0x71, 0x6f, 0x7b, 0x48, 0x95, 0x2b, 0x49, 0x55, - 0x0e, 0xa9, 0x4a, 0x25, 0x3f, 0xc1, 0x55, 0xa9, 0x54, 0xe5, 0x90, 0x43, 0x72, 0x8b, 0x95, 0x7b, - 0x7e, 0x43, 0xaa, 0xbf, 0x66, 0x7a, 0xbe, 0x28, 0x52, 0x76, 0xc5, 0xba, 0x4d, 0xbf, 0x7e, 0xfd, - 0xfa, 0xf5, 0x7b, 0xaf, 0xdf, 0xd7, 0x34, 0x54, 0x4d, 0xcf, 0x5e, 0xf3, 0x7c, 0x97, 0xb8, 0x68, - 0xda, 0x1f, 0x3b, 0xc4, 0x1e, 0xe1, 0xf6, 0x95, 0x81, 0x4d, 0xf6, 0xc7, 0xbb, 0x6b, 0x7d, 0x77, - 0xf4, 0xd6, 0xc0, 0x1d, 0xb8, 0x6f, 0xb1, 0xf9, 0xdd, 0xf1, 0x1e, 0x1b, 0xb1, 0x01, 0xfb, 0xe2, - 0xeb, 0xb4, 0xcb, 0xd0, 0xf8, 0x0c, 0xfb, 0x81, 0xed, 0x3a, 0x3a, 0xfe, 0x6a, 0x8c, 0x03, 0x82, - 0x5a, 0x30, 0xfd, 0x94, 0x43, 0x5a, 0x85, 0xd5, 0xc2, 0xc5, 0xaa, 0x2e, 0x87, 0xda, 0xb7, 0x05, - 0x98, 0x0d, 0x91, 0x03, 0xcf, 0x75, 0x02, 0x9c, 0x8f, 0x8d, 0xce, 0xc2, 0x8c, 0xe0, 0xc9, 0x70, - 0xcc, 0x11, 0x6e, 0x15, 0xd9, 0x74, 0x4d, 0xc0, 0xba, 0xe6, 0x08, 0xa3, 0xd7, 0x61, 0x56, 0xa2, - 0x48, 0x22, 0x25, 0x86, 0xd5, 0x10, 0x60, 0xb1, 0x1b, 0x5a, 0x83, 0x79, 0x89, 0x68, 0x7a, 0x76, - 0x88, 0x3c, 0xc9, 0x90, 0xe7, 0xc4, 0x54, 0xc7, 0xb3, 0x05, 0xbe, 0xf6, 0x25, 0x54, 0x37, 0xbb, - 0xbd, 0x0d, 0xd7, 0xd9, 0xb3, 0x07, 0x94, 0xc5, 0x00, 0xfb, 0x74, 0x4d, 0xab, 0xb0, 0x5a, 0xa2, - 0x2c, 0x8a, 0x21, 0x6a, 0x43, 0x25, 0xc0, 0xa6, 0xdf, 0xdf, 0xc7, 0x41, 0xab, 0xc8, 0xa6, 0xc2, - 0x31, 0x5d, 0xe5, 0x7a, 0xc4, 0x76, 0x9d, 0xa0, 0x55, 0xe2, 0xab, 0xc4, 0x50, 0xfb, 0xbf, 0x02, - 0xd4, 0x76, 0x5c, 0x9f, 0xdc, 0x37, 0x3d, 0xcf, 0x76, 0x06, 0xe8, 0x0a, 0x54, 0x98, 0x2c, 0xfb, - 0xee, 0x90, 0xc9, 0xa0, 0xb1, 0x3e, 0xb7, 0x26, 0x58, 0x5a, 0xdb, 0x11, 0x13, 0x7a, 0x88, 0x82, - 0xce, 0x43, 0xa3, 0xef, 0x3a, 0xc4, 0xb4, 0x1d, 0xec, 0x1b, 0x9e, 0xeb, 0x13, 0x26, 0x99, 0x29, - 0xbd, 0x1e, 0x42, 0x29, 0x71, 0xb4, 0x0c, 0xd5, 0x7d, 0x37, 0x20, 0x1c, 0xa3, 0xc4, 0x30, 0x2a, - 0x14, 0xc0, 0x26, 0x97, 0x60, 0x9a, 0x4d, 0xda, 0x9e, 0x90, 0x41, 0x99, 0x0e, 0xb7, 0x3d, 0xed, - 0x9b, 0x02, 0x4c, 0xdd, 0x77, 0xc7, 0x0e, 0x49, 0x6c, 0x63, 0x92, 0x7d, 0xa1, 0x1f, 0x65, 0x1b, - 0x93, 0xec, 0x47, 0xdb, 0x50, 0x0c, 0xae, 0x22, 0xbe, 0x0d, 0x9d, 0x6c, 0x43, 0xc5, 0xc7, 0xa6, - 0xe5, 0x3a, 0xc3, 0x03, 0xc6, 0x42, 0x45, 0x0f, 0xc7, 0x54, 0x77, 0x01, 0x1e, 0xda, 0xce, 0xf8, - 0x99, 0xe1, 0xe3, 0xa1, 0xb9, 0x8b, 0x87, 0x8c, 0x95, 0x8a, 0xde, 0x10, 0x60, 0x9d, 0x43, 0xb5, - 0xc7, 0x30, 0x4b, 0x95, 0x1d, 0x78, 0x66, 0x1f, 0x3f, 0x60, 0x22, 0xa4, 0xa6, 0xc1, 0x36, 0x75, - 0x30, 0xf9, 0xda, 0xf5, 0x9f, 0x30, 0xce, 0x2a, 0x7a, 0x8d, 0xc2, 0xba, 0x1c, 0x84, 0x4e, 0x42, - 0x85, 0xf3, 0x65, 0x5b, 0x8c, 0xad, 0x8a, 0xce, 0x4e, 0xbc, 0x63, 0x5b, 0xe1, 0x94, 0xed, 0xf5, - 0x05, 0x57, 0xd3, 0xfc, 0xf4, 0x7d, 0x4d, 0x03, 0xd8, 0x76, 0xc8, 0xf5, 0x77, 0x3e, 0x33, 0x87, - 0x63, 0x8c, 0x16, 0x60, 0xea, 0x29, 0xfd, 0x60, 0xf4, 0x4b, 0x3a, 0x1f, 0x68, 0x7f, 0x2a, 0xc2, - 0xf2, 0x3d, 0xca, 0x60, 0xcf, 0x74, 0xac, 0x5d, 0xf7, 0x59, 0x0f, 0xf7, 0xc7, 0xbe, 0x4d, 0x0e, - 0x36, 0x5c, 0x87, 0xe0, 0x67, 0x04, 0x6d, 0xc1, 0x9c, 0x23, 0xf9, 0x35, 0xa4, 0x09, 0x50, 0x0a, - 0xb5, 0xf5, 0x56, 0xa8, 0xd7, 0xc4, 0x89, 0xf4, 0xa6, 0x13, 0x07, 0x04, 0xe8, 0x83, 0x48, 0x3e, - 0x92, 0x48, 0x91, 0x11, 0x59, 0x0c, 0x89, 0xf4, 0xb6, 0x18, 0x1f, 0x82, 0x84, 0x94, 0x9b, 0x24, - 0xf0, 0x36, 0xd0, 0xbb, 0x62, 0x98, 0x81, 0x31, 0x0e, 0xb0, 0xcf, 0x4e, 0x5a, 0x5b, 0x9f, 0x0f, - 0x17, 0x47, 0xe7, 0xd4, 0xab, 0xfe, 0xd8, 0xe9, 0x04, 0x8f, 0x02, 0xec, 0xb3, 0x1b, 0x25, 0x34, - 0x64, 0xf8, 0xae, 0x4b, 0xf6, 0x02, 0xa9, 0x15, 0x09, 0xd6, 0x19, 0x14, 0xbd, 0x05, 0xf3, 0xc1, - 0xd8, 0xf3, 0x86, 0x78, 0x84, 0x1d, 0x62, 0x0e, 0x8d, 0x81, 0xef, 0x8e, 0xbd, 0xa0, 0x35, 0xb5, - 0x5a, 0xba, 0x58, 0xd2, 0x91, 0x3a, 0xf5, 0x31, 0x9b, 0x41, 0x2b, 0x00, 0x9e, 0x6f, 0x3f, 0xb5, - 0x87, 0x78, 0x80, 0xad, 0x56, 0x99, 0x11, 0x55, 0x20, 0xda, 0xff, 0x14, 0xe0, 0x04, 0x3b, 0xce, - 0x8e, 0x6b, 0x09, 0xc9, 0x8a, 0xfb, 0xf7, 0x1a, 0xd4, 0xfb, 0x8c, 0xbc, 0xe1, 0x99, 0x3e, 0x76, - 0x88, 0x30, 0xc4, 0x19, 0x0e, 0xdc, 0x61, 0x30, 0xf4, 0x00, 0x9a, 0x81, 0x50, 0x84, 0xd1, 0xe7, - 0x9a, 0x10, 0xf2, 0x3a, 0x17, 0x1e, 0xf9, 0x10, 0xad, 0xe9, 0xb3, 0x41, 0x1c, 0xa0, 0xf9, 0x80, - 0x22, 0x4e, 0xee, 0x63, 0x62, 0x5a, 0x26, 0x31, 0x11, 0x82, 0x49, 0xe6, 0x8c, 0x38, 0x0b, 0xec, - 0x1b, 0x35, 0xa1, 0x34, 0x16, 0x56, 0x56, 0xd5, 0xe9, 0x27, 0x3a, 0x05, 0xd5, 0x50, 0x9f, 0xc2, - 0x23, 0x45, 0x00, 0xea, 0x19, 0x4c, 0x42, 0xf0, 0xc8, 0x23, 0x4c, 0xb6, 0x75, 0x5d, 0x0e, 0xb5, - 0xdf, 0x4d, 0x42, 0x33, 0x75, 0xfc, 0x1b, 0x50, 0x19, 0x89, 0xed, 0x85, 0x19, 0x2d, 0x47, 0xee, - 0x21, 0xc5, 0xa1, 0x1e, 0x22, 0xd3, 0xdb, 0x47, 0xed, 0x5a, 0x71, 0x9e, 0xe1, 0x98, 0xca, 0x74, - 0xe8, 0x0e, 0x0c, 0xcb, 0xf6, 0x71, 0x9f, 0xb8, 0xfe, 0x81, 0xe0, 0x72, 0x66, 0xe8, 0x0e, 0x36, - 0x25, 0x0c, 0x5d, 0x03, 0xb0, 0x9c, 0x80, 0x8a, 0x73, 0xcf, 0x1e, 0x30, 0x5e, 0x6b, 0xeb, 0x28, - 0xdc, 0x3b, 0x74, 0x90, 0x7a, 0xd5, 0x72, 0x02, 0xc1, 0xec, 0xbb, 0x50, 0xa7, 0x0e, 0xc7, 0x18, - 0x71, 0xdf, 0xc6, 0x0d, 0xa2, 0xb6, 0xbe, 0xa0, 0x70, 0x1c, 0x3a, 0x3e, 0x7d, 0xc6, 0x8b, 0x06, - 0x01, 0xba, 0x05, 0x65, 0x76, 0xe1, 0x83, 0x56, 0x99, 0xad, 0x39, 0x9f, 0x71, 0x4a, 0xbe, 0xcb, - 0xda, 0x3d, 0x86, 0xb7, 0xe5, 0x10, 0xff, 0x40, 0x17, 0x8b, 0xd0, 0x3d, 0xa8, 0x99, 0x8e, 0xe3, - 0x12, 0x93, 0xdf, 0x95, 0x69, 0x46, 0xe3, 0x72, 0x3e, 0x8d, 0x4e, 0x84, 0xcc, 0x09, 0xa9, 0xcb, - 0xd1, 0x3b, 0x30, 0xc5, 0x2e, 0x53, 0xab, 0xc2, 0x4e, 0xbd, 0x12, 0xb7, 0xa1, 0x24, 0x31, 0x9d, - 0x23, 0xb7, 0xdf, 0x85, 0x9a, 0xc2, 0x1a, 0x35, 0x8c, 0x27, 0xf8, 0x40, 0xd8, 0x0a, 0xfd, 0x8c, - 0x3c, 0x0a, 0xd7, 0x07, 0x1f, 0xdc, 0x2c, 0xfe, 0x6b, 0xa1, 0x7d, 0x1b, 0x9a, 0x49, 0x8e, 0x8e, - 0xb3, 0x5e, 0xdb, 0x86, 0x05, 0x7d, 0xec, 0x44, 0x8c, 0xc9, 0x68, 0x7c, 0x0d, 0xca, 0x42, 0x7f, - 0xdc, 0x76, 0x4e, 0xe6, 0x4a, 0x44, 0x17, 0x88, 0xda, 0x2d, 0x38, 0x91, 0x20, 0x25, 0x62, 0xf5, - 0x39, 0x68, 0x78, 0xae, 0x65, 0x04, 0x1c, 0x6c, 0xd8, 0x96, 0xbc, 0x89, 0x5e, 0x88, 0xbb, 0x6d, - 0xd1, 0xe5, 0x3d, 0xe2, 0x7a, 0x69, 0x56, 0x8e, 0xb6, 0xbc, 0x05, 0x8b, 0xc9, 0xe5, 0x7c, 0x7b, - 0xed, 0x03, 0x58, 0xd2, 0xf1, 0xc8, 0x7d, 0x8a, 0x5f, 0x96, 0x74, 0x1b, 0x5a, 0x69, 0x02, 0x11, - 0xf1, 0x08, 0xda, 0x23, 0x26, 0x19, 0x07, 0xc7, 0x23, 0x7e, 0x49, 0x25, 0x20, 0xa2, 0x10, 0xa7, - 0x83, 0x1a, 0x50, 0xb4, 0x3d, 0xb1, 0xa8, 0x68, 0x7b, 0xda, 0x17, 0x50, 0xed, 0xaa, 0xde, 0x40, - 0x0d, 0x63, 0x55, 0x5d, 0x0e, 0xd1, 0x7a, 0x94, 0x41, 0x14, 0x5f, 0x10, 0x3e, 0xc2, 0xdc, 0xe2, - 0x6e, 0xca, 0x89, 0x0a, 0x1e, 0xd6, 0x01, 0x42, 0x0f, 0x24, 0xc3, 0x11, 0x4a, 0xd3, 0xd3, 0x15, - 0x2c, 0xed, 0x67, 0x31, 0x77, 0xa4, 0x1c, 0xc6, 0x0a, 0x0f, 0x63, 0xc5, 0xdc, 0x53, 0xf1, 0x38, - 0xee, 0x69, 0x0d, 0xa6, 0x02, 0x62, 0x12, 0xee, 0x20, 0x1b, 0xca, 0xe1, 0xe2, 0x5b, 0x62, 0x9d, - 0xa3, 0xa1, 0xd3, 0x00, 0x7d, 0x1f, 0x9b, 0x04, 0x5b, 0x86, 0xc9, 0x3d, 0x67, 0x49, 0xaf, 0x0a, - 0x48, 0x87, 0xa0, 0x9b, 0x91, 0x1c, 0xa7, 0x18, 0x1b, 0xab, 0x19, 0x04, 0x63, 0x7a, 0x89, 0x24, - 0x1d, 0xde, 0xf6, 0xf2, 0xe1, 0xb7, 0x5d, 0xac, 0xe3, 0xc8, 0x8a, 0xc3, 0x9a, 0xce, 0x75, 0x58, - 0x7c, 0xc5, 0x51, 0x1c, 0x56, 0x25, 0xd7, 0x61, 0x09, 0x1a, 0x87, 0x3a, 0xac, 0x9f, 0xd2, 0xf5, - 0xdc, 0x87, 0x56, 0xfa, 0xea, 0x08, 0x97, 0x71, 0x0d, 0xca, 0x01, 0x83, 0x1c, 0xe2, 0x7e, 0xc4, - 0x12, 0x81, 0xa8, 0xdd, 0x81, 0x85, 0x84, 0x05, 0xf0, 0x6c, 0x2c, 0xb4, 0x97, 0xc2, 0x91, 0xec, - 0x45, 0xfb, 0x7b, 0x41, 0xb5, 0xde, 0x3b, 0xf6, 0x90, 0x60, 0x3f, 0x65, 0xbd, 0x6f, 0x4b, 0xa2, - 0xdc, 0x74, 0x4f, 0xe7, 0x11, 0xe5, 0x89, 0x92, 0xb0, 0xc4, 0x1e, 0x34, 0x98, 0x0e, 0x8d, 0x00, - 0x0f, 0x59, 0xa8, 0x64, 0x19, 0x7e, 0x6d, 0xfd, 0xcd, 0x8c, 0xd5, 0x7c, 0x5f, 0x6e, 0x00, 0x3d, - 0x81, 0xce, 0xd5, 0x57, 0x1f, 0xaa, 0xb0, 0xf6, 0x87, 0x80, 0xd2, 0x48, 0xc7, 0xd2, 0xc3, 0x27, - 0xf4, 0xee, 0xd3, 0x04, 0x3f, 0x23, 0x06, 0xec, 0x31, 0x36, 0x0e, 0x51, 0x02, 0xe7, 0x53, 0x17, - 0x88, 0xda, 0xff, 0x97, 0x00, 0xa2, 0xc9, 0x57, 0xf6, 0xd2, 0xdf, 0x08, 0xaf, 0x20, 0xcf, 0x33, - 0xce, 0x64, 0xd0, 0xcb, 0xbc, 0x7c, 0x77, 0xe2, 0x97, 0x8f, 0x67, 0x1c, 0xe7, 0xb2, 0x56, 0xbf, - 0xb2, 0xd7, 0x6e, 0x03, 0x16, 0x93, 0xea, 0x16, 0x97, 0xee, 0x12, 0x4c, 0xd9, 0x04, 0x8f, 0x78, - 0xb9, 0xaa, 0xe6, 0xfc, 0x0a, 0x2e, 0xc7, 0xd0, 0xce, 0x42, 0x75, 0x7b, 0x64, 0x0e, 0x70, 0xcf, - 0xc3, 0x7d, 0xba, 0x97, 0x4d, 0x07, 0x62, 0x7f, 0x3e, 0xd0, 0xd6, 0xa1, 0x72, 0x17, 0x1f, 0xf0, - 0x3b, 0x78, 0x44, 0xfe, 0xb4, 0xdf, 0x17, 0x60, 0x89, 0xf9, 0xce, 0x0d, 0x59, 0x2c, 0xea, 0x38, - 0x70, 0xc7, 0x7e, 0x1f, 0x07, 0x4c, 0xa5, 0xde, 0xd8, 0xf0, 0xb0, 0x6f, 0xbb, 0x96, 0x28, 0xad, - 0xaa, 0x7d, 0x6f, 0xbc, 0xc3, 0x00, 0xb4, 0xa0, 0xa4, 0xd3, 0x5f, 0x8d, 0x5d, 0x61, 0x5b, 0x25, - 0xbd, 0xd2, 0xf7, 0xc6, 0x9f, 0xd2, 0xb1, 0x5c, 0x1b, 0xec, 0x9b, 0x3e, 0x0e, 0x98, 0x0d, 0xf1, - 0xb5, 0x3d, 0x06, 0x40, 0xd7, 0xe0, 0xc4, 0x08, 0x8f, 0x5c, 0xff, 0xc0, 0x18, 0xda, 0x23, 0x9b, - 0x18, 0xb6, 0x63, 0xec, 0x1e, 0x10, 0x1c, 0x08, 0xc3, 0x41, 0x7c, 0xf2, 0x1e, 0x9d, 0xdb, 0x76, - 0x3e, 0xa2, 0x33, 0x48, 0x83, 0xba, 0xeb, 0x8e, 0x8c, 0xa0, 0xef, 0xfa, 0xd8, 0x30, 0xad, 0xc7, - 0x2c, 0x78, 0x94, 0xf4, 0x9a, 0xeb, 0x8e, 0x7a, 0x14, 0xd6, 0xb1, 0x1e, 0x6b, 0x26, 0xd4, 0x63, - 0xa5, 0x16, 0xad, 0x02, 0x58, 0x4d, 0x25, 0xaa, 0x00, 0xfa, 0x4d, 0x61, 0xbe, 0x3b, 0x94, 0x72, - 0x60, 0xdf, 0x14, 0x46, 0x0e, 0x3c, 0x59, 0x02, 0xb0, 0x6f, 0x2a, 0xb0, 0x21, 0x7e, 0x2a, 0xaa, - 0xdd, 0xaa, 0xce, 0x07, 0x9a, 0x05, 0xb0, 0x61, 0x7a, 0xe6, 0xae, 0x3d, 0xb4, 0xc9, 0x01, 0xba, - 0x04, 0x4d, 0xd3, 0xb2, 0x8c, 0xbe, 0x84, 0xd8, 0x58, 0xb6, 0x1e, 0x66, 0x4d, 0xcb, 0xda, 0x50, - 0xc0, 0xe8, 0x0d, 0x98, 0xb3, 0x7c, 0xd7, 0x8b, 0xe3, 0xf2, 0x5e, 0x44, 0x93, 0x4e, 0xa8, 0xc8, - 0xda, 0x6f, 0x4b, 0x70, 0x3a, 0xae, 0x96, 0x64, 0xf1, 0x7a, 0x03, 0x66, 0x12, 0xbb, 0xc6, 0xab, - 0xc6, 0x88, 0x49, 0x3d, 0x86, 0x98, 0x28, 0xef, 0x8a, 0xc9, 0xf2, 0x2e, 0xbb, 0x2a, 0x2e, 0xfd, - 0x18, 0x55, 0xf1, 0xe4, 0x0f, 0xa9, 0x8a, 0xa7, 0x8e, 0x54, 0x15, 0x5f, 0x60, 0x7d, 0x26, 0xb9, - 0x88, 0x15, 0x54, 0x65, 0xde, 0x0c, 0x09, 0x71, 0x1c, 0xd9, 0x8f, 0x4a, 0x54, 0xcf, 0xd3, 0xc7, - 0xa9, 0x9e, 0x2b, 0x79, 0xd5, 0xb3, 0xf6, 0xf3, 0x02, 0x2c, 0xc4, 0x35, 0x27, 0x0a, 0xae, 0xdb, - 0x50, 0xf5, 0xe5, 0xd5, 0x12, 0xda, 0x5a, 0x8d, 0xa7, 0x2f, 0xe9, 0x2b, 0xa8, 0x47, 0x4b, 0xd0, - 0xa7, 0xb9, 0x75, 0xf3, 0x85, 0x1c, 0x32, 0x2f, 0xac, 0x9c, 0x3b, 0x30, 0x17, 0x22, 0x1f, 0x5a, - 0x38, 0x2b, 0x85, 0x70, 0x31, 0x5e, 0x08, 0x3b, 0x50, 0xde, 0xc4, 0x4f, 0xed, 0x3e, 0xfe, 0x51, - 0xda, 0x50, 0xab, 0x50, 0xf3, 0xb0, 0x3f, 0xb2, 0x83, 0x20, 0xb4, 0xba, 0xaa, 0xae, 0x82, 0xb4, - 0xbf, 0x4c, 0xc1, 0x6c, 0x52, 0xb2, 0xd7, 0x53, 0x75, 0x77, 0x3b, 0xba, 0x06, 0xc9, 0xf3, 0x29, - 0x21, 0xee, 0xa2, 0xf4, 0xa2, 0xc5, 0x44, 0x92, 0x1d, 0x3a, 0x5a, 0xe1, 0x59, 0xe9, 0xf9, 0xfb, - 0xee, 0x68, 0x64, 0x3a, 0x96, 0x6c, 0x11, 0x8a, 0x21, 0x95, 0x96, 0xe9, 0x0f, 0xa8, 0x6d, 0x53, - 0x30, 0xfb, 0x46, 0x67, 0xa0, 0x46, 0x93, 0x55, 0xdb, 0x61, 0x65, 0x3b, 0xb3, 0xdc, 0xaa, 0x0e, - 0x02, 0xb4, 0x69, 0xfb, 0xe8, 0x3c, 0x4c, 0x62, 0xe7, 0xa9, 0x0c, 0x66, 0x51, 0x0f, 0x51, 0x7a, - 0x6f, 0x9d, 0x4d, 0xa3, 0x0b, 0x50, 0x1e, 0xb9, 0x63, 0x87, 0xc8, 0xb4, 0xb5, 0x11, 0x22, 0xb2, - 0xc6, 0x9f, 0x2e, 0x66, 0xd1, 0x25, 0x98, 0xb6, 0x98, 0x0e, 0x64, 0x6e, 0x3a, 0x1b, 0x95, 0xfe, - 0x0c, 0xae, 0xcb, 0x79, 0xf4, 0x7e, 0x18, 0x86, 0xab, 0x89, 0x40, 0x9a, 0x10, 0x6a, 0x66, 0x2c, - 0xbe, 0x1b, 0x8f, 0xc5, 0xc0, 0x48, 0x5c, 0xca, 0x25, 0x71, 0x78, 0xe1, 0x7e, 0x12, 0x2a, 0x43, - 0x77, 0xc0, 0xed, 0xa0, 0xc6, 0xeb, 0xa9, 0xa1, 0x3b, 0x60, 0x66, 0xb0, 0x40, 0x73, 0x0f, 0xcb, - 0x76, 0x5a, 0x33, 0xec, 0x4e, 0xf2, 0x01, 0x0d, 0x29, 0xec, 0xc3, 0x70, 0x9d, 0x3e, 0x6e, 0xd5, - 0xd9, 0x54, 0x95, 0x41, 0x1e, 0x38, 0x7d, 0x16, 0xf1, 0x08, 0x39, 0x68, 0x35, 0x18, 0x9c, 0x7e, - 0xd2, 0x94, 0x91, 0x17, 0x0b, 0xb3, 0x89, 0x94, 0x31, 0xeb, 0x7e, 0xbe, 0x02, 0x9d, 0x81, 0x5f, - 0x17, 0x60, 0x71, 0x83, 0x65, 0x4c, 0x8a, 0x27, 0x38, 0x46, 0x65, 0x8b, 0xae, 0x86, 0x2d, 0x84, - 0x64, 0x19, 0x9a, 0x3c, 0xac, 0xc0, 0x43, 0x1f, 0x42, 0x43, 0xd2, 0x14, 0x2b, 0x4b, 0x2f, 0x6a, - 0x3e, 0xd4, 0x03, 0x75, 0xa8, 0xbd, 0x0f, 0x4b, 0x29, 0x9e, 0x45, 0x76, 0x73, 0x16, 0x66, 0x22, - 0x8f, 0x10, 0xb2, 0x5c, 0x0b, 0x61, 0xdb, 0x96, 0x76, 0x13, 0x4e, 0xf4, 0x88, 0xe9, 0x93, 0xd4, - 0x81, 0x8f, 0xb0, 0x96, 0xf5, 0x1f, 0xe2, 0x6b, 0x45, 0x8b, 0xa0, 0x07, 0x0b, 0x3d, 0xe2, 0x7a, - 0x2f, 0x41, 0x94, 0xde, 0x74, 0x7a, 0x6c, 0x77, 0x4c, 0x44, 0x4a, 0x23, 0x87, 0xda, 0x12, 0xef, - 0x96, 0xa4, 0x77, 0x7b, 0x0f, 0x16, 0x79, 0xb3, 0xe2, 0x65, 0x0e, 0x71, 0x52, 0xb6, 0x4a, 0xd2, - 0x74, 0x37, 0x61, 0x3e, 0x72, 0xe5, 0x51, 0x75, 0x75, 0x25, 0x5e, 0x5d, 0x2d, 0xa5, 0x75, 0x1c, - 0x2b, 0xae, 0xfe, 0xb7, 0xa8, 0x38, 0xcc, 0x9c, 0xda, 0x6a, 0x3d, 0x5e, 0x5b, 0x9d, 0xca, 0x21, - 0x19, 0x2b, 0xad, 0xd2, 0x16, 0x59, 0xca, 0xb0, 0x48, 0x3d, 0x55, 0x80, 0x4d, 0x32, 0xa7, 0xf1, - 0x46, 0x7a, 0x8b, 0x7f, 0x62, 0xfd, 0xb5, 0xcd, 0xeb, 0xaf, 0x70, 0xeb, 0xb0, 0x81, 0x74, 0x35, - 0x51, 0x7f, 0xb5, 0xf2, 0xd8, 0x0c, 0xcb, 0xaf, 0xff, 0x9e, 0x84, 0x6a, 0x38, 0x97, 0x12, 0x6c, - 0x5a, 0x48, 0xc5, 0x0c, 0x21, 0xa9, 0xf1, 0xab, 0xf4, 0x32, 0xf1, 0x6b, 0xf2, 0x45, 0xf1, 0x6b, - 0x19, 0xaa, 0xec, 0xc3, 0xf0, 0xf1, 0x9e, 0x88, 0x47, 0x15, 0x06, 0xd0, 0xf1, 0x5e, 0x64, 0x50, - 0xe5, 0xa3, 0x18, 0x54, 0xa2, 0xd0, 0x9b, 0x4e, 0x16, 0x7a, 0xd7, 0xc3, 0x08, 0xc3, 0x63, 0xd1, - 0x4a, 0x9a, 0x5c, 0x66, 0x6c, 0xd9, 0x8a, 0xc7, 0x16, 0x1e, 0x9e, 0x5e, 0xcb, 0x58, 0xfc, 0xca, - 0x96, 0x79, 0xf7, 0x78, 0x99, 0xa7, 0x5a, 0x95, 0x70, 0x84, 0xeb, 0x00, 0xe1, 0x9d, 0x97, 0xb5, - 0x1e, 0x4a, 0x1f, 0x4d, 0x57, 0xb0, 0xa8, 0x57, 0x89, 0xc9, 0x3f, 0xea, 0x72, 0x1e, 0xc1, 0xab, - 0xfc, 0x52, 0xcd, 0x92, 0x72, 0xda, 0x81, 0xd7, 0x53, 0x9d, 0x81, 0xa3, 0x59, 0xdd, 0x95, 0x78, - 0x63, 0xe0, 0x78, 0xe6, 0x92, 0xea, 0x0b, 0xb0, 0xa0, 0x6e, 0xfa, 0x62, 0x9a, 0x97, 0x74, 0x55, - 0x01, 0xe9, 0x10, 0x9a, 0x4a, 0xed, 0xd9, 0x8e, 0x1d, 0xec, 0xf3, 0xf9, 0x32, 0x9b, 0x07, 0x09, - 0xea, 0xb0, 0x9f, 0xa7, 0xf8, 0x99, 0x4d, 0x8c, 0xbe, 0x6b, 0x61, 0x66, 0x8c, 0x53, 0x7a, 0x85, - 0x02, 0x36, 0x5c, 0x0b, 0x47, 0x17, 0xa4, 0x72, 0xac, 0x0b, 0x52, 0x4d, 0x5c, 0x90, 0x45, 0x28, - 0xfb, 0xd8, 0x0c, 0x5c, 0xa7, 0x05, 0xfc, 0x17, 0x2c, 0x1f, 0xd1, 0x58, 0x31, 0xc2, 0x41, 0x40, - 0x37, 0x10, 0x09, 0x8c, 0x18, 0x2a, 0x69, 0xd6, 0x4c, 0x5e, 0x9a, 0x75, 0x48, 0xbf, 0x31, 0x91, - 0x66, 0xd5, 0xf3, 0xd2, 0xac, 0xa3, 0xb4, 0x1b, 0x95, 0x24, 0xb2, 0x71, 0x58, 0x12, 0xf9, 0x53, - 0x5e, 0x9c, 0xbb, 0xb0, 0x94, 0x32, 0x75, 0x71, 0x73, 0xae, 0x26, 0xba, 0x92, 0xad, 0x3c, 0x29, - 0x84, 0x4d, 0xc9, 0xff, 0x80, 0xd9, 0xad, 0x67, 0xb8, 0xdf, 0x3b, 0x70, 0xfa, 0xc7, 0x08, 0xfb, - 0x4d, 0x28, 0xf5, 0x47, 0x96, 0x28, 0xc7, 0xe9, 0xa7, 0x9a, 0x08, 0x94, 0xe2, 0x89, 0x80, 0x01, - 0xcd, 0x68, 0x07, 0xc1, 0xe7, 0x22, 0xe5, 0xd3, 0xa2, 0xc8, 0x94, 0xf8, 0x8c, 0x2e, 0x46, 0x02, - 0x8e, 0x7d, 0x9f, 0x9d, 0x9a, 0xc3, 0xb1, 0xef, 0xc7, 0xcd, 0xb6, 0x14, 0x37, 0x5b, 0xed, 0x31, - 0xd4, 0xe8, 0x06, 0x3f, 0x88, 0x7d, 0x91, 0x0d, 0x97, 0xa2, 0x6c, 0x38, 0x4c, 0xaa, 0x27, 0x95, - 0xa4, 0x5a, 0x5b, 0x85, 0x19, 0xbe, 0x97, 0x38, 0x48, 0x13, 0x4a, 0x63, 0x7f, 0x28, 0xf5, 0x36, - 0xf6, 0x87, 0xda, 0xbf, 0x43, 0xbd, 0x43, 0x88, 0xd9, 0xdf, 0x3f, 0x06, 0x3f, 0xe1, 0x5e, 0x45, - 0x35, 0x81, 0x4f, 0xf1, 0xa4, 0x69, 0xd0, 0x90, 0xb4, 0x73, 0xf7, 0xef, 0x02, 0xda, 0x71, 0x7d, - 0x72, 0xc7, 0xf5, 0xbf, 0x36, 0x7d, 0xeb, 0x78, 0x09, 0x31, 0x82, 0x49, 0xf1, 0xee, 0xa2, 0x74, - 0x71, 0x4a, 0x67, 0xdf, 0xda, 0xeb, 0x30, 0x1f, 0xa3, 0x97, 0xbb, 0xf1, 0x0d, 0xa8, 0x31, 0x3f, - 0x21, 0x92, 0xa6, 0x8b, 0x6a, 0xcf, 0xed, 0x30, 0x67, 0x42, 0xcb, 0x6a, 0x1a, 0x08, 0x18, 0x3c, - 0xf4, 0xda, 0x6f, 0x26, 0x52, 0x8b, 0x85, 0xf8, 0xfa, 0x44, 0x5a, 0xf1, 0xab, 0x02, 0x4c, 0x31, - 0x78, 0xca, 0x6d, 0x2f, 0x43, 0xd5, 0xc7, 0x9e, 0x6b, 0x10, 0x73, 0x10, 0x3e, 0x65, 0xa1, 0x80, - 0x87, 0xe6, 0x20, 0x60, 0x2f, 0x71, 0xe8, 0xa4, 0x65, 0x0f, 0x70, 0x40, 0xe4, 0x7b, 0x96, 0x1a, - 0x85, 0x6d, 0x72, 0x10, 0x15, 0x49, 0x60, 0xff, 0x27, 0xcf, 0x19, 0x26, 0x75, 0xf6, 0x8d, 0xce, - 0xf3, 0xff, 0xe2, 0x87, 0xb4, 0x58, 0xd8, 0xcf, 0xf2, 0x36, 0x54, 0x12, 0x5d, 0x95, 0x70, 0xac, - 0xbd, 0x0f, 0x48, 0x3d, 0xb3, 0x10, 0xea, 0x05, 0x28, 0x33, 0x91, 0xc8, 0xa0, 0xd7, 0x88, 0x1f, - 0x5a, 0x17, 0xb3, 0xda, 0x6d, 0x40, 0x5c, 0x8a, 0xb1, 0x40, 0x77, 0x74, 0x89, 0xbf, 0x07, 0xf3, - 0xb1, 0xf5, 0xe1, 0x6f, 0xd0, 0x18, 0x81, 0xe4, 0xee, 0x62, 0xf1, 0x1f, 0x0a, 0x00, 0x9d, 0x31, - 0xd9, 0x17, 0xdd, 0x04, 0xf5, 0x94, 0x85, 0xf8, 0x29, 0xe9, 0x9c, 0x67, 0x06, 0xc1, 0xd7, 0xae, - 0x2f, 0x33, 0xb9, 0x70, 0xcc, 0x3a, 0x01, 0x63, 0xb2, 0x2f, 0x5b, 0x88, 0xf4, 0x1b, 0x9d, 0x87, - 0x06, 0x7f, 0x81, 0x64, 0x98, 0x96, 0xe5, 0xe3, 0x20, 0x10, 0xbd, 0xc4, 0x3a, 0x87, 0x76, 0x38, - 0x90, 0xa2, 0xd9, 0x16, 0x76, 0x88, 0x4d, 0x0e, 0x0c, 0xe2, 0x3e, 0xc1, 0x8e, 0xc8, 0xd1, 0xea, - 0x12, 0xfa, 0x90, 0x02, 0x29, 0x9a, 0x8f, 0x07, 0x76, 0x40, 0x7c, 0x89, 0x26, 0x7b, 0x5b, 0x02, - 0xca, 0xd0, 0xb4, 0x6f, 0x0b, 0xd0, 0xdc, 0x19, 0x0f, 0x87, 0xfc, 0x90, 0xc7, 0x95, 0x25, 0x7a, - 0x5d, 0x9c, 0xa3, 0x98, 0xb0, 0x86, 0x48, 0x44, 0xe2, 0x70, 0x3f, 0xbc, 0x76, 0xbc, 0x0a, 0x73, - 0x0a, 0xa3, 0x42, 0x69, 0xb1, 0x50, 0x5c, 0x88, 0x87, 0x62, 0x6a, 0x28, 0xbc, 0x5c, 0x7a, 0xb9, - 0xc3, 0x69, 0x27, 0x60, 0x3e, 0xb6, 0x5e, 0x94, 0x5a, 0x97, 0xa1, 0x2e, 0x7e, 0x38, 0x0a, 0x23, - 0x38, 0x09, 0x15, 0xea, 0x5e, 0xfa, 0xb6, 0x25, 0x7b, 0xc7, 0xd3, 0x9e, 0x6b, 0x6d, 0xd8, 0x96, - 0xaf, 0x75, 0xa1, 0xae, 0x73, 0xf2, 0x02, 0xf7, 0x16, 0x34, 0xc4, 0xef, 0x49, 0x23, 0xf6, 0x03, - 0x3f, 0x6a, 0x74, 0xc6, 0x68, 0xeb, 0x75, 0x47, 0x1d, 0x6a, 0x5f, 0x42, 0xfb, 0x91, 0x67, 0xd1, - 0x8c, 0x49, 0xa5, 0x2a, 0x8f, 0x76, 0x0b, 0xe4, 0x0b, 0xb9, 0x3c, 0xe2, 0xf1, 0x65, 0x75, 0x5f, - 0x1d, 0x6a, 0xa7, 0x61, 0x39, 0x93, 0xb8, 0x38, 0xb7, 0x07, 0xcd, 0x68, 0xc2, 0xb2, 0x65, 0xcb, - 0x9c, 0xb5, 0xc2, 0x0b, 0x4a, 0x2b, 0x7c, 0x31, 0x0c, 0xc3, 0xdc, 0xa1, 0x8b, 0x91, 0x92, 0x19, - 0x95, 0xf2, 0x32, 0xa3, 0xc9, 0x58, 0x66, 0xa4, 0x7d, 0x12, 0x4a, 0x4f, 0xa4, 0xa5, 0xef, 0xb2, - 0xdc, 0x98, 0xef, 0x2d, 0xdd, 0xc4, 0xc9, 0x8c, 0xc3, 0x71, 0x0c, 0x5d, 0x41, 0xd6, 0x66, 0xa1, - 0x1e, 0x73, 0x18, 0xda, 0x87, 0xd0, 0x48, 0x78, 0x80, 0xb5, 0x44, 0xfe, 0x90, 0x12, 0x5b, 0x3c, - 0x7b, 0xb8, 0x7c, 0x0a, 0x2a, 0xf2, 0x21, 0x1f, 0x9a, 0x86, 0xd2, 0xc3, 0x8d, 0x9d, 0xe6, 0x04, - 0xfd, 0x78, 0xb4, 0xb9, 0xd3, 0x2c, 0x5c, 0xbe, 0x09, 0xb3, 0x89, 0xbf, 0x5f, 0x68, 0x0e, 0xea, - 0xbd, 0x4e, 0x77, 0xf3, 0xa3, 0x07, 0x9f, 0x1b, 0xfa, 0x56, 0x67, 0xf3, 0x8b, 0xe6, 0x04, 0x5a, - 0x80, 0xa6, 0x04, 0x75, 0x1f, 0x3c, 0xe4, 0xd0, 0xc2, 0xe5, 0x27, 0xd0, 0x88, 0x27, 0xc8, 0xe8, - 0x04, 0xcc, 0x6d, 0x3c, 0xe8, 0x3e, 0xec, 0x6c, 0x77, 0xb7, 0x74, 0x63, 0x43, 0xdf, 0xea, 0x3c, - 0xdc, 0xda, 0x6c, 0x4e, 0xc4, 0xc1, 0xfa, 0xa3, 0x6e, 0x77, 0xbb, 0xfb, 0x71, 0xb3, 0x40, 0xa9, - 0x46, 0xe0, 0xad, 0xcf, 0xb7, 0x29, 0x72, 0x31, 0x8e, 0xfc, 0xa8, 0x7b, 0xb7, 0xfb, 0xe0, 0xdf, - 0xba, 0xcd, 0xd2, 0xfa, 0x2f, 0x6a, 0xd0, 0x90, 0x07, 0xc4, 0x3e, 0x6b, 0xcf, 0xde, 0x86, 0x69, - 0xf9, 0xc6, 0x32, 0x4a, 0xd9, 0xe3, 0x0f, 0x42, 0xdb, 0xad, 0xf4, 0x84, 0x30, 0x94, 0x09, 0xb4, - 0xc3, 0x14, 0xa7, 0xfc, 0x69, 0x3c, 0xad, 0x8a, 0x32, 0xf5, 0x2b, 0xb3, 0xbd, 0x92, 0x37, 0x1d, - 0x52, 0xec, 0x51, 0x6d, 0xa9, 0xef, 0x47, 0x50, 0xb4, 0x26, 0xf3, 0x5d, 0x4a, 0xfb, 0x4c, 0xee, - 0x7c, 0x48, 0xf4, 0x0b, 0x68, 0x26, 0x5f, 0x8e, 0xa0, 0xa8, 0xcd, 0x9e, 0xf3, 0x2a, 0xa5, 0x7d, - 0xf6, 0x10, 0x0c, 0x95, 0x74, 0xea, 0x8d, 0xc5, 0x6a, 0xfe, 0x5f, 0xf2, 0x14, 0xe9, 0xbc, 0x5f, - 0xef, 0x5c, 0x14, 0xf1, 0x3f, 0x84, 0x48, 0x7d, 0xd9, 0x90, 0xf1, 0xa7, 0x58, 0x11, 0x45, 0xf6, - 0xaf, 0x45, 0x6d, 0x02, 0x7d, 0x06, 0xb3, 0x89, 0xce, 0x1c, 0x8a, 0x56, 0x65, 0xf7, 0x19, 0xdb, - 0xab, 0xf9, 0x08, 0x71, 0xbd, 0xa9, 0x7d, 0xb7, 0x98, 0xde, 0x32, 0x9a, 0x79, 0x31, 0xbd, 0x65, - 0x36, 0xec, 0x98, 0x79, 0xc5, 0xba, 0x6b, 0x8a, 0x79, 0x65, 0xb5, 0xf2, 0xda, 0x2b, 0x79, 0xd3, - 0xea, 0xf1, 0x13, 0x9d, 0x35, 0xe5, 0xf8, 0xd9, 0x0d, 0xbb, 0xf6, 0x6a, 0x3e, 0x42, 0x52, 0x57, - 0x51, 0x99, 0x9f, 0xd0, 0x55, 0xaa, 0xab, 0x94, 0xd0, 0x55, 0xba, 0x3f, 0x20, 0x74, 0x95, 0xa8, - 0xd7, 0xcf, 0xe4, 0x96, 0x3a, 0x69, 0x5d, 0x65, 0x57, 0x4f, 0xda, 0x04, 0xea, 0x40, 0x45, 0xd6, - 0x2a, 0x28, 0xba, 0xdd, 0x89, 0x02, 0xa9, 0x7d, 0x32, 0x63, 0x26, 0x24, 0xf1, 0x2f, 0x30, 0x49, - 0xa1, 0x68, 0x21, 0x86, 0x24, 0x97, 0x9e, 0x48, 0x40, 0xc3, 0x65, 0xef, 0x41, 0x99, 0xa7, 0xf6, - 0x28, 0xf2, 0xb9, 0xb1, 0x3a, 0xa2, 0xbd, 0x94, 0x82, 0x87, 0x8b, 0x3f, 0xe1, 0xef, 0xae, 0x45, - 0x8e, 0x8e, 0x96, 0x63, 0x8f, 0x12, 0xe3, 0x95, 0x40, 0xfb, 0x54, 0xf6, 0x64, 0x48, 0x6b, 0x17, - 0xe6, 0x33, 0x42, 0x20, 0x8a, 0x5a, 0x4b, 0xf9, 0xd1, 0xb7, 0x7d, 0xee, 0x70, 0x24, 0xf5, 0xb0, - 0x42, 0x6b, 0x8b, 0xaa, 0xa9, 0x2b, 0xca, 0x5a, 0x4a, 0xc1, 0xe5, 0xe2, 0xf5, 0xdf, 0x14, 0x61, - 0x86, 0x27, 0x2a, 0xc2, 0x55, 0x7f, 0x0c, 0x10, 0xe5, 0xd2, 0xa8, 0x1d, 0xb3, 0x9e, 0x58, 0x51, - 0xd1, 0x5e, 0xce, 0x9c, 0x53, 0xc5, 0xa8, 0xa4, 0xc5, 0x8a, 0x18, 0xd3, 0xc9, 0xb6, 0x22, 0xc6, - 0x8c, 0x4c, 0x5a, 0x9b, 0x40, 0x9b, 0x50, 0x0d, 0x73, 0x35, 0xa4, 0xa4, 0x78, 0x89, 0x44, 0xb3, - 0xdd, 0xce, 0x9a, 0x52, 0x39, 0x52, 0xf2, 0x2f, 0x85, 0xa3, 0x74, 0x56, 0xa7, 0x70, 0x94, 0x95, - 0xb2, 0x4d, 0x7c, 0x74, 0xea, 0xbb, 0xef, 0x57, 0x0a, 0x7f, 0xfe, 0x7e, 0x65, 0xe2, 0xbf, 0x9e, - 0xaf, 0x14, 0xbe, 0x7b, 0xbe, 0x52, 0xf8, 0xe3, 0xf3, 0x95, 0xc2, 0x5f, 0x9f, 0xaf, 0x14, 0xbe, - 0xf9, 0xdb, 0xca, 0xc4, 0x6e, 0x99, 0x3d, 0xc3, 0x7f, 0xfb, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x60, 0x93, 0xd6, 0x21, 0x3a, 0x31, 0x00, 0x00, + 0x2c, 0xee, 0x69, 0x8f, 0x7b, 0xd9, 0x2a, 0xef, 0x31, 0xb7, 0x1c, 0x52, 0xe5, 0x4a, 0x52, 0x95, + 0x43, 0xaa, 0x52, 0x95, 0x9f, 0xe0, 0xaa, 0x54, 0xaa, 0x72, 0xc8, 0x21, 0xb9, 0xc5, 0xca, 0x3d, + 0xbf, 0x21, 0xd5, 0x5f, 0x33, 0x3d, 0x5f, 0x14, 0x29, 0xbb, 0x62, 0xdd, 0xa6, 0x5f, 0xbf, 0x7e, + 0xfd, 0xfa, 0xbd, 0xd7, 0xef, 0x6b, 0x1a, 0xaa, 0xa6, 0x67, 0xaf, 0x79, 0xbe, 0x4b, 0x5c, 0x34, + 0xed, 0x8f, 0x1d, 0x62, 0x8f, 0x70, 0xfb, 0xca, 0xc0, 0x26, 0xfb, 0xe3, 0xdd, 0xb5, 0xbe, 0x3b, + 0x7a, 0x6b, 0xe0, 0x0e, 0xdc, 0xb7, 0xd8, 0xfc, 0xee, 0x78, 0x8f, 0x8d, 0xd8, 0x80, 0x7d, 0xf1, + 0x75, 0xda, 0x65, 0x68, 0x7c, 0x86, 0xfd, 0xc0, 0x76, 0x1d, 0x1d, 0x7f, 0x35, 0xc6, 0x01, 0x41, + 0x2d, 0x98, 0x7e, 0xca, 0x21, 0xad, 0xc2, 0x6a, 0xe1, 0x62, 0x55, 0x97, 0x43, 0xed, 0xdb, 0x02, + 0xcc, 0x86, 0xc8, 0x81, 0xe7, 0x3a, 0x01, 0xce, 0xc7, 0x46, 0x67, 0x61, 0x46, 0xf0, 0x64, 0x38, + 0xe6, 0x08, 0xb7, 0x8a, 0x6c, 0xba, 0x26, 0x60, 0x5d, 0x73, 0x84, 0xd1, 0xeb, 0x30, 0x2b, 0x51, + 0x24, 0x91, 0x12, 0xc3, 0x6a, 0x08, 0xb0, 0xd8, 0x0d, 0xad, 0xc1, 0xbc, 0x44, 0x34, 0x3d, 0x3b, + 0x44, 0x9e, 0x64, 0xc8, 0x73, 0x62, 0xaa, 0xe3, 0xd9, 0x02, 0x5f, 0xfb, 0x12, 0xaa, 0x9b, 0xdd, + 0xde, 0x86, 0xeb, 0xec, 0xd9, 0x03, 0xca, 0x62, 0x80, 0x7d, 0xba, 0xa6, 0x55, 0x58, 0x2d, 0x51, + 0x16, 0xc5, 0x10, 0xb5, 0xa1, 0x12, 0x60, 0xd3, 0xef, 0xef, 0xe3, 0xa0, 0x55, 0x64, 0x53, 0xe1, + 0x98, 0xae, 0x72, 0x3d, 0x62, 0xbb, 0x4e, 0xd0, 0x2a, 0xf1, 0x55, 0x62, 0xa8, 0xfd, 0xac, 0x00, + 0xb5, 0x1d, 0xd7, 0x27, 0xf7, 0x4d, 0xcf, 0xb3, 0x9d, 0x01, 0xba, 0x02, 0x15, 0x26, 0xcb, 0xbe, + 0x3b, 0x64, 0x32, 0x68, 0xac, 0xcf, 0xad, 0x09, 0x96, 0xd6, 0x76, 0xc4, 0x84, 0x1e, 0xa2, 0xa0, + 0xf3, 0xd0, 0xe8, 0xbb, 0x0e, 0x31, 0x6d, 0x07, 0xfb, 0x86, 0xe7, 0xfa, 0x84, 0x49, 0x66, 0x4a, + 0xaf, 0x87, 0x50, 0x4a, 0x1c, 0x2d, 0x43, 0x75, 0xdf, 0x0d, 0x08, 0xc7, 0x28, 0x31, 0x8c, 0x0a, + 0x05, 0xb0, 0xc9, 0x25, 0x98, 0x66, 0x93, 0xb6, 0x27, 0x64, 0x50, 0xa6, 0xc3, 0x6d, 0x4f, 0xfb, + 0xa6, 0x00, 0x53, 0xf7, 0xdd, 0xb1, 0x43, 0x12, 0xdb, 0x98, 0x64, 0x5f, 0xe8, 0x47, 0xd9, 0xc6, + 0x24, 0xfb, 0xd1, 0x36, 0x14, 0x83, 0xab, 0x88, 0x6f, 0x43, 0x27, 0xdb, 0x50, 0xf1, 0xb1, 0x69, + 0xb9, 0xce, 0xf0, 0x80, 0xb1, 0x50, 0xd1, 0xc3, 0x31, 0xd5, 0x5d, 0x80, 0x87, 0xb6, 0x33, 0x7e, + 0x66, 0xf8, 0x78, 0x68, 0xee, 0xe2, 0x21, 0x63, 0xa5, 0xa2, 0x37, 0x04, 0x58, 0xe7, 0x50, 0xed, + 0x31, 0xcc, 0x52, 0x65, 0x07, 0x9e, 0xd9, 0xc7, 0x0f, 0x98, 0x08, 0xa9, 0x69, 0xb0, 0x4d, 0x1d, + 0x4c, 0xbe, 0x76, 0xfd, 0x27, 0x8c, 0xb3, 0x8a, 0x5e, 0xa3, 0xb0, 0x2e, 0x07, 0xa1, 0x93, 0x50, + 0xe1, 0x7c, 0xd9, 0x16, 0x63, 0xab, 0xa2, 0xb3, 0x13, 0xef, 0xd8, 0x56, 0x38, 0x65, 0x7b, 0x7d, + 0xc1, 0xd5, 0x34, 0x3f, 0x7d, 0x5f, 0xd3, 0x00, 0xb6, 0x1d, 0x72, 0xfd, 0x9d, 0xcf, 0xcc, 0xe1, + 0x18, 0xa3, 0x05, 0x98, 0x7a, 0x4a, 0x3f, 0x18, 0xfd, 0x92, 0xce, 0x07, 0xda, 0x9f, 0x8b, 0xb0, + 0x7c, 0x8f, 0x32, 0xd8, 0x33, 0x1d, 0x6b, 0xd7, 0x7d, 0xd6, 0xc3, 0xfd, 0xb1, 0x6f, 0x93, 0x83, + 0x0d, 0xd7, 0x21, 0xf8, 0x19, 0x41, 0x5b, 0x30, 0xe7, 0x48, 0x7e, 0x0d, 0x69, 0x02, 0x94, 0x42, + 0x6d, 0xbd, 0x15, 0xea, 0x35, 0x71, 0x22, 0xbd, 0xe9, 0xc4, 0x01, 0x01, 0xfa, 0x20, 0x92, 0x8f, + 0x24, 0x52, 0x64, 0x44, 0x16, 0x43, 0x22, 0xbd, 0x2d, 0xc6, 0x87, 0x20, 0x21, 0xe5, 0x26, 0x09, + 0xbc, 0x0d, 0xf4, 0xae, 0x18, 0x66, 0x60, 0x8c, 0x03, 0xec, 0xb3, 0x93, 0xd6, 0xd6, 0xe7, 0xc3, + 0xc5, 0xd1, 0x39, 0xf5, 0xaa, 0x3f, 0x76, 0x3a, 0xc1, 0xa3, 0x00, 0xfb, 0xec, 0x46, 0x09, 0x0d, + 0x19, 0xbe, 0xeb, 0x92, 0xbd, 0x40, 0x6a, 0x45, 0x82, 0x75, 0x06, 0x45, 0x6f, 0xc1, 0x7c, 0x30, + 0xf6, 0xbc, 0x21, 0x1e, 0x61, 0x87, 0x98, 0x43, 0x63, 0xe0, 0xbb, 0x63, 0x2f, 0x68, 0x4d, 0xad, + 0x96, 0x2e, 0x96, 0x74, 0xa4, 0x4e, 0x7d, 0xcc, 0x66, 0xd0, 0x0a, 0x80, 0xe7, 0xdb, 0x4f, 0xed, + 0x21, 0x1e, 0x60, 0xab, 0x55, 0x66, 0x44, 0x15, 0x88, 0xf6, 0x7f, 0x05, 0x38, 0xc1, 0x8e, 0xb3, + 0xe3, 0x5a, 0x42, 0xb2, 0xe2, 0xfe, 0xbd, 0x06, 0xf5, 0x3e, 0x23, 0x6f, 0x78, 0xa6, 0x8f, 0x1d, + 0x22, 0x0c, 0x71, 0x86, 0x03, 0x77, 0x18, 0x0c, 0x3d, 0x80, 0x66, 0x20, 0x14, 0x61, 0xf4, 0xb9, + 0x26, 0x84, 0xbc, 0xce, 0x85, 0x47, 0x3e, 0x44, 0x6b, 0xfa, 0x6c, 0x10, 0x07, 0x68, 0x3e, 0xa0, + 0x88, 0x93, 0xfb, 0x98, 0x98, 0x96, 0x49, 0x4c, 0x84, 0x60, 0x92, 0x39, 0x23, 0xce, 0x02, 0xfb, + 0x46, 0x4d, 0x28, 0x8d, 0x85, 0x95, 0x55, 0x75, 0xfa, 0x89, 0x4e, 0x41, 0x35, 0xd4, 0xa7, 0xf0, + 0x48, 0x11, 0x80, 0x7a, 0x06, 0x93, 0x10, 0x3c, 0xf2, 0x08, 0x93, 0x6d, 0x5d, 0x97, 0x43, 0xed, + 0xf7, 0x93, 0xd0, 0x4c, 0x1d, 0xff, 0x06, 0x54, 0x46, 0x62, 0x7b, 0x61, 0x46, 0xcb, 0x91, 0x7b, + 0x48, 0x71, 0xa8, 0x87, 0xc8, 0xf4, 0xf6, 0x51, 0xbb, 0x56, 0x9c, 0x67, 0x38, 0xa6, 0x32, 0x1d, + 0xba, 0x03, 0xc3, 0xb2, 0x7d, 0xdc, 0x27, 0xae, 0x7f, 0x20, 0xb8, 0x9c, 0x19, 0xba, 0x83, 0x4d, + 0x09, 0x43, 0xd7, 0x00, 0x2c, 0x27, 0xa0, 0xe2, 0xdc, 0xb3, 0x07, 0x8c, 0xd7, 0xda, 0x3a, 0x0a, + 0xf7, 0x0e, 0x1d, 0xa4, 0x5e, 0xb5, 0x9c, 0x40, 0x30, 0xfb, 0x2e, 0xd4, 0xa9, 0xc3, 0x31, 0x46, + 0xdc, 0xb7, 0x71, 0x83, 0xa8, 0xad, 0x2f, 0x28, 0x1c, 0x87, 0x8e, 0x4f, 0x9f, 0xf1, 0xa2, 0x41, + 0x80, 0x6e, 0x41, 0x99, 0x5d, 0xf8, 0xa0, 0x55, 0x66, 0x6b, 0xce, 0x67, 0x9c, 0x92, 0xef, 0xb2, + 0x76, 0x8f, 0xe1, 0x6d, 0x39, 0xc4, 0x3f, 0xd0, 0xc5, 0x22, 0x74, 0x0f, 0x6a, 0xa6, 0xe3, 0xb8, + 0xc4, 0xe4, 0x77, 0x65, 0x9a, 0xd1, 0xb8, 0x9c, 0x4f, 0xa3, 0x13, 0x21, 0x73, 0x42, 0xea, 0x72, + 0xf4, 0x0e, 0x4c, 0xb1, 0xcb, 0xd4, 0xaa, 0xb0, 0x53, 0xaf, 0xc4, 0x6d, 0x28, 0x49, 0x4c, 0xe7, + 0xc8, 0xed, 0x77, 0xa1, 0xa6, 0xb0, 0x46, 0x0d, 0xe3, 0x09, 0x3e, 0x10, 0xb6, 0x42, 0x3f, 0x23, + 0x8f, 0xc2, 0xf5, 0xc1, 0x07, 0x37, 0x8b, 0xff, 0x5e, 0x68, 0xdf, 0x86, 0x66, 0x92, 0xa3, 0xe3, + 0xac, 0xd7, 0xb6, 0x61, 0x41, 0x1f, 0x3b, 0x11, 0x63, 0x32, 0x1a, 0x5f, 0x83, 0xb2, 0xd0, 0x1f, + 0xb7, 0x9d, 0x93, 0xb9, 0x12, 0xd1, 0x05, 0xa2, 0x76, 0x0b, 0x4e, 0x24, 0x48, 0x89, 0x58, 0x7d, + 0x0e, 0x1a, 0x9e, 0x6b, 0x19, 0x01, 0x07, 0x1b, 0xb6, 0x25, 0x6f, 0xa2, 0x17, 0xe2, 0x6e, 0x5b, + 0x74, 0x79, 0x8f, 0xb8, 0x5e, 0x9a, 0x95, 0xa3, 0x2d, 0x6f, 0xc1, 0x62, 0x72, 0x39, 0xdf, 0x5e, + 0xfb, 0x00, 0x96, 0x74, 0x3c, 0x72, 0x9f, 0xe2, 0x97, 0x25, 0xdd, 0x86, 0x56, 0x9a, 0x40, 0x44, + 0x3c, 0x82, 0xf6, 0x88, 0x49, 0xc6, 0xc1, 0xf1, 0x88, 0x5f, 0x52, 0x09, 0x88, 0x28, 0xc4, 0xe9, + 0xa0, 0x06, 0x14, 0x6d, 0x4f, 0x2c, 0x2a, 0xda, 0x9e, 0xf6, 0x05, 0x54, 0xbb, 0xaa, 0x37, 0x50, + 0xc3, 0x58, 0x55, 0x97, 0x43, 0xb4, 0x1e, 0x65, 0x10, 0xc5, 0x17, 0x84, 0x8f, 0x30, 0xb7, 0xb8, + 0x9b, 0x72, 0xa2, 0x82, 0x87, 0x75, 0x80, 0xd0, 0x03, 0xc9, 0x70, 0x84, 0xd2, 0xf4, 0x74, 0x05, + 0x4b, 0xfb, 0x45, 0xcc, 0x1d, 0x29, 0x87, 0xb1, 0xc2, 0xc3, 0x58, 0x31, 0xf7, 0x54, 0x3c, 0x8e, + 0x7b, 0x5a, 0x83, 0xa9, 0x80, 0x98, 0x84, 0x3b, 0xc8, 0x86, 0x72, 0xb8, 0xf8, 0x96, 0x58, 0xe7, + 0x68, 0xe8, 0x34, 0x40, 0xdf, 0xc7, 0x26, 0xc1, 0x96, 0x61, 0x72, 0xcf, 0x59, 0xd2, 0xab, 0x02, + 0xd2, 0x21, 0xe8, 0x66, 0x24, 0xc7, 0x29, 0xc6, 0xc6, 0x6a, 0x06, 0xc1, 0x98, 0x5e, 0x22, 0x49, + 0x87, 0xb7, 0xbd, 0x7c, 0xf8, 0x6d, 0x17, 0xeb, 0x38, 0xb2, 0xe2, 0xb0, 0xa6, 0x73, 0x1d, 0x16, + 0x5f, 0x71, 0x14, 0x87, 0x55, 0xc9, 0x75, 0x58, 0x82, 0xc6, 0xa1, 0x0e, 0xeb, 0xa7, 0x74, 0x3d, + 0xf7, 0xa1, 0x95, 0xbe, 0x3a, 0xc2, 0x65, 0x5c, 0x83, 0x72, 0xc0, 0x20, 0x87, 0xb8, 0x1f, 0xb1, + 0x44, 0x20, 0x6a, 0x77, 0x60, 0x21, 0x61, 0x01, 0x3c, 0x1b, 0x0b, 0xed, 0xa5, 0x70, 0x24, 0x7b, + 0xd1, 0xfe, 0x51, 0x50, 0xad, 0xf7, 0x8e, 0x3d, 0x24, 0xd8, 0x4f, 0x59, 0xef, 0xdb, 0x92, 0x28, + 0x37, 0xdd, 0xd3, 0x79, 0x44, 0x79, 0xa2, 0x24, 0x2c, 0xb1, 0x07, 0x0d, 0xa6, 0x43, 0x23, 0xc0, + 0x43, 0x16, 0x2a, 0x59, 0x86, 0x5f, 0x5b, 0x7f, 0x33, 0x63, 0x35, 0xdf, 0x97, 0x1b, 0x40, 0x4f, + 0xa0, 0x73, 0xf5, 0xd5, 0x87, 0x2a, 0xac, 0xfd, 0x21, 0xa0, 0x34, 0xd2, 0xb1, 0xf4, 0xf0, 0x09, + 0xbd, 0xfb, 0x34, 0xc1, 0xcf, 0x88, 0x01, 0x7b, 0x8c, 0x8d, 0x43, 0x94, 0xc0, 0xf9, 0xd4, 0x05, + 0xa2, 0xf6, 0xf3, 0x12, 0x40, 0x34, 0xf9, 0xca, 0x5e, 0xfa, 0x1b, 0xe1, 0x15, 0xe4, 0x79, 0xc6, + 0x99, 0x0c, 0x7a, 0x99, 0x97, 0xef, 0x4e, 0xfc, 0xf2, 0xf1, 0x8c, 0xe3, 0x5c, 0xd6, 0xea, 0x57, + 0xf6, 0xda, 0x6d, 0xc0, 0x62, 0x52, 0xdd, 0xe2, 0xd2, 0x5d, 0x82, 0x29, 0x9b, 0xe0, 0x11, 0x2f, + 0x57, 0xd5, 0x9c, 0x5f, 0xc1, 0xe5, 0x18, 0xda, 0x59, 0xa8, 0x6e, 0x8f, 0xcc, 0x01, 0xee, 0x79, + 0xb8, 0x4f, 0xf7, 0xb2, 0xe9, 0x40, 0xec, 0xcf, 0x07, 0xda, 0x3a, 0x54, 0xee, 0xe2, 0x03, 0x7e, + 0x07, 0x8f, 0xc8, 0x9f, 0xf6, 0x87, 0x02, 0x2c, 0x31, 0xdf, 0xb9, 0x21, 0x8b, 0x45, 0x1d, 0x07, + 0xee, 0xd8, 0xef, 0xe3, 0x80, 0xa9, 0xd4, 0x1b, 0x1b, 0x1e, 0xf6, 0x6d, 0xd7, 0x12, 0xa5, 0x55, + 0xb5, 0xef, 0x8d, 0x77, 0x18, 0x80, 0x16, 0x94, 0x74, 0xfa, 0xab, 0xb1, 0x2b, 0x6c, 0xab, 0xa4, + 0x57, 0xfa, 0xde, 0xf8, 0x53, 0x3a, 0x96, 0x6b, 0x83, 0x7d, 0xd3, 0xc7, 0x01, 0xb3, 0x21, 0xbe, + 0xb6, 0xc7, 0x00, 0xe8, 0x1a, 0x9c, 0x18, 0xe1, 0x91, 0xeb, 0x1f, 0x18, 0x43, 0x7b, 0x64, 0x13, + 0xc3, 0x76, 0x8c, 0xdd, 0x03, 0x82, 0x03, 0x61, 0x38, 0x88, 0x4f, 0xde, 0xa3, 0x73, 0xdb, 0xce, + 0x47, 0x74, 0x06, 0x69, 0x50, 0x77, 0xdd, 0x91, 0x11, 0xf4, 0x5d, 0x1f, 0x1b, 0xa6, 0xf5, 0x98, + 0x05, 0x8f, 0x92, 0x5e, 0x73, 0xdd, 0x51, 0x8f, 0xc2, 0x3a, 0xd6, 0x63, 0xcd, 0x84, 0x7a, 0xac, + 0xd4, 0xa2, 0x55, 0x00, 0xab, 0xa9, 0x44, 0x15, 0x40, 0xbf, 0x29, 0xcc, 0x77, 0x87, 0x52, 0x0e, + 0xec, 0x9b, 0xc2, 0xc8, 0x81, 0x27, 0x4b, 0x00, 0xf6, 0x4d, 0x05, 0x36, 0xc4, 0x4f, 0x45, 0xb5, + 0x5b, 0xd5, 0xf9, 0x40, 0xb3, 0x00, 0x36, 0x4c, 0xcf, 0xdc, 0xb5, 0x87, 0x36, 0x39, 0x40, 0x97, + 0xa0, 0x69, 0x5a, 0x96, 0xd1, 0x97, 0x10, 0x1b, 0xcb, 0xd6, 0xc3, 0xac, 0x69, 0x59, 0x1b, 0x0a, + 0x18, 0xbd, 0x01, 0x73, 0x96, 0xef, 0x7a, 0x71, 0x5c, 0xde, 0x8b, 0x68, 0xd2, 0x09, 0x15, 0x59, + 0x7b, 0x5e, 0x82, 0xd3, 0x71, 0xb5, 0x24, 0x8b, 0xd7, 0x1b, 0x30, 0x93, 0xd8, 0x35, 0x5e, 0x35, + 0x46, 0x4c, 0xea, 0x31, 0xc4, 0x44, 0x79, 0x57, 0x4c, 0x96, 0x77, 0xd9, 0x55, 0x71, 0xe9, 0xc7, + 0xa8, 0x8a, 0x27, 0x7f, 0x48, 0x55, 0x3c, 0x75, 0xa4, 0xaa, 0xf8, 0x02, 0xeb, 0x33, 0xc9, 0x45, + 0xac, 0xa0, 0x2a, 0xf3, 0x66, 0x48, 0x88, 0xe3, 0xc8, 0x7e, 0x54, 0xa2, 0x7a, 0x9e, 0x3e, 0x4e, + 0xf5, 0x5c, 0xc9, 0xad, 0x9e, 0xa9, 0x45, 0x78, 0x9e, 0xe9, 0x8f, 0x5c, 0xdf, 0xf0, 0x7c, 0x77, + 0xcf, 0x1e, 0xe2, 0x56, 0x95, 0xb1, 0x30, 0x2b, 0xe1, 0x3b, 0x1c, 0xac, 0xfd, 0xb2, 0x00, 0x0b, + 0x71, 0x25, 0x8b, 0xda, 0xec, 0x36, 0x54, 0x7d, 0x79, 0x0b, 0x85, 0x62, 0x57, 0xe3, 0x99, 0x4e, + 0xfa, 0xb6, 0xea, 0xd1, 0x12, 0xf4, 0x69, 0x6e, 0x89, 0x7d, 0x21, 0x87, 0xcc, 0x0b, 0x8b, 0xec, + 0x0e, 0xcc, 0x85, 0xc8, 0x87, 0xd6, 0xd8, 0x4a, 0xcd, 0x5c, 0x8c, 0xd7, 0xcc, 0x0e, 0x94, 0x37, + 0xf1, 0x53, 0xbb, 0x8f, 0x7f, 0x94, 0x8e, 0xd5, 0x2a, 0xd4, 0x3c, 0xec, 0x8f, 0xec, 0x20, 0x08, + 0x0d, 0xb4, 0xaa, 0xab, 0x20, 0xed, 0xaf, 0x53, 0x30, 0x9b, 0x94, 0xec, 0xf5, 0x54, 0x89, 0xde, + 0x8e, 0x6e, 0x4c, 0xf2, 0x7c, 0x4a, 0x34, 0xbc, 0x28, 0x1d, 0x6e, 0x31, 0x91, 0x8f, 0x87, 0x3e, + 0x59, 0x38, 0x61, 0x7a, 0xfe, 0xbe, 0x3b, 0x1a, 0x99, 0x8e, 0x25, 0xbb, 0x89, 0x62, 0x48, 0xa5, + 0x65, 0xfa, 0x03, 0x7a, 0x0d, 0x28, 0x98, 0x7d, 0xa3, 0x33, 0x50, 0xa3, 0x79, 0xad, 0xed, 0xb0, + 0x0a, 0x9f, 0x19, 0x79, 0x55, 0x07, 0x01, 0xda, 0xb4, 0x7d, 0x74, 0x1e, 0x26, 0xb1, 0xf3, 0x54, + 0xc6, 0xbd, 0xa8, 0xdd, 0x28, 0x1d, 0xbd, 0xce, 0xa6, 0xd1, 0x05, 0x28, 0x8f, 0xdc, 0xb1, 0x43, + 0x64, 0x86, 0xdb, 0x08, 0x11, 0x59, 0x8f, 0x50, 0x17, 0xb3, 0xe8, 0x12, 0x4c, 0x5b, 0x4c, 0x07, + 0x32, 0x8d, 0x9d, 0x8d, 0xba, 0x04, 0x0c, 0xae, 0xcb, 0x79, 0xf4, 0x7e, 0x18, 0xb1, 0xab, 0x89, + 0x98, 0x9b, 0x10, 0x6a, 0x66, 0xd8, 0xbe, 0x1b, 0x0f, 0xdb, 0xc0, 0x48, 0x5c, 0xca, 0x25, 0x71, + 0x78, 0x8d, 0x7f, 0x12, 0x2a, 0x43, 0x77, 0xc0, 0xed, 0xa0, 0xc6, 0x4b, 0xaf, 0xa1, 0x3b, 0x60, + 0x66, 0xb0, 0x40, 0xd3, 0x14, 0xcb, 0x76, 0x5a, 0x33, 0xec, 0xfa, 0xf2, 0x01, 0x8d, 0x3e, 0xec, + 0xc3, 0x70, 0x9d, 0x3e, 0x6e, 0xd5, 0xd9, 0x54, 0x95, 0x41, 0x1e, 0x38, 0x7d, 0x16, 0x1c, 0x09, + 0x39, 0x68, 0x35, 0x18, 0x9c, 0x7e, 0xd2, 0xec, 0x92, 0xd7, 0x15, 0xb3, 0x89, 0xec, 0x32, 0xeb, + 0x7e, 0xbe, 0x02, 0x4d, 0x84, 0xdf, 0x16, 0x60, 0x71, 0x83, 0x25, 0x57, 0x8a, 0x27, 0x38, 0x46, + 0x11, 0x8c, 0xae, 0x86, 0xdd, 0x86, 0x64, 0xc5, 0x9a, 0x3c, 0xac, 0xc0, 0x43, 0x1f, 0x42, 0x43, + 0xd2, 0x14, 0x2b, 0x4b, 0x2f, 0xea, 0x53, 0xd4, 0x03, 0x75, 0xa8, 0xbd, 0x0f, 0x4b, 0x29, 0x9e, + 0x45, 0x22, 0x74, 0x16, 0x66, 0x22, 0x8f, 0x10, 0xb2, 0x5c, 0x0b, 0x61, 0xdb, 0x96, 0x76, 0x13, + 0x4e, 0xf4, 0x88, 0xe9, 0x93, 0xd4, 0x81, 0x8f, 0xb0, 0x96, 0xb5, 0x2a, 0xe2, 0x6b, 0x45, 0x37, + 0xa1, 0x07, 0x0b, 0x3d, 0xe2, 0x7a, 0x2f, 0x41, 0x94, 0xde, 0x74, 0x7a, 0x6c, 0x77, 0x4c, 0x44, + 0xf6, 0x23, 0x87, 0xda, 0x12, 0x6f, 0xac, 0xa4, 0x77, 0x7b, 0x0f, 0x16, 0x79, 0x5f, 0xe3, 0x65, + 0x0e, 0x71, 0x52, 0x76, 0x55, 0xd2, 0x74, 0x37, 0x61, 0x3e, 0x72, 0xe5, 0x51, 0x21, 0x76, 0x25, + 0x5e, 0x88, 0x2d, 0xa5, 0x75, 0x1c, 0xab, 0xc3, 0xfe, 0xbf, 0xa8, 0x38, 0xcc, 0x9c, 0x32, 0x6c, + 0x3d, 0x5e, 0x86, 0x9d, 0xca, 0x21, 0x19, 0xab, 0xc2, 0xd2, 0x16, 0x59, 0xca, 0xb0, 0x48, 0x3d, + 0x55, 0xab, 0x4d, 0x32, 0xa7, 0xf1, 0x46, 0x7a, 0x8b, 0x7f, 0x61, 0xa9, 0xb6, 0xcd, 0x4b, 0xb5, + 0x70, 0xeb, 0xb0, 0xd7, 0x74, 0x35, 0x51, 0xaa, 0xb5, 0xf2, 0xd8, 0x0c, 0x2b, 0xb5, 0xff, 0x9d, + 0x84, 0x6a, 0x38, 0x97, 0x12, 0x6c, 0x5a, 0x48, 0xc5, 0x0c, 0x21, 0xa9, 0xf1, 0xab, 0xf4, 0x32, + 0xf1, 0x6b, 0xf2, 0x45, 0xf1, 0x6b, 0x19, 0xaa, 0xec, 0xc3, 0xf0, 0xf1, 0x9e, 0x88, 0x47, 0x15, + 0x06, 0xd0, 0xf1, 0x5e, 0x64, 0x50, 0xe5, 0xa3, 0x18, 0x54, 0xa2, 0x26, 0x9c, 0x4e, 0xd6, 0x84, + 0xd7, 0xc3, 0x08, 0xc3, 0x63, 0xd1, 0x4a, 0x9a, 0x5c, 0x66, 0x6c, 0xd9, 0x8a, 0xc7, 0x16, 0x1e, + 0x9e, 0x5e, 0xcb, 0x58, 0xfc, 0xca, 0x56, 0x84, 0xf7, 0x78, 0x45, 0xa8, 0x5a, 0x95, 0x70, 0x84, + 0xeb, 0x00, 0xe1, 0x9d, 0x97, 0x65, 0x21, 0x4a, 0x1f, 0x4d, 0x57, 0xb0, 0xa8, 0x57, 0x89, 0xc9, + 0x3f, 0x6a, 0x88, 0x1e, 0xc1, 0xab, 0xfc, 0x5a, 0xcd, 0x92, 0x72, 0x3a, 0x87, 0xd7, 0x53, 0x4d, + 0x84, 0xa3, 0x59, 0xdd, 0x95, 0x78, 0x0f, 0xe1, 0x78, 0xe6, 0x92, 0x6a, 0x21, 0xb0, 0xa0, 0x6e, + 0xfa, 0x62, 0x9a, 0x57, 0x7f, 0x55, 0x01, 0xe9, 0x10, 0x9a, 0x4a, 0xed, 0xd9, 0x8e, 0x1d, 0xec, + 0xf3, 0xf9, 0x32, 0x9b, 0x07, 0x09, 0xea, 0xb0, 0xff, 0xac, 0xf8, 0x99, 0x4d, 0x8c, 0xbe, 0x6b, + 0x61, 0x66, 0x8c, 0x53, 0x7a, 0x85, 0x02, 0x36, 0x5c, 0x0b, 0x47, 0x17, 0xa4, 0x72, 0xac, 0x0b, + 0x52, 0x4d, 0x5c, 0x90, 0x45, 0x28, 0xfb, 0xd8, 0x0c, 0x5c, 0xa7, 0x05, 0xfc, 0x6f, 0x2d, 0x1f, + 0xd1, 0x58, 0x31, 0xc2, 0x41, 0x40, 0x37, 0x10, 0x09, 0x8c, 0x18, 0x2a, 0x69, 0xd6, 0x4c, 0x5e, + 0x9a, 0x75, 0x48, 0x6b, 0x32, 0x91, 0x66, 0xd5, 0xf3, 0xd2, 0xac, 0xa3, 0x74, 0x26, 0x95, 0x24, + 0xb2, 0x71, 0x58, 0x12, 0xf9, 0x53, 0x5e, 0x9c, 0xbb, 0xb0, 0x94, 0x32, 0x75, 0x71, 0x73, 0xae, + 0x26, 0x1a, 0x98, 0xad, 0x3c, 0x29, 0x84, 0xfd, 0xcb, 0xff, 0x82, 0xd9, 0xad, 0x67, 0xb8, 0xdf, + 0x3b, 0x70, 0xfa, 0xc7, 0x08, 0xfb, 0x4d, 0x28, 0xf5, 0x47, 0x96, 0xa8, 0xdc, 0xe9, 0xa7, 0x9a, + 0x08, 0x94, 0xe2, 0x89, 0x80, 0x01, 0xcd, 0x68, 0x07, 0xc1, 0xe7, 0x22, 0xe5, 0xd3, 0xa2, 0xc8, + 0x94, 0xf8, 0x8c, 0x2e, 0x46, 0x02, 0x8e, 0x7d, 0x9f, 0x9d, 0x9a, 0xc3, 0xb1, 0xef, 0xc7, 0xcd, + 0xb6, 0x14, 0x37, 0x5b, 0xed, 0x31, 0xd4, 0xe8, 0x06, 0x3f, 0x88, 0x7d, 0x91, 0x0d, 0x97, 0xa2, + 0x6c, 0x38, 0x4c, 0xaa, 0x27, 0x95, 0xa4, 0x5a, 0x5b, 0x85, 0x19, 0xbe, 0x97, 0x38, 0x48, 0x13, + 0x4a, 0x63, 0x7f, 0x28, 0xf5, 0x36, 0xf6, 0x87, 0xda, 0x7f, 0x42, 0xbd, 0x43, 0x88, 0xd9, 0xdf, + 0x3f, 0x06, 0x3f, 0xe1, 0x5e, 0x45, 0x35, 0x81, 0x4f, 0xf1, 0xa4, 0x69, 0xd0, 0x90, 0xb4, 0x73, + 0xf7, 0xef, 0x02, 0xda, 0x71, 0x7d, 0x72, 0xc7, 0xf5, 0xbf, 0x36, 0x7d, 0xeb, 0x78, 0x09, 0x31, + 0x82, 0x49, 0xf1, 0x44, 0xa3, 0x74, 0x71, 0x4a, 0x67, 0xdf, 0xda, 0xeb, 0x30, 0x1f, 0xa3, 0x97, + 0xbb, 0xf1, 0x0d, 0xa8, 0x31, 0x3f, 0x21, 0x92, 0xa6, 0x8b, 0x6a, 0x7b, 0xee, 0x30, 0x67, 0x42, + 0xcb, 0x6a, 0x1a, 0x08, 0x18, 0x3c, 0xf4, 0xda, 0x6f, 0x26, 0x52, 0x8b, 0x85, 0xf8, 0xfa, 0x44, + 0x5a, 0xf1, 0x9b, 0x02, 0x4c, 0x31, 0x78, 0xca, 0x6d, 0x2f, 0x43, 0xd5, 0xc7, 0x9e, 0x6b, 0x10, + 0x73, 0x10, 0xbe, 0x7a, 0xa1, 0x80, 0x87, 0xe6, 0x20, 0x60, 0x8f, 0x76, 0xe8, 0xa4, 0x65, 0x0f, + 0x70, 0x40, 0xe4, 0xd3, 0x97, 0x1a, 0x85, 0x6d, 0x72, 0x10, 0x15, 0x49, 0x60, 0xff, 0x37, 0xcf, + 0x19, 0x26, 0x75, 0xf6, 0x8d, 0xce, 0xf3, 0x5f, 0xe8, 0x87, 0x74, 0x63, 0xd8, 0x7f, 0xf5, 0x36, + 0x54, 0x12, 0x0d, 0x98, 0x70, 0xac, 0xbd, 0x0f, 0x48, 0x3d, 0xb3, 0x10, 0xea, 0x05, 0x28, 0x33, + 0x91, 0xc8, 0xa0, 0xd7, 0x88, 0x1f, 0x5a, 0x17, 0xb3, 0xda, 0x6d, 0x40, 0x5c, 0x8a, 0xb1, 0x40, + 0x77, 0x74, 0x89, 0xbf, 0x07, 0xf3, 0xb1, 0xf5, 0xe1, 0x1f, 0xd3, 0x18, 0x81, 0xe4, 0xee, 0x62, + 0xf1, 0x1f, 0x0b, 0x00, 0x9d, 0x31, 0xd9, 0x17, 0xdd, 0x04, 0xf5, 0x94, 0x85, 0xf8, 0x29, 0xe9, + 0x9c, 0x67, 0x06, 0xc1, 0xd7, 0xae, 0x2f, 0x33, 0xb9, 0x70, 0xcc, 0x3a, 0x01, 0x63, 0xb2, 0x2f, + 0xbb, 0x8d, 0xf4, 0x1b, 0x9d, 0x87, 0x06, 0x7f, 0xac, 0x64, 0x98, 0x96, 0xe5, 0xe3, 0x20, 0x10, + 0x6d, 0xc7, 0x3a, 0x87, 0x76, 0x38, 0x90, 0xa2, 0xd9, 0x16, 0x76, 0x88, 0x4d, 0x0e, 0x0c, 0xe2, + 0x3e, 0xc1, 0x8e, 0xc8, 0xd1, 0xea, 0x12, 0xfa, 0x90, 0x02, 0x29, 0x9a, 0x8f, 0x07, 0x76, 0x40, + 0x7c, 0x89, 0x26, 0xdb, 0x60, 0x02, 0xca, 0xd0, 0xb4, 0x6f, 0x0b, 0xd0, 0xdc, 0x19, 0x0f, 0x87, + 0xfc, 0x90, 0xc7, 0x95, 0x25, 0x7a, 0x5d, 0x9c, 0xa3, 0x98, 0xb0, 0x86, 0x48, 0x44, 0xe2, 0x70, + 0x3f, 0xbc, 0x76, 0xbc, 0x0a, 0x73, 0x0a, 0xa3, 0x42, 0x69, 0xb1, 0x50, 0x5c, 0x88, 0x87, 0x62, + 0x6a, 0x28, 0xbc, 0x5c, 0x7a, 0xb9, 0xc3, 0x69, 0x27, 0x60, 0x3e, 0xb6, 0x5e, 0x94, 0x5a, 0x97, + 0xa1, 0x2e, 0xfe, 0x4d, 0x0a, 0x23, 0x38, 0x09, 0x15, 0xea, 0x5e, 0xfa, 0xb6, 0x25, 0xdb, 0xcc, + 0xd3, 0x9e, 0x6b, 0x6d, 0xd8, 0x96, 0xaf, 0x75, 0xa1, 0xae, 0x73, 0xf2, 0x02, 0xf7, 0x16, 0x34, + 0xc4, 0x9f, 0x4c, 0x23, 0xf6, 0xaf, 0x3f, 0xea, 0x89, 0xc6, 0x68, 0xeb, 0x75, 0x47, 0x1d, 0x6a, + 0x5f, 0x42, 0xfb, 0x91, 0x67, 0xd1, 0x8c, 0x49, 0xa5, 0x2a, 0x8f, 0x76, 0x0b, 0xe4, 0x63, 0xba, + 0x3c, 0xe2, 0xf1, 0x65, 0x75, 0x5f, 0x1d, 0x6a, 0xa7, 0x61, 0x39, 0x93, 0xb8, 0x38, 0xb7, 0x07, + 0xcd, 0x68, 0xc2, 0xb2, 0x65, 0x77, 0x9d, 0x75, 0xcd, 0x0b, 0x4a, 0xd7, 0x7c, 0x31, 0x0c, 0xc3, + 0xdc, 0xa1, 0x8b, 0x91, 0x92, 0x19, 0x95, 0xf2, 0x32, 0xa3, 0xc9, 0x58, 0x66, 0xa4, 0x7d, 0x12, + 0x4a, 0x4f, 0xa4, 0xa5, 0xef, 0xb2, 0xdc, 0x98, 0xef, 0x2d, 0xdd, 0xc4, 0xc9, 0x8c, 0xc3, 0x71, + 0x0c, 0x5d, 0x41, 0xd6, 0x66, 0xa1, 0x1e, 0x73, 0x18, 0xda, 0x87, 0xd0, 0x48, 0x78, 0x80, 0xb5, + 0x44, 0xfe, 0x90, 0x12, 0x5b, 0x3c, 0x7b, 0xb8, 0x7c, 0x0a, 0x2a, 0xf2, 0xcd, 0x1f, 0x9a, 0x86, + 0xd2, 0xc3, 0x8d, 0x9d, 0xe6, 0x04, 0xfd, 0x78, 0xb4, 0xb9, 0xd3, 0x2c, 0x5c, 0xbe, 0x09, 0xb3, + 0x89, 0x1f, 0x65, 0x68, 0x0e, 0xea, 0xbd, 0x4e, 0x77, 0xf3, 0xa3, 0x07, 0x9f, 0x1b, 0xfa, 0x56, + 0x67, 0xf3, 0x8b, 0xe6, 0x04, 0x5a, 0x80, 0xa6, 0x04, 0x75, 0x1f, 0x3c, 0xe4, 0xd0, 0xc2, 0xe5, + 0x27, 0xd0, 0x88, 0x27, 0xc8, 0xe8, 0x04, 0xcc, 0x6d, 0x3c, 0xe8, 0x3e, 0xec, 0x6c, 0x77, 0xb7, + 0x74, 0x63, 0x43, 0xdf, 0xea, 0x3c, 0xdc, 0xda, 0x6c, 0x4e, 0xc4, 0xc1, 0xfa, 0xa3, 0x6e, 0x77, + 0xbb, 0xfb, 0x71, 0xb3, 0x40, 0xa9, 0x46, 0xe0, 0xad, 0xcf, 0xb7, 0x29, 0x72, 0x31, 0x8e, 0xfc, + 0xa8, 0x7b, 0xb7, 0xfb, 0xe0, 0x3f, 0xba, 0xcd, 0xd2, 0xfa, 0xaf, 0x6a, 0xd0, 0x90, 0x07, 0xc4, + 0x3e, 0x6b, 0xcf, 0xde, 0x86, 0x69, 0xf9, 0x1c, 0x33, 0x4a, 0xd9, 0xe3, 0x6f, 0x47, 0xdb, 0xad, + 0xf4, 0x84, 0x30, 0x94, 0x09, 0xb4, 0xc3, 0x14, 0xa7, 0xfc, 0x94, 0x3c, 0xad, 0x8a, 0x32, 0xf5, + 0xd7, 0xb3, 0xbd, 0x92, 0x37, 0x1d, 0x52, 0xec, 0x51, 0x6d, 0xa9, 0x4f, 0x4d, 0x50, 0xb4, 0x26, + 0xf3, 0x09, 0x4b, 0xfb, 0x4c, 0xee, 0x7c, 0x48, 0xf4, 0x0b, 0x68, 0x26, 0x1f, 0x99, 0xa0, 0xa8, + 0xcd, 0x9e, 0xf3, 0x80, 0xa5, 0x7d, 0xf6, 0x10, 0x0c, 0x95, 0x74, 0xea, 0x39, 0xc6, 0x6a, 0xfe, + 0x0f, 0xf5, 0x14, 0xe9, 0xbc, 0xbf, 0xf4, 0x5c, 0x14, 0xf1, 0x9f, 0x89, 0x48, 0x7d, 0x04, 0x91, + 0xf1, 0x53, 0x59, 0x11, 0x45, 0xf6, 0x5f, 0x48, 0x6d, 0x02, 0x7d, 0x06, 0xb3, 0x89, 0xce, 0x1c, + 0x8a, 0x56, 0x65, 0xf7, 0x19, 0xdb, 0xab, 0xf9, 0x08, 0x71, 0xbd, 0xa9, 0x7d, 0xb7, 0x98, 0xde, + 0x32, 0x9a, 0x79, 0x31, 0xbd, 0x65, 0x36, 0xec, 0x98, 0x79, 0xc5, 0xba, 0x6b, 0x8a, 0x79, 0x65, + 0xb5, 0xf2, 0xda, 0x2b, 0x79, 0xd3, 0xea, 0xf1, 0x13, 0x9d, 0x35, 0xe5, 0xf8, 0xd9, 0x0d, 0xbb, + 0xf6, 0x6a, 0x3e, 0x42, 0x52, 0x57, 0x51, 0x99, 0x9f, 0xd0, 0x55, 0xaa, 0xab, 0x94, 0xd0, 0x55, + 0xba, 0x3f, 0x20, 0x74, 0x95, 0xa8, 0xd7, 0xcf, 0xe4, 0x96, 0x3a, 0x69, 0x5d, 0x65, 0x57, 0x4f, + 0xda, 0x04, 0xea, 0x40, 0x45, 0xd6, 0x2a, 0x28, 0xba, 0xdd, 0x89, 0x02, 0xa9, 0x7d, 0x32, 0x63, + 0x26, 0x24, 0xf1, 0x6f, 0x30, 0x49, 0xa1, 0x68, 0x21, 0x86, 0x24, 0x97, 0x9e, 0x48, 0x40, 0xc3, + 0x65, 0xef, 0x41, 0x99, 0xa7, 0xf6, 0x28, 0xf2, 0xb9, 0xb1, 0x3a, 0xa2, 0xbd, 0x94, 0x82, 0x87, + 0x8b, 0x3f, 0xe1, 0x4f, 0xb4, 0x45, 0x8e, 0x8e, 0x96, 0x63, 0xef, 0x17, 0xe3, 0x95, 0x40, 0xfb, + 0x54, 0xf6, 0x64, 0x48, 0x6b, 0x17, 0xe6, 0x33, 0x42, 0x20, 0x8a, 0x5a, 0x4b, 0xf9, 0xd1, 0xb7, + 0x7d, 0xee, 0x70, 0x24, 0xf5, 0xb0, 0x42, 0x6b, 0x8b, 0xaa, 0xa9, 0x2b, 0xca, 0x5a, 0x4a, 0xc1, + 0xe5, 0xe2, 0xf5, 0xdf, 0x15, 0x61, 0x86, 0x27, 0x2a, 0xc2, 0x55, 0x7f, 0x0c, 0x10, 0xe5, 0xd2, + 0xa8, 0x1d, 0xb3, 0x9e, 0x58, 0x51, 0xd1, 0x5e, 0xce, 0x9c, 0x53, 0xc5, 0xa8, 0xa4, 0xc5, 0x8a, + 0x18, 0xd3, 0xc9, 0xb6, 0x22, 0xc6, 0x8c, 0x4c, 0x5a, 0x9b, 0x40, 0x9b, 0x50, 0x0d, 0x73, 0x35, + 0xa4, 0xa4, 0x78, 0x89, 0x44, 0xb3, 0xdd, 0xce, 0x9a, 0x52, 0x39, 0x52, 0xf2, 0x2f, 0x85, 0xa3, + 0x74, 0x56, 0xa7, 0x70, 0x94, 0x95, 0xb2, 0x4d, 0x7c, 0x74, 0xea, 0xbb, 0xef, 0x57, 0x0a, 0x7f, + 0xf9, 0x7e, 0x65, 0xe2, 0x7f, 0x9e, 0xaf, 0x14, 0xbe, 0x7b, 0xbe, 0x52, 0xf8, 0xd3, 0xf3, 0x95, + 0xc2, 0xdf, 0x9e, 0xaf, 0x14, 0xbe, 0xf9, 0xfb, 0xca, 0xc4, 0x6e, 0x99, 0xbd, 0xd8, 0x7f, 0xfb, + 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0e, 0x3a, 0x75, 0xdc, 0x65, 0x31, 0x00, 0x00, } diff --git a/pkg/kubelet/api/v1alpha1/runtime/api.proto b/pkg/kubelet/api/v1alpha1/runtime/api.proto index 8d8b510b34a..0c6b37e69a8 100644 --- a/pkg/kubelet/api/v1alpha1/runtime/api.proto +++ b/pkg/kubelet/api/v1alpha1/runtime/api.proto @@ -269,17 +269,7 @@ message PodSandboxConfig { // and the CRI). Whenever possible, however, runtime authors SHOULD // consider proposing new typed fields for any new features instead. // - // 1. AppArmor - // - // key: container.apparmor.security.beta.kubernetes.io/ - // description: apparmor profile for a container in this pod. - // value: - // * runtime/default: equivalent to not specifying a profile. - // * localhost/: profile loaded on the node - // (localhost) by name. The possible profile names are detailed at - // http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference - // - // 2. Seccomp + // 1. Seccomp // // key: security.alpha.kubernetes.io/seccomp/pod // description: the seccomp profile for the containers of an entire pod. @@ -296,7 +286,7 @@ message PodSandboxConfig { // local seccomp profile root. Note that profile root is set in // kubelet, and it is not passed in CRI yet, see https://issues.k8s.io/36997. // - // 3. Sysctls + // 2. Sysctls // // key: security.alpha.kubernetes.io/sysctls // description: list of safe sysctls which are set for the sandbox. @@ -526,6 +516,12 @@ message LinuxContainerSecurityContext { // List of groups applied to the first process run in the container, in // addition to the container's primary GID. repeated int64 supplemental_groups = 8; + // AppArmor profile for the container, candidate values are: + // * runtime/default: equivalent to not specifying a profile. + // * localhost/: profile loaded on the node + // (localhost) by name. The possible profile names are detailed at + // http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference + string apparmor_profile = 9; } // LinuxContainerConfig contains platform-specific configuration for diff --git a/pkg/kubelet/dockershim/docker_container.go b/pkg/kubelet/dockershim/docker_container.go index 45c85b5b0f4..0e1b4a67e00 100644 --- a/pkg/kubelet/dockershim/docker_container.go +++ b/pkg/kubelet/dockershim/docker_container.go @@ -145,7 +145,6 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeapi // Apply Linux-specific options if applicable. if lc := config.GetLinux(); lc != nil { - // Apply resource options. // TODO: Check if the units are correct. // TODO: Can we assume the defaults are sane? rOpts := lc.GetResources() @@ -162,7 +161,9 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeapi // Note: ShmSize is handled in kube_docker_client.go // Apply security context. - applyContainerSecurityContext(lc, podSandboxID, createConfig.Config, hc, securityOptSep) + if err = applyContainerSecurityContext(lc, podSandboxID, createConfig.Config, hc, securityOptSep); err != nil { + return "", fmt.Errorf("failed to apply container security context for container %q: %v", config.Metadata.Name, err) + } modifyPIDNamespaceOverrides(ds.disableSharedPID, apiVersion, hc) } @@ -187,12 +188,12 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeapi } hc.Resources.Devices = devices - // Apply appArmor and seccomp options. - securityOpts, err := getContainerSecurityOpts(config.Metadata.Name, sandboxConfig, ds.seccompProfileRoot, securityOptSep) + // Apply seccomp options. + seccompSecurityOpts, err := getSeccompSecurityOpts(config.Metadata.Name, sandboxConfig, ds.seccompProfileRoot, securityOptSep) if err != nil { - return "", fmt.Errorf("failed to generate container security options for container %q: %v", config.Metadata.Name, err) + return "", fmt.Errorf("failed to generate seccomp security options for container %q: %v", config.Metadata.Name, err) } - hc.SecurityOpt = append(hc.SecurityOpt, securityOpts...) + hc.SecurityOpt = append(hc.SecurityOpt, seccompSecurityOpts...) createConfig.HostConfig = hc createResp, err := ds.client.CreateContainer(createConfig) diff --git a/pkg/kubelet/dockershim/docker_sandbox.go b/pkg/kubelet/dockershim/docker_sandbox.go index f29a4acc98f..cd2e6e06a44 100644 --- a/pkg/kubelet/dockershim/docker_sandbox.go +++ b/pkg/kubelet/dockershim/docker_sandbox.go @@ -475,7 +475,9 @@ func (ds *dockerService) applySandboxLinuxOptions(hc *dockercontainer.HostConfig } hc.CgroupParent = cgroupParent // Apply security context. - applySandboxSecurityContext(lc, createConfig.Config, hc, ds.network, separator) + if err = applySandboxSecurityContext(lc, createConfig.Config, hc, ds.network, separator); err != nil { + return err + } return nil } @@ -541,7 +543,7 @@ func (ds *dockerService) makeSandboxDockerConfig(c *runtimeapi.PodSandboxConfig, } // Set security options. - securityOpts, err := getSandboxSecurityOpts(c, ds.seccompProfileRoot, securityOptSep) + securityOpts, err := getSeccompSecurityOpts(sandboxContainerName, c, ds.seccompProfileRoot, securityOptSep) if err != nil { return nil, fmt.Errorf("failed to generate sandbox security options for sandbox %q: %v", c.Metadata.Name, err) } diff --git a/pkg/kubelet/dockershim/helpers.go b/pkg/kubelet/dockershim/helpers.go index e76e76d8b24..def9df08c2c 100644 --- a/pkg/kubelet/dockershim/helpers.go +++ b/pkg/kubelet/dockershim/helpers.go @@ -181,26 +181,32 @@ func makePortsAndBindings(pm []*runtimeapi.PortMapping) (map[dockernat.Port]stru return exposedPorts, portBindings } -// getContainerSecurityOpt gets container security options from container and sandbox config, currently from sandbox -// annotations. +// getSeccompSecurityOpts gets container seccomp options from container and sandbox +// config, currently from sandbox annotations. // It is an experimental feature and may be promoted to official runtime api in the future. -func getContainerSecurityOpts(containerName string, sandboxConfig *runtimeapi.PodSandboxConfig, seccompProfileRoot string, separator rune) ([]string, error) { - appArmorOpts, err := dockertools.GetAppArmorOpts(sandboxConfig.GetAnnotations(), containerName) - if err != nil { - return nil, err - } +func getSeccompSecurityOpts(containerName string, sandboxConfig *runtimeapi.PodSandboxConfig, seccompProfileRoot string, separator rune) ([]string, error) { seccompOpts, err := dockertools.GetSeccompOpts(sandboxConfig.GetAnnotations(), containerName, seccompProfileRoot) if err != nil { return nil, err } - securityOpts := append(appArmorOpts, seccompOpts...) - fmtOpts := dockertools.FmtDockerOpts(securityOpts, separator) + + fmtOpts := dockertools.FmtDockerOpts(seccompOpts, separator) return fmtOpts, nil } -func getSandboxSecurityOpts(sandboxConfig *runtimeapi.PodSandboxConfig, seccompProfileRoot string, separator rune) ([]string, error) { - // sandboxContainerName doesn't exist in the pod, so pod security options will be returned by default. - return getContainerSecurityOpts(sandboxContainerName, sandboxConfig, seccompProfileRoot, separator) +// getApparmorSecurityOpts gets apparmor options from container config. +func getApparmorSecurityOpts(sc *runtimeapi.LinuxContainerSecurityContext, separator rune) ([]string, error) { + if sc == nil || sc.ApparmorProfile == "" { + return nil, nil + } + + appArmorOpts, err := dockertools.GetAppArmorOpts(sc.ApparmorProfile) + if err != nil { + return nil, err + } + + fmtOpts := dockertools.FmtDockerOpts(appArmorOpts, separator) + return fmtOpts, nil } func getNetworkNamespace(c *dockertypes.ContainerJSON) string { diff --git a/pkg/kubelet/dockershim/helpers_test.go b/pkg/kubelet/dockershim/helpers_test.go index 74e23857806..70329559962 100644 --- a/pkg/kubelet/dockershim/helpers_test.go +++ b/pkg/kubelet/dockershim/helpers_test.go @@ -43,10 +43,10 @@ func TestLabelsAndAnnotationsRoundTrip(t *testing.T) { assert.Equal(t, expectedAnnotations, actualAnnotations) } -// TestGetContainerSecurityOpts tests the logic of generating container security options from sandbox annotations. +// TestGetSeccompSecurityOpts tests the logic of generating container seccomp options from sandbox annotations. // The actual profile loading logic is tested in dockertools. // TODO: Migrate the corresponding test to dockershim. -func TestGetContainerSecurityOpts(t *testing.T) { +func TestGetSeccompSecurityOpts(t *testing.T) { containerName := "bar" makeConfig := func(annotations map[string]string) *runtimeapi.PodSandboxConfig { return makeSandboxConfigWithLabelsAndAnnotations("pod", "ns", "1234", 1, nil, annotations) @@ -78,29 +78,10 @@ func TestGetContainerSecurityOpts(t *testing.T) { v1.SeccompPodAnnotationKey: "docker/default", }), expectedOpts: nil, - }, { - msg: "AppArmor runtime/default", - config: makeConfig(map[string]string{ - apparmor.ContainerAnnotationKeyPrefix + containerName: apparmor.ProfileRuntimeDefault, - }), - expectedOpts: []string{"seccomp=unconfined"}, - }, { - msg: "AppArmor local profile", - config: makeConfig(map[string]string{ - apparmor.ContainerAnnotationKeyPrefix + containerName: apparmor.ProfileNamePrefix + "foo", - }), - expectedOpts: []string{"seccomp=unconfined", "apparmor=foo"}, - }, { - msg: "AppArmor and seccomp profile", - config: makeConfig(map[string]string{ - v1.SeccompContainerAnnotationKeyPrefix + containerName: "docker/default", - apparmor.ContainerAnnotationKeyPrefix + containerName: apparmor.ProfileNamePrefix + "foo", - }), - expectedOpts: []string{"apparmor=foo"}, }} for i, test := range tests { - opts, err := getContainerSecurityOpts(containerName, test.config, "test/seccomp/profile/root", '=') + opts, err := getSeccompSecurityOpts(containerName, test.config, "test/seccomp/profile/root", '=') assert.NoError(t, err, "TestCase[%d]: %s", i, test.msg) assert.Len(t, opts, len(test.expectedOpts), "TestCase[%d]: %s", i, test.msg) for _, opt := range test.expectedOpts { @@ -109,43 +90,36 @@ func TestGetContainerSecurityOpts(t *testing.T) { } } -// TestGetSandboxSecurityOpts tests the logic of generating sandbox security options from sandbox annotations. -func TestGetSandboxSecurityOpts(t *testing.T) { - makeConfig := func(annotations map[string]string) *runtimeapi.PodSandboxConfig { - return makeSandboxConfigWithLabelsAndAnnotations("pod", "ns", "1234", 1, nil, annotations) +// TestGetApparmorSecurityOpts tests the logic of generating container apparmor options from sandbox annotations. +// The actual profile loading logic is tested in dockertools. +// TODO: Migrate the corresponding test to dockershim. +func TestGetApparmorSecurityOpts(t *testing.T) { + makeConfig := func(profile string) *runtimeapi.LinuxContainerSecurityContext { + return &runtimeapi.LinuxContainerSecurityContext{ + ApparmorProfile: profile, + } } tests := []struct { msg string - config *runtimeapi.PodSandboxConfig + config *runtimeapi.LinuxContainerSecurityContext expectedOpts []string }{{ - msg: "No security annotations", - config: makeConfig(nil), - expectedOpts: []string{"seccomp=unconfined"}, - }, { - msg: "Seccomp default", - config: makeConfig(map[string]string{ - v1.SeccompPodAnnotationKey: "docker/default", - }), + msg: "No AppArmor options", + config: makeConfig(""), expectedOpts: nil, }, { - msg: "Seccomp unconfined", - config: makeConfig(map[string]string{ - v1.SeccompPodAnnotationKey: "unconfined", - }), - expectedOpts: []string{"seccomp=unconfined"}, + msg: "AppArmor runtime/default", + config: makeConfig("runtime/default"), + expectedOpts: []string{}, }, { - msg: "Seccomp pod and container profile", - config: makeConfig(map[string]string{ - v1.SeccompContainerAnnotationKeyPrefix + "test-container": "unconfined", - v1.SeccompPodAnnotationKey: "docker/default", - }), - expectedOpts: nil, + msg: "AppArmor local profile", + config: makeConfig(apparmor.ProfileNamePrefix + "foo"), + expectedOpts: []string{"apparmor=foo"}, }} for i, test := range tests { - opts, err := getSandboxSecurityOpts(test.config, "test/seccomp/profile/root", '=') + opts, err := getApparmorSecurityOpts(test.config, '=') assert.NoError(t, err, "TestCase[%d]: %s", i, test.msg) assert.Len(t, opts, len(test.expectedOpts), "TestCase[%d]: %s", i, test.msg) for _, opt := range test.expectedOpts { diff --git a/pkg/kubelet/dockershim/security_context.go b/pkg/kubelet/dockershim/security_context.go index 55b7030e4a5..f683110270c 100644 --- a/pkg/kubelet/dockershim/security_context.go +++ b/pkg/kubelet/dockershim/security_context.go @@ -31,9 +31,9 @@ import ( ) // applySandboxSecurityContext updates docker sandbox options according to security context. -func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *dockercontainer.Config, hc *dockercontainer.HostConfig, network *knetwork.PluginManager, separator rune) { +func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *dockercontainer.Config, hc *dockercontainer.HostConfig, network *knetwork.PluginManager, separator rune) error { if lc == nil { - return + return nil } var sc *runtimeapi.LinuxContainerSecurityContext @@ -48,20 +48,25 @@ func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *d } modifyContainerConfig(sc, config) - modifyHostConfig(sc, hc, separator) + if err := modifyHostConfig(sc, hc, separator); err != nil { + return err + } modifySandboxNamespaceOptions(sc.GetNamespaceOptions(), hc, network) + return nil } // applyContainerSecurityContext updates docker container options according to security context. -func applyContainerSecurityContext(lc *runtimeapi.LinuxContainerConfig, sandboxID string, config *dockercontainer.Config, hc *dockercontainer.HostConfig, separator rune) { +func applyContainerSecurityContext(lc *runtimeapi.LinuxContainerConfig, sandboxID string, config *dockercontainer.Config, hc *dockercontainer.HostConfig, separator rune) error { if lc == nil { - return + return nil } modifyContainerConfig(lc.SecurityContext, config) - modifyHostConfig(lc.SecurityContext, hc, separator) + if err := modifyHostConfig(lc.SecurityContext, hc, separator); err != nil { + return err + } modifyContainerNamespaceOptions(lc.SecurityContext.GetNamespaceOptions(), sandboxID, hc) - return + return nil } // modifyContainerConfig applies container security context config to dockercontainer.Config. @@ -78,9 +83,9 @@ func modifyContainerConfig(sc *runtimeapi.LinuxContainerSecurityContext, config } // modifyHostConfig applies security context config to dockercontainer.HostConfig. -func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig *dockercontainer.HostConfig, separator rune) { +func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig *dockercontainer.HostConfig, separator rune) error { if sc == nil { - return + return nil } // Apply supplemental groups. @@ -107,6 +112,15 @@ func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig * separator, ) } + + // Apply apparmor options. + apparmorSecurityOpts, err := getApparmorSecurityOpts(sc, separator) + if err != nil { + return fmt.Errorf("failed to generate apparmor security options: %v", err) + } + hostConfig.SecurityOpt = append(hostConfig.SecurityOpt, apparmorSecurityOpts...) + + return nil } // modifySandboxNamespaceOptions apply namespace options for sandbox diff --git a/pkg/kubelet/dockertools/docker_manager.go b/pkg/kubelet/dockertools/docker_manager.go index ca0774a102e..30e30477585 100644 --- a/pkg/kubelet/dockertools/docker_manager.go +++ b/pkg/kubelet/dockertools/docker_manager.go @@ -1260,13 +1260,13 @@ func GetSeccompOpts(annotations map[string]string, ctrName, profileRoot string) // Get the docker security options for AppArmor. func (dm *DockerManager) getAppArmorOpts(pod *v1.Pod, ctrName string) ([]dockerOpt, error) { - return GetAppArmorOpts(pod.Annotations, ctrName) + profile := apparmor.GetProfileNameFromPodAnnotations(pod.Annotations, ctrName) + return GetAppArmorOpts(profile) } // Temporarily export this function to share with dockershim. // TODO: clean this up. -func GetAppArmorOpts(annotations map[string]string, ctrName string) ([]dockerOpt, error) { - profile := apparmor.GetProfileNameFromPodAnnotations(annotations, ctrName) +func GetAppArmorOpts(profile string) ([]dockerOpt, error) { if profile == "" || profile == apparmor.ProfileRuntimeDefault { // The docker applies the default profile by default. return nil, nil diff --git a/pkg/kubelet/kuberuntime/BUILD b/pkg/kubelet/kuberuntime/BUILD index 1e0ebc03ae0..fc15828dbb2 100644 --- a/pkg/kubelet/kuberuntime/BUILD +++ b/pkg/kubelet/kuberuntime/BUILD @@ -45,6 +45,7 @@ go_library( "//pkg/kubelet/types:go_default_library", "//pkg/kubelet/util/cache:go_default_library", "//pkg/kubelet/util/format:go_default_library", + "//pkg/security/apparmor:go_default_library", "//pkg/securitycontext:go_default_library", "//pkg/util/parsers:go_default_library", "//pkg/util/selinux:go_default_library", diff --git a/pkg/kubelet/kuberuntime/security_context.go b/pkg/kubelet/kuberuntime/security_context.go index 0cc784fc3aa..2254a42151c 100644 --- a/pkg/kubelet/kuberuntime/security_context.go +++ b/pkg/kubelet/kuberuntime/security_context.go @@ -21,6 +21,7 @@ import ( "k8s.io/kubernetes/pkg/api/v1" runtimeapi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime" + "k8s.io/kubernetes/pkg/security/apparmor" "k8s.io/kubernetes/pkg/securitycontext" ) @@ -32,6 +33,9 @@ func (m *kubeGenericRuntimeManager) determineEffectiveSecurityContext(pod *v1.Po synthesized = &runtimeapi.LinuxContainerSecurityContext{} } + // set ApparmorProfile. + synthesized.ApparmorProfile = apparmor.GetProfileNameFromPodAnnotations(pod.Annotations, container.Name) + // set RunAsUser. if synthesized.RunAsUser == nil { if uid != nil {