Repository: akuity/kargo

Issue:
Warehouse exclusion filter by git author
# Proposed Feature

Similar to how we can exclude paths, we should additionally have a include/exclude filter where Freight may or may not be generated, based on attributes of the git commit, such as git author.

To make this flexible, perhaps we can use expr in some way so that the filter can be more generic.

# Motivation

This would provide another way to have Kargo avoid acting on automated commits from systems, including Kargo itself.

I'm working on a kustomize based rendered branch pattern, and found that I could not exclude the `kustomization.yaml` file from my git Warehouse, because that file might be edited by humans or by machines. And I want to exclude commits made by machines (i.e. kargo).

Discussion:

Solution patch:
diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go
index 72bdfb43..21f959f4 100644
--- a/api/v1alpha1/generated.pb.go
+++ b/api/v1alpha1/generated.pb.go
@@ -2251,296 +2251,297 @@ func init() {
 }
 
 var fileDescriptor_e26b7f7bbc391025 = []byte{
-	// 4614 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0x4b, 0x6c, 0x1c, 0x47,
-	0x7a, 0x56, 0xcf, 0xf0, 0xf9, 0x0f, 0x9f, 0x25, 0xd2, 0xe6, 0x72, 0x63, 0x51, 0xe9, 0x75, 0x0c,
-	0x3b, 0xb6, 0x87, 0x91, 0x6c, 0xd9, 0x7a, 0x78, 0x15, 0x70, 0x86, 0x7a, 0xd0, 0xcb, 0xb5, 0x98,
-	0x1a, 0x4a, 0x5a, 0xcb, 0x36, 0x94, 0xe2, 0x4c, 0x71, 0xa6, 0x97, 0x33, 0xdd, 0xe3, 0xaa, 0x1e,
-	0x5a, 0xcc, 0x06, 0x89, 0xf3, 0xc4, 0x02, 0x09, 0x02, 0x1f, 0x36, 0xf0, 0x22, 0x48, 0x90, 0x20,
-	0x7b, 0x0a, 0x16, 0x48, 0x8e, 0x39, 0xe4, 0xe0, 0x43, 0x2e, 0xde, 0x64, 0x37, 0x30, 0x9c, 0x43,
-	0x1c, 0x60, 0x41, 0xc4, 0x5c, 0x20, 0x40, 0x6e, 0xb9, 0xe4, 0x22, 0x20, 0x40, 0x50, 0x8f, 0xee,
-	0xae, 0xee, 0xe9, 0x11, 0xa7, 0x87, 0xa4, 0xa2, 0xe4, 0x36, 0x53, 0x7f, 0xd5, 0xf7, 0x57, 0xfd,
-	0x55, 0xf5, 0xd7, 0xff, 0xa8, 0x6a, 0x78, 0xb5, 0xee, 0xf8, 0x8d, 0xce, 0x56, 0xb1, 0xea, 0xb5,
-	0x96, 0xc9, 0x4e, 0xc7, 0xf1, 0xf7, 0x96, 0x77, 0x08, 0xab, 0x7b, 0xcb, 0xa4, 0xed, 0x2c, 0xef,
-	0x9e, 0x23, 0xcd, 0x76, 0x83, 0x9c, 0x5b, 0xae, 0x53, 0x97, 0x32, 0xe2, 0xd3, 0x5a, 0xb1, 0xcd,
-	0x3c, 0xdf, 0x43, 0xcf, 0x46, 0xad, 0x8a, 0xaa, 0x55, 0x51, 0xb6, 0x2a, 0x92, 0xb6, 0x53, 0x0c,
-	0x5a, 0x2d, 0xbe, 0x6c, 0x60, 0xd7, 0xbd, 0xba, 0xb7, 0x2c, 0x1b, 0x6f, 0x75, 0xb6, 0xe5, 0x3f,
-	0xf9, 0x47, 0xfe, 0x52, 0xa0, 0x8b, 0xf6, 0xce, 0x45, 0x5e, 0x74, 0x14, 0xe7, 0xaa, 0xc7, 0xe8,
-	0xf2, 0x6e, 0x17, 0xe3, 0xc5, 0x9b, 0x51, 0x1d, 0xfa, 0xc0, 0xa7, 0x2e, 0x77, 0x3c, 0x97, 0xbf,
-	0x4c, 0xda, 0x0e, 0xa7, 0x6c, 0x97, 0xb2, 0xe5, 0xf6, 0x4e, 0x5d, 0xd0, 0x78, 0xbc, 0x42, 0x1a,
-	0xd2, 0xab, 0x11, 0x52, 0x8b, 0x54, 0x1b, 0x8e, 0x4b, 0xd9, 0x5e, 0xd4, 0xbc, 0x45, 0x7d, 0x92,
-	0xd6, 0x6a, 0xb9, 0x57, 0x2b, 0xd6, 0x71, 0x7d, 0xa7, 0x45, 0xbb, 0x1a, 0xbc, 0x76, 0x58, 0x03,
-	0x5e, 0x6d, 0xd0, 0x16, 0x49, 0xb6, 0xb3, 0xdf, 0x85, 0xd3, 0x2b, 0x2e, 0x69, 0xee, 0x71, 0x87,
-	0xe3, 0x8e, 0xbb, 0xc2, 0xea, 0x9d, 0x16, 0x75, 0x7d, 0x74, 0x16, 0x86, 0x5c, 0xd2, 0xa2, 0x0b,
-	0xd6, 0x59, 0xeb, 0xf9, 0xf1, 0xd2, 0xc4, 0xa7, 0xfb, 0x4b, 0xa7, 0x0e, 0xf6, 0x97, 0x86, 0xde,
-	0x22, 0x2d, 0x8a, 0x25, 0x05, 0x7d, 0x0d, 0x86, 0x77, 0x49, 0xb3, 0x43, 0x17, 0x72, 0xb2, 0xca,
-	0xa4, 0xae, 0x32, 0x7c, 0x47, 0x14, 0x62, 0x45, 0xb3, 0x7f, 0x27, 0x1f, 0x83, 0xff, 0x26, 0xf5,
-	0x49, 0x8d, 0xf8, 0x04, 0xb5, 0x60, 0xa4, 0x49, 0xb6, 0x68, 0x93, 0x2f, 0x58, 0x67, 0xf3, 0xcf,
-	0x17, 0xce, 0x5f, 0x2b, 0xf6, 0x33, 0xd1, 0xc5, 0x14, 0xa8, 0xe2, 0xba, 0xc4, 0xb9, 0xe6, 0xfa,
-	0x6c, 0xaf, 0x34, 0xa5, 0x3b, 0x31, 0xa2, 0x0a, 0xb1, 0x66, 0x82, 0x7e, 0xcb, 0x82, 0x02, 0x71,
-	0x5d, 0xcf, 0x27, 0xbe, 0x98, 0xa6, 0x85, 0x9c, 0x64, 0xfa, 0xe6, 0xe0, 0x4c, 0x57, 0x22, 0x30,
-	0xc5, 0xf9, 0xb4, 0xe6, 0x5c, 0x30, 0x28, 0xd8, 0xe4, 0xb9, 0x78, 0x09, 0x0a, 0x46, 0x57, 0xd1,
-	0x0c, 0xe4, 0x77, 0xe8, 0x9e, 0x92, 0x2f, 0x16, 0x3f, 0xd1, 0x5c, 0x4c, 0xa0, 0x5a, 0x82, 0x97,
-	0x73, 0x17, 0xad, 0xc5, 0xab, 0x30, 0x93, 0x64, 0x98, 0xa5, 0xbd, 0xfd, 0x47, 0x16, 0xcc, 0x19,
-	0xa3, 0xc0, 0x74, 0x9b, 0x32, 0xea, 0x56, 0x29, 0x5a, 0x86, 0x71, 0x31, 0x97, 0xbc, 0x4d, 0xaa,
-	0xc1, 0x54, 0xcf, 0xea, 0x81, 0x8c, 0xbf, 0x15, 0x10, 0x70, 0x54, 0x27, 0x5c, 0x16, 0xb9, 0x47,
-	0x2d, 0x8b, 0x76, 0x83, 0x70, 0xba, 0x90, 0x8f, 0x2f, 0x8b, 0x0d, 0x51, 0x88, 0x15, 0xcd, 0xbe,
-	0x0f, 0x5f, 0x09, 0xfa, 0xb3, 0x49, 0x5b, 0xed, 0x26, 0xf1, 0x69, 0xd4, 0xa9, 0xc3, 0x97, 0xde,
-	0x59, 0x18, 0xda, 0x71, 0xdc, 0x5a, 0xb2, 0x17, 0xdf, 0x70, 0xdc, 0x1a, 0x96, 0x14, 0x7b, 0x07,
-	0x26, 0x57, 0xda, 0x6d, 0xe6, 0xed, 0xd2, 0x5a, 0xc5, 0x27, 0x75, 0x8a, 0xee, 0x01, 0x10, 0x5d,
-	0xb0, 0xe2, 0x4b, 0xe8, 0xc2, 0xf9, 0x5f, 0x2c, 0xaa, 0x3d, 0x53, 0x34, 0xf7, 0x4c, 0xb1, 0xbd,
-	0x53, 0x17, 0x05, 0xbc, 0x28, 0xb6, 0x66, 0x71, 0xf7, 0x5c, 0x71, 0xd3, 0x69, 0xd1, 0xd2, 0xd4,
-	0xc1, 0xfe, 0x12, 0xac, 0x84, 0x08, 0xd8, 0x40, 0xb3, 0x7f, 0xdb, 0x82, 0xf9, 0x15, 0x56, 0xf7,
-	0xca, 0xab, 0x2b, 0xed, 0xf6, 0x4d, 0x4a, 0x9a, 0x7e, 0xa3, 0xe2, 0x13, 0xbf, 0xc3, 0xd1, 0x55,
-	0x18, 0xe1, 0xf2, 0x97, 0x1e, 0xcc, 0x73, 0xc1, 0xfa, 0x54, 0xf4, 0x87, 0xfb, 0x4b, 0x73, 0x29,
-	0x0d, 0x29, 0xd6, 0xad, 0xd0, 0x0b, 0x30, 0xda, 0xa2, 0x9c, 0x93, 0x7a, 0x20, 0xf1, 0x69, 0x0d,
-	0x30, 0xfa, 0x4d, 0x55, 0x8c, 0x03, 0xba, 0xfd, 0x0f, 0x39, 0x98, 0x0e, 0xb1, 0x34, 0xfb, 0x13,
-	0x98, 0xde, 0x0e, 0x4c, 0x34, 0x8c, 0x11, 0xca, 0x59, 0x2e, 0x9c, 0xbf, 0xd2, 0xe7, 0x4e, 0x4a,
-	0x13, 0x52, 0x69, 0x4e, 0xb3, 0x99, 0x30, 0x4b, 0x71, 0x8c, 0x0d, 0x6a, 0x01, 0xf0, 0x3d, 0xb7,
-	0xaa, 0x99, 0x0e, 0x49, 0xa6, 0x97, 0x32, 0x32, 0xad, 0x84, 0x00, 0x25, 0xa4, 0x59, 0x42, 0x54,
-	0x86, 0x0d, 0x06, 0xf6, 0x5f, 0x5b, 0x70, 0x3a, 0xa5, 0x1d, 0x7a, 0x23, 0x31, 0x9f, 0xcf, 0x76,
-	0xcd, 0x27, 0xea, 0x6a, 0x16, 0xcd, 0xe6, 0x4b, 0x30, 0xc6, 0xe8, 0xae, 0x23, 0x4e, 0x0a, 0x2d,
-	0xe1, 0x19, 0xdd, 0x7e, 0x0c, 0xeb, 0x72, 0x1c, 0xd6, 0x40, 0x2f, 0xc2, 0x78, 0xf0, 0x5b, 0x88,
-	0x39, 0x2f, 0x36, 0x93, 0x98, 0xb8, 0xa0, 0x2a, 0xc7, 0x11, 0xdd, 0xfe, 0x4d, 0x18, 0x2e, 0x37,
-	0x08, 0xf3, 0xc5, 0x8a, 0x61, 0xb4, 0xed, 0xdd, 0xc6, 0xeb, 0xba, 0x8b, 0xe1, 0x8a, 0xc1, 0xaa,
-	0x18, 0x07, 0xf4, 0x3e, 0x26, 0xfb, 0x05, 0x18, 0xdd, 0xa5, 0x4c, 0xf6, 0x37, 0x1f, 0x07, 0xbb,
-	0xa3, 0x8a, 0x71, 0x40, 0xb7, 0xff, 0xd9, 0x82, 0x39, 0xd9, 0x83, 0x55, 0x87, 0x57, 0xbd, 0x5d,
-	0xca, 0xf6, 0x30, 0xe5, 0x9d, 0xe6, 0x31, 0x77, 0x68, 0x15, 0x66, 0x38, 0x6d, 0xed, 0x52, 0x56,
-	0xf6, 0x5c, 0xee, 0x33, 0xe2, 0xb8, 0xbe, 0xee, 0xd9, 0x82, 0xae, 0x3d, 0x53, 0x49, 0xd0, 0x71,
-	0x57, 0x0b, 0xf4, 0x3c, 0x8c, 0xe9, 0x6e, 0x8b, 0xa5, 0x24, 0x04, 0x3b, 0x21, 0xe6, 0x40, 0x8f,
-	0x89, 0xe3, 0x90, 0x6a, 0xff, 0xbb, 0x05, 0xb3, 0x72, 0x54, 0x95, 0xce, 0x16, 0xaf, 0x32, 0xa7,
-	0x2d, 0x14, 0xf0, 0x93, 0x38, 0xa4, 0xab, 0x30, 0x55, 0x0b, 0x04, 0xbf, 0xee, 0xb4, 0x1c, 0x5f,
-	0xee, 0x91, 0xe1, 0xd2, 0x53, 0x1a, 0x63, 0x6a, 0x35, 0x46, 0xc5, 0x89, 0xda, 0x6a, 0xfa, 0x9a,
-	0x1d, 0xee, 0x53, 0xb6, 0xc1, 0xbc, 0x96, 0x27, 0xc6, 0xb9, 0x49, 0xf8, 0x0e, 0xfa, 0x55, 0x18,
-	0x6b, 0xe9, 0x43, 0x4f, 0x6b, 0xcd, 0x5f, 0xea, 0x4f, 0x6b, 0xde, 0xda, 0xfa, 0x36, 0xad, 0xfa,
-	0xe2, 0xc0, 0x8c, 0x76, 0x5b, 0x54, 0x86, 0x43, 0x54, 0xf4, 0x36, 0x0c, 0xf1, 0x36, 0xad, 0x4a,
-	0x11, 0x15, 0xce, 0xbf, 0xde, 0xdf, 0xa6, 0x8e, 0x75, 0xb2, 0xd2, 0xa6, 0xd5, 0x48, 0xb6, 0xe2,
-	0x1f, 0x96, 0x90, 0xf6, 0xbf, 0x5a, 0xb0, 0x90, 0x36, 0xaa, 0x75, 0x87, 0xfb, 0xe8, 0xdd, 0xae,
-	0x91, 0x15, 0xfb, 0x1b, 0x99, 0x68, 0x2d, 0xc7, 0x15, 0xee, 0xde, 0xa0, 0xc4, 0x18, 0xd5, 0x7d,
-	0x18, 0x76, 0x7c, 0xda, 0x0a, 0x4c, 0x8d, 0xcb, 0xfd, 0x0d, 0x2b, 0xad, 0xb3, 0xd1, 0x11, 0xba,
-	0x26, 0x00, 0xb1, 0xc2, 0xb5, 0xdf, 0x81, 0x89, 0x72, 0x87, 0x31, 0xea, 0xfa, 0xea, 0x80, 0xfb,
-	0x06, 0x0c, 0x73, 0xc7, 0xd5, 0x7a, 0x3e, 0xdb, 0xd9, 0x36, 0x2e, 0xc0, 0x2b, 0xa2, 0x31, 0x56,
-	0x18, 0xf6, 0x9f, 0xe6, 0xe1, 0x74, 0xb0, 0x62, 0x68, 0x6d, 0x85, 0xf9, 0xce, 0x36, 0xa9, 0xfa,
-	0x1c, 0xd5, 0x60, 0xa2, 0x16, 0x15, 0xfb, 0x5a, 0x11, 0x67, 0xe1, 0x15, 0x2a, 0x7b, 0x03, 0xde,
-	0xc7, 0x31, 0x54, 0x74, 0x17, 0xf2, 0x75, 0xc7, 0xd7, 0x96, 0xe1, 0xc5, 0xfe, 0x24, 0x77, 0xc3,
-	0x49, 0x6a, 0x9e, 0x52, 0x41, 0xb3, 0xca, 0xdf, 0x70, 0x7c, 0x2c, 0x10, 0xd1, 0x16, 0x8c, 0x38,
-	0x2d, 0x52, 0xa7, 0x19, 0x67, 0x65, 0x4d, 0xb4, 0x49, 0xa2, 0x87, 0xa6, 0xa6, 0xa4, 0x72, 0xac,
-	0x91, 0x05, 0x8f, 0xaa, 0xd0, 0x18, 0x4a, 0x67, 0xf7, 0x3f, 0xf3, 0x29, 0xba, 0x33, 0xe2, 0x21,
-	0xa9, 0x1c, 0x6b, 0x64, 0xfb, 0x8b, 0x1c, 0xcc, 0x44, 0xf2, 0x2b, 0x7b, 0xad, 0x96, 0xe3, 0xa3,
-	0x45, 0xc8, 0x39, 0x35, 0xad, 0x90, 0x40, 0x37, 0xcc, 0xad, 0xad, 0xe2, 0x9c, 0x53, 0x43, 0xcf,
-	0xc1, 0xc8, 0x16, 0x23, 0x6e, 0xb5, 0xa1, 0x15, 0x51, 0x08, 0x5c, 0x92, 0xa5, 0x58, 0x53, 0xd1,
-	0x33, 0x90, 0xf7, 0x49, 0x5d, 0xeb, 0x9f, 0x50, 0x7e, 0x9b, 0xa4, 0x8e, 0x45, 0xb9, 0x50, 0x7c,
-	0xbc, 0x23, 0xf7, 0xb0, 0x9c, 0x79, 0x43, 0xf1, 0x55, 0x54, 0x31, 0x0e, 0xe8, 0x82, 0x23, 0xe9,
-	0xf8, 0x0d, 0x8f, 0x2d, 0x0c, 0xc7, 0x39, 0xae, 0xc8, 0x52, 0xac, 0xa9, 0xc2, 0x44, 0xa9, 0xca,
-	0xfe, 0xfb, 0x94, 0x2d, 0x8c, 0xc4, 0x4d, 0x94, 0x72, 0x40, 0xc0, 0x51, 0x1d, 0xf4, 0x1e, 0x14,
-	0xaa, 0x8c, 0x12, 0xdf, 0x63, 0xab, 0xc4, 0xa7, 0x0b, 0xa3, 0x99, 0x57, 0xe0, 0xb4, 0xb0, 0xd2,
-	0xcb, 0x11, 0x04, 0x36, 0xf1, 0xec, 0xbf, 0xcd, 0xc3, 0x42, 0x24, 0x5a, 0x39, 0xb7, 0x91, 0x65,
-	0xaa, 0xc5, 0x63, 0xf5, 0x10, 0xcf, 0x73, 0x30, 0x52, 0x73, 0xea, 0x94, 0xfb, 0x49, 0x29, 0xaf,
-	0xca, 0x52, 0xac, 0xa9, 0xe8, 0xf7, 0x13, 0xde, 0xc8, 0xb0, 0x5c, 0x28, 0xb7, 0xfa, 0x5b, 0x28,
-	0xbd, 0x3a, 0x37, 0x80, 0x4b, 0x82, 0xce, 0x03, 0xd4, 0x1d, 0x5f, 0x1f, 0x5a, 0x7a, 0xd6, 0x43,
-	0x65, 0x7d, 0x23, 0xa4, 0x60, 0xa3, 0x16, 0xba, 0x0b, 0xe3, 0x52, 0x5e, 0x03, 0xee, 0x7f, 0x69,
-	0xc2, 0x94, 0x03, 0x00, 0x1c, 0x61, 0x1d, 0xd9, 0xc9, 0x79, 0x07, 0xd0, 0xb5, 0x07, 0x6d, 0x46,
-	0xb9, 0x38, 0xba, 0xef, 0x10, 0xe6, 0x90, 0xad, 0x26, 0x3d, 0x2e, 0x3f, 0xf6, 0xb3, 0x21, 0x18,
-	0xbd, 0xce, 0xa8, 0x53, 0x6f, 0xf8, 0x8f, 0xe1, 0x48, 0xfc, 0x1a, 0x0c, 0x93, 0xa6, 0x43, 0xb8,
-	0x5c, 0xdd, 0x46, 0x97, 0x56, 0x44, 0x21, 0x56, 0x34, 0xf4, 0x0e, 0x8c, 0x78, 0xcc, 0xa9, 0x3b,
-	0xee, 0xc2, 0xb8, 0xec, 0xc4, 0x2b, 0xfd, 0xad, 0x1f, 0x3d, 0x8a, 0x5b, 0xb2, 0x69, 0xb4, 0x44,
-	0xd5, 0x7f, 0xac, 0x21, 0xd1, 0x3d, 0x18, 0x55, 0x5b, 0x2e, 0x50, 0x63, 0xcb, 0x7d, 0xab, 0x61,
-	0xb5, 0x6b, 0x23, 0xd5, 0xa0, 0xfe, 0x73, 0x1c, 0x00, 0xa2, 0x4a, 0xa8, 0x85, 0x87, 0x24, 0xf4,
-	0x8b, 0x19, 0xb4, 0x70, 0x4f, 0xb5, 0x5b, 0x09, 0xd5, 0xee, 0x70, 0x16, 0x50, 0xa9, 0x58, 0x7b,
-	0xe9, 0x59, 0x21, 0x62, 0x6d, 0xee, 0x8f, 0x0c, 0x20, 0x62, 0xed, 0x6b, 0x4c, 0xc5, 0x7d, 0x84,
-	0xc0, 0x1b, 0xb0, 0xbf, 0x97, 0x87, 0x59, 0x5d, 0xb3, 0xec, 0x35, 0x9b, 0xb4, 0x2a, 0x6d, 0x4b,
-	0xa5, 0xc5, 0xf3, 0xa9, 0x5a, 0xdc, 0x09, 0x6c, 0x0a, 0x75, 0x32, 0x96, 0x32, 0xf5, 0x26, 0xe2,
-	0x51, 0x94, 0x76, 0x84, 0xd2, 0x11, 0xe1, 0x2c, 0xe9, 0x5a, 0xda, 0xba, 0x40, 0xbf, 0x67, 0xc1,
-	0xe9, 0x5d, 0xca, 0x9c, 0x6d, 0xa7, 0x2a, 0xf7, 0xe3, 0x4d, 0x87, 0xfb, 0x1e, 0xdb, 0xd3, 0xe7,
-	0xe6, 0x6b, 0xfd, 0x71, 0xbe, 0x63, 0x00, 0xac, 0xb9, 0xdb, 0x5e, 0xe9, 0xab, 0x9a, 0xdb, 0xe9,
-	0x3b, 0xdd, 0xd0, 0x38, 0x8d, 0xdf, 0x62, 0x1b, 0x20, 0xea, 0x6d, 0x8a, 0x3a, 0x58, 0x37, 0x37,
-	0x6f, 0xdf, 0x1d, 0x0b, 0x06, 0x1b, 0xe8, 0x4e, 0x53, 0x8d, 0x7c, 0x62, 0x41, 0x41, 0xd3, 0x1f,
-	0x83, 0x99, 0x88, 0xe3, 0x66, 0xe2, 0xcb, 0x99, 0xfa, 0xdf, 0xc3, 0x32, 0x64, 0x30, 0x19, 0xdb,
-	0xe4, 0xe8, 0x82, 0x0e, 0x97, 0x28, 0x1d, 0xf8, 0xf3, 0x66, 0xb8, 0xe4, 0xe1, 0xfe, 0xd2, 0x6c,
-	0xac, 0x72, 0x14, 0x43, 0x39, 0xdc, 0x77, 0xb9, 0x3c, 0xf6, 0xfd, 0xbf, 0x58, 0x3a, 0xf5, 0xe1,
-	0x4f, 0xcf, 0x9e, 0xb2, 0x3f, 0xce, 0xc3, 0x4c, 0x52, 0xaa, 0x7d, 0xe8, 0xde, 0x48, 0x87, 0x8d,
-	0x9d, 0xa8, 0x0e, 0xcb, 0x9d, 0x9c, 0x0e, 0xcb, 0x9f, 0x84, 0x0e, 0x1b, 0x3a, 0x36, 0x1d, 0x66,
-	0xff, 0x93, 0x05, 0x53, 0xe1, 0xcc, 0xbc, 0xdf, 0x11, 0xf6, 0x47, 0x24, 0x75, 0xeb, 0xf8, 0xa5,
-	0x7e, 0x1f, 0x46, 0xb9, 0xd7, 0x61, 0x55, 0x69, 0x64, 0x0b, 0xf4, 0x57, 0xb3, 0x29, 0x4d, 0xd5,
-	0xd6, 0xb0, 0x2c, 0x55, 0x01, 0x0e, 0x50, 0xed, 0x4f, 0x72, 0xe1, 0x80, 0x34, 0x4d, 0x19, 0x5e,
-	0x4c, 0x98, 0xa5, 0x62, 0x40, 0x63, 0xa6, 0xe1, 0x25, 0x4a, 0xb1, 0xa6, 0x22, 0x5b, 0xea, 0xf3,
-	0xc0, 0xfe, 0x1f, 0x2f, 0x81, 0x56, 0xcb, 0x72, 0x12, 0x14, 0x05, 0xb5, 0x61, 0x86, 0xd1, 0xf7,
-	0x3b, 0x0e, 0xa3, 0xb5, 0x8a, 0x47, 0x76, 0x84, 0xd1, 0xa2, 0x83, 0x5c, 0x7d, 0xee, 0xfb, 0xd5,
-	0x0e, 0x93, 0x2a, 0xac, 0x34, 0x27, 0x7c, 0x77, 0x9c, 0xc0, 0xc2, 0x5d, 0xe8, 0xc8, 0x83, 0x39,
-	0xb2, 0x4b, 0x9c, 0x26, 0xd9, 0x72, 0x9a, 0x8e, 0xbf, 0x57, 0xf1, 0x19, 0xf1, 0x69, 0x7d, 0x4f,
-	0x9b, 0xd8, 0x57, 0xf4, 0x58, 0xe6, 0x56, 0x52, 0xea, 0x3c, 0xdc, 0x5f, 0xfa, 0xaa, 0x96, 0x45,
-	0x1a, 0x19, 0xa7, 0x02, 0xdb, 0x3f, 0x19, 0x0d, 0x35, 0x84, 0x8e, 0x6b, 0x7d, 0x07, 0x0a, 0x55,
-	0xe5, 0x4c, 0x36, 0xf7, 0xd6, 0x5c, 0xbd, 0xa6, 0x57, 0x07, 0x38, 0xed, 0x8a, 0xe5, 0x08, 0x26,
-	0x61, 0x85, 0x1a, 0x14, 0x6c, 0x72, 0x43, 0x1f, 0x00, 0x28, 0xd5, 0x4f, 0x6b, 0x6b, 0xae, 0x3e,
-	0xdb, 0xca, 0x83, 0xf0, 0xbe, 0x13, 0xa2, 0x28, 0xd6, 0xa1, 0x91, 0x15, 0x11, 0xb0, 0xc1, 0x4a,
-	0x8c, 0x3a, 0x88, 0xe2, 0x5e, 0xf7, 0x98, 0x56, 0x12, 0x03, 0x8d, 0x7a, 0x25, 0x82, 0x49, 0xda,
-	0xde, 0x11, 0x05, 0x9b, 0xdc, 0x90, 0x67, 0x9c, 0x2b, 0x6a, 0xbb, 0xaf, 0x0c, 0xc2, 0x39, 0xc8,
-	0x48, 0x28, 0xb6, 0xe1, 0x51, 0x13, 0x14, 0x47, 0x47, 0xcd, 0x22, 0x83, 0x99, 0xe4, 0xe4, 0xa4,
-	0x1c, 0xa8, 0x37, 0xe3, 0x07, 0xea, 0xf9, 0x3e, 0x55, 0x90, 0x11, 0x89, 0x30, 0x13, 0x17, 0x0c,
-	0xa6, 0x13, 0x93, 0x92, 0xc2, 0x72, 0x2d, 0xce, 0xf2, 0x95, 0x2c, 0xc6, 0x85, 0x0e, 0xef, 0x9b,
-	0x3c, 0x39, 0xcc, 0x24, 0xa7, 0xe3, 0xd8, 0x98, 0xc6, 0x72, 0x0a, 0x26, 0xd3, 0xef, 0xc0, 0x64,
-	0x6c, 0x26, 0x52, 0x38, 0x6e, 0xc6, 0x39, 0x5e, 0x35, 0xb4, 0x49, 0x94, 0x40, 0xbc, 0x1f, 0x66,
-	0x18, 0x23, 0xc5, 0x12, 0xab, 0x20, 0x34, 0xcc, 0x9b, 0x95, 0x5b, 0x6f, 0x99, 0x26, 0xcb, 0x9f,
-	0xe5, 0x60, 0x3c, 0x3c, 0xb4, 0xb2, 0x44, 0x27, 0x95, 0xb1, 0x99, 0x3b, 0x24, 0x64, 0x90, 0xef,
-	0x27, 0x64, 0x30, 0xd4, 0x3b, 0x64, 0x10, 0x64, 0x30, 0x46, 0x1e, 0x9d, 0xc1, 0x30, 0x42, 0x06,
-	0xa3, 0xfd, 0x87, 0x0c, 0xc6, 0x0e, 0x0f, 0x19, 0xd8, 0x7f, 0x69, 0x01, 0xea, 0x8e, 0x0f, 0x65,
-	0x11, 0x14, 0x49, 0x9a, 0x12, 0xaf, 0x65, 0x75, 0xd6, 0x0f, 0xb3, 0x28, 0x6c, 0x06, 0xf3, 0x37,
-	0x1c, 0xff, 0x66, 0x67, 0xeb, 0x2e, 0xdd, 0x6a, 0x78, 0xde, 0x0e, 0xa6, 0x55, 0xea, 0xec, 0x52,
-	0x86, 0xde, 0x86, 0x71, 0x4e, 0xab, 0x8c, 0x0a, 0xc3, 0x4a, 0x1f, 0xd8, 0xcf, 0x1b, 0x6b, 0xa7,
-	0x58, 0xf5, 0x18, 0x95, 0xf6, 0xa6, 0x57, 0x25, 0x4d, 0xe5, 0x4e, 0x86, 0x26, 0x58, 0x24, 0x98,
-	0x4a, 0x00, 0x81, 0x23, 0x34, 0xfb, 0x93, 0x61, 0x98, 0xbe, 0xe1, 0x0c, 0x1c, 0xdc, 0xf6, 0xe1,
-	0x69, 0xd5, 0xfb, 0x0a, 0xd5, 0xae, 0x45, 0x78, 0x76, 0xa9, 0x35, 0x75, 0x59, 0x37, 0x7d, 0xba,
-	0x9c, 0x5e, 0xed, 0x61, 0x6f, 0x12, 0xee, 0x05, 0xdd, 0xf7, 0xc2, 0xbc, 0x02, 0x93, 0xdc, 0x67,
-	0x4e, 0xd5, 0x57, 0xe1, 0x73, 0xbe, 0x50, 0x90, 0xb6, 0xc1, 0xbc, 0xae, 0x3e, 0x59, 0x31, 0x89,
-	0x38, 0x5e, 0x37, 0x35, 0x2a, 0x3f, 0x94, 0x39, 0x2a, 0xbf, 0x0c, 0xe3, 0xa4, 0xd9, 0xf4, 0x3e,
-	0xd8, 0x24, 0x75, 0xae, 0xe3, 0x60, 0xe1, 0x84, 0xac, 0x04, 0x04, 0x1c, 0xd5, 0x41, 0x45, 0x00,
-	0xa7, 0xee, 0x7a, 0x8c, 0xca, 0x16, 0x23, 0xd2, 0x48, 0x91, 0x99, 0xc7, 0xb5, 0xb0, 0x14, 0x1b,
-	0x35, 0x50, 0x05, 0xe6, 0x1d, 0x97, 0xd3, 0x6a, 0x87, 0xd1, 0xca, 0x8e, 0xd3, 0xde, 0x5c, 0xaf,
-	0x48, 0xb5, 0xb8, 0x27, 0x77, 0xd0, 0x58, 0xe9, 0x19, 0xcd, 0x6c, 0x7e, 0x2d, 0xad, 0x12, 0x4e,
-	0x6f, 0x8b, 0x5e, 0x85, 0x09, 0xc7, 0xad, 0x36, 0x3b, 0x35, 0xba, 0x41, 0xfc, 0x06, 0x5f, 0x18,
-	0x93, 0xdd, 0x98, 0x39, 0xd8, 0x5f, 0x9a, 0x58, 0x33, 0xca, 0x71, 0xac, 0x96, 0x68, 0x45, 0x1f,
-	0x18, 0xad, 0xc6, 0xa3, 0x56, 0xd7, 0x1e, 0x98, 0xad, 0xcc, 0x5a, 0x29, 0x79, 0x0b, 0xc8, 0x94,
-	0xb7, 0xf8, 0x61, 0x0e, 0x46, 0x54, 0xda, 0x10, 0x5d, 0x48, 0xe4, 0xe6, 0x9e, 0xe9, 0xca, 0xcd,
-	0x15, 0xd2, 0x52, 0xac, 0x36, 0x8c, 0x38, 0x9c, 0x77, 0xe2, 0x36, 0xe1, 0x9a, 0x2c, 0xc1, 0x9a,
-	0x22, 0x63, 0xba, 0x9e, 0xbb, 0xed, 0xd4, 0x75, 0xc0, 0xeb, 0x88, 0xba, 0x5b, 0xf1, 0x28, 0x4b,
-	0x44, 0xac, 0x91, 0x05, 0x0f, 0xaf, 0xe3, 0xb7, 0x3b, 0xbe, 0x5c, 0x28, 0xc7, 0xc4, 0xe3, 0x96,
-	0x44, 0xc4, 0x1a, 0xd9, 0xfe, 0xd8, 0x82, 0x69, 0x25, 0x83, 0x72, 0x83, 0x56, 0x77, 0x2a, 0x3e,
-	0x6d, 0x0b, 0x27, 0xad, 0xc3, 0x29, 0x4f, 0x3a, 0x69, 0xb7, 0x39, 0xe5, 0x58, 0x52, 0x8c, 0xd1,
-	0xe7, 0x4e, 0x6a, 0xf4, 0xf6, 0x45, 0x30, 0x26, 0x47, 0xe6, 0xbd, 0x55, 0xfa, 0x57, 0x9d, 0xa0,
-	0xf9, 0x48, 0x09, 0xa9, 0x5a, 0x7b, 0x38, 0xa0, 0xdb, 0x07, 0x39, 0x18, 0x96, 0x7e, 0x54, 0x16,
-	0xcd, 0x15, 0x0f, 0x7c, 0xe6, 0xfa, 0x0a, 0x7c, 0x1e, 0x12, 0x1b, 0x8f, 0x82, 0xbf, 0x43, 0x8f,
-	0x0c, 0xfe, 0xf2, 0xb4, 0xd8, 0xef, 0x1b, 0x19, 0xdc, 0xc7, 0x41, 0xee, 0x9e, 0x1c, 0x35, 0xb6,
-	0xfa, 0x33, 0x0b, 0xe6, 0xd2, 0xb2, 0x20, 0x59, 0x64, 0xfe, 0x12, 0x8c, 0xb5, 0x9b, 0xc4, 0xdf,
-	0xf6, 0x58, 0x2b, 0x99, 0xfd, 0xde, 0xd0, 0xe5, 0x38, 0xac, 0x81, 0x18, 0x00, 0x0b, 0x4e, 0xb1,
-	0xc0, 0xc9, 0xbe, 0x7a, 0xb4, 0x08, 0x79, 0x34, 0xc3, 0x61, 0x11, 0xc7, 0x06, 0x17, 0xfb, 0x0f,
-	0x86, 0x61, 0x56, 0x36, 0x19, 0xf4, 0x40, 0x1c, 0x64, 0x59, 0xb5, 0xe1, 0x29, 0xe9, 0xfe, 0x77,
-	0x9f, 0xa1, 0x6a, 0xa5, 0x5d, 0xd4, 0xed, 0x9f, 0x5a, 0x4b, 0xad, 0xf5, 0xb0, 0x27, 0x05, 0xf7,
-	0xc0, 0xed, 0x3e, 0x18, 0xe1, 0xff, 0xdf, 0xc1, 0x68, 0x2e, 0xb6, 0xd1, 0x43, 0x17, 0x5b, 0xcf,
-	0x63, 0x74, 0xec, 0x08, 0xc7, 0x68, 0xf7, 0xd1, 0x36, 0x9e, 0xe9, 0x68, 0xfb, 0xf3, 0x1c, 0x8c,
-	0x6e, 0x30, 0x4f, 0x66, 0xd3, 0x4e, 0x3e, 0xe5, 0x70, 0x7b, 0xc0, 0x2c, 0xbc, 0x80, 0x52, 0xba,
-	0x5c, 0x66, 0xe1, 0xc7, 0xe2, 0x19, 0x78, 0x23, 0x82, 0x9e, 0xcf, 0xe2, 0x67, 0x69, 0xe0, 0x43,
-	0x22, 0xe8, 0x7f, 0x93, 0x83, 0xc9, 0x58, 0x17, 0x9e, 0xe0, 0xdb, 0x0a, 0x09, 0x39, 0xa5, 0xdc,
-	0x56, 0x40, 0x24, 0x21, 0xab, 0x4b, 0x83, 0x80, 0x3f, 0x5a, 0x62, 0xff, 0x68, 0xc1, 0x6c, 0xac,
-	0xfe, 0x63, 0x08, 0x71, 0x7f, 0x2b, 0x1e, 0xe2, 0x7e, 0x65, 0x80, 0x51, 0xf5, 0x08, 0x74, 0x7f,
-	0x37, 0x97, 0x18, 0x8d, 0x10, 0x26, 0xfa, 0x0d, 0x98, 0x6d, 0x07, 0xf7, 0x27, 0x36, 0xbc, 0xa6,
-	0x53, 0x75, 0x68, 0x90, 0x31, 0xb9, 0x90, 0xf1, 0x72, 0x89, 0x6c, 0xbe, 0x57, 0xfa, 0x8a, 0xe6,
-	0x3e, 0xbb, 0x91, 0xc4, 0xc5, 0xdd, 0xac, 0x10, 0x87, 0x71, 0xa6, 0x7d, 0xb7, 0x60, 0xcc, 0x7d,
-	0x5e, 0x8f, 0x4b, 0x78, 0x7e, 0x7a, 0xec, 0xa1, 0x5e, 0x4d, 0x90, 0xe5, 0xfd, 0x2f, 0xfd, 0xd3,
-	0xfe, 0x0f, 0x0b, 0x4e, 0xa7, 0x2c, 0x04, 0x54, 0x05, 0xa8, 0x7a, 0x6e, 0xcd, 0x51, 0xc6, 0x86,
-	0xa5, 0xc3, 0xe0, 0x7d, 0x4d, 0x6e, 0x39, 0x68, 0x17, 0xed, 0x88, 0xb0, 0x88, 0x63, 0x03, 0x16,
-	0xb5, 0xba, 0x47, 0x7c, 0x61, 0xa0, 0x11, 0xf7, 0x37, 0xd6, 0x4f, 0x2c, 0x28, 0xe8, 0xb1, 0x3e,
-	0xb1, 0x19, 0x1a, 0xdd, 0xbf, 0x1e, 0x0b, 0xf7, 0x73, 0x0b, 0x26, 0x0c, 0x15, 0xc7, 0x51, 0x03,
-	0xe0, 0x03, 0xc2, 0x68, 0xc3, 0x0b, 0x4d, 0xf1, 0xbe, 0xe3, 0xe6, 0x77, 0x83, 0x76, 0x12, 0x29,
-	0x9a, 0xab, 0xb0, 0x9c, 0x63, 0x03, 0x1b, 0x7d, 0xcb, 0x08, 0x81, 0x2b, 0xfd, 0xd8, 0x17, 0x17,
-	0x19, 0xf0, 0x52, 0x1c, 0x4c, 0xdd, 0x62, 0x04, 0xce, 0xed, 0x1f, 0x59, 0xa1, 0x36, 0x4e, 0x5d,
-	0x7c, 0xf9, 0x93, 0x59, 0x7c, 0x15, 0x18, 0x16, 0xca, 0x2d, 0xb8, 0x14, 0x7a, 0x3e, 0xf3, 0x01,
-	0xc3, 0xf5, 0xfd, 0x27, 0xf1, 0x13, 0x2b, 0x2c, 0xfb, 0x07, 0x39, 0x18, 0x0f, 0x37, 0xfb, 0x63,
-	0x3f, 0x7d, 0x5f, 0xc9, 0xa8, 0xa6, 0x7a, 0x9e, 0x28, 0xef, 0x25, 0x4e, 0x94, 0xac, 0xfa, 0xef,
-	0x90, 0xd3, 0xe4, 0xef, 0xd5, 0x8c, 0xab, 0xba, 0x8f, 0x61, 0x2b, 0x6e, 0xc6, 0xb7, 0xe2, 0x72,
-	0xc6, 0xd1, 0xf4, 0xd8, 0x8c, 0x1f, 0xe6, 0x60, 0x3a, 0xa1, 0xf1, 0xd1, 0xd7, 0xe4, 0xa2, 0xaa,
-	0x07, 0xa9, 0xcb, 0xb0, 0xa1, 0x8e, 0xfb, 0x4a, 0x1a, 0xda, 0x15, 0x76, 0x74, 0x68, 0x61, 0x7b,
-	0x4c, 0x0b, 0xf9, 0xeb, 0x03, 0x1d, 0x32, 0x01, 0x48, 0x69, 0x56, 0x99, 0xe0, 0x06, 0x2e, 0x8e,
-	0xb3, 0x41, 0x1b, 0x30, 0x47, 0x3a, 0xbe, 0x17, 0x02, 0x5c, 0x73, 0xc9, 0x56, 0x93, 0xaa, 0x38,
-	0xee, 0x58, 0xe9, 0xe7, 0xc2, 0x7c, 0x51, 0x4a, 0x1d, 0x9c, 0xda, 0xd2, 0xfe, 0x2b, 0x0b, 0x9e,
-	0xee, 0xd1, 0x9f, 0x3e, 0x92, 0xb8, 0x4d, 0x98, 0x94, 0xcf, 0x2c, 0x42, 0x39, 0x04, 0xab, 0xb8,
-	0xbf, 0x99, 0x37, 0x9b, 0xaa, 0xd1, 0xc7, 0x8a, 0x70, 0x1c, 0xdc, 0xfe, 0x71, 0x0e, 0x50, 0xd8,
-	0xd7, 0x2c, 0xb9, 0xe6, 0xf7, 0x60, 0x74, 0x5b, 0xa5, 0x4e, 0x8e, 0x76, 0x59, 0xa0, 0x54, 0x30,
-	0xef, 0x4b, 0x04, 0x98, 0xe8, 0xed, 0xe3, 0xd9, 0x6b, 0xd0, 0xbd, 0xcf, 0xd0, 0x3d, 0x80, 0x6d,
-	0xc7, 0x75, 0x78, 0x63, 0xc0, 0x3b, 0x57, 0xd2, 0x51, 0xba, 0x1e, 0x22, 0x60, 0x03, 0xcd, 0xfe,
-	0xe3, 0x9c, 0xb1, 0x87, 0xa5, 0xfd, 0xd4, 0xd7, 0xda, 0x7f, 0x21, 0x2e, 0xcc, 0xf1, 0xee, 0x8b,
-	0x24, 0xa1, 0x60, 0xee, 0xc1, 0xd0, 0x2e, 0x61, 0x41, 0x4e, 0xbb, 0xcf, 0xeb, 0x9c, 0xdd, 0x37,
-	0xb9, 0xa2, 0x39, 0xbd, 0x43, 0x18, 0xc7, 0x12, 0x53, 0xd8, 0x96, 0xdc, 0xa7, 0xed, 0xe0, 0x70,
-	0xc9, 0xac, 0x38, 0x7d, 0xda, 0x36, 0x07, 0x48, 0xdb, 0xf2, 0x04, 0xa0, 0x6d, 0x6e, 0x7f, 0x6f,
-	0xd4, 0xd0, 0x0a, 0xfa, 0x3c, 0x7b, 0x13, 0x50, 0x93, 0x70, 0xff, 0x26, 0x71, 0x6b, 0x62, 0x2f,
-	0xd1, 0x6d, 0x46, 0x79, 0x43, 0x7b, 0xbf, 0x8b, 0x1a, 0x05, 0xad, 0x77, 0xd5, 0xc0, 0x29, 0xad,
-	0xd0, 0x85, 0xe0, 0x99, 0x8c, 0x92, 0xf2, 0x52, 0xec, 0x99, 0xcc, 0xc3, 0xfd, 0xa5, 0xa9, 0x68,
-	0x3f, 0x1a, 0x0f, 0x67, 0x32, 0x3c, 0x08, 0x31, 0xd7, 0xfb, 0xf0, 0x09, 0xac, 0xf7, 0x5f, 0x87,
-	0xd9, 0xed, 0xe4, 0xcd, 0x22, 0x7d, 0x1b, 0xf3, 0xf5, 0x01, 0x2f, 0x26, 0x95, 0xe6, 0x0f, 0xa2,
-	0xeb, 0x28, 0x51, 0x31, 0xee, 0x66, 0x84, 0xbc, 0xe0, 0x19, 0x8a, 0x0c, 0x64, 0xaa, 0x18, 0x75,
-	0xdf, 0x7b, 0x2e, 0x11, 0x02, 0x4d, 0x3e, 0x40, 0x51, 0x90, 0x38, 0xc6, 0x20, 0xb1, 0x07, 0x47,
-	0x8e, 0x73, 0x0f, 0xa2, 0x0b, 0x61, 0xf6, 0x5d, 0x74, 0x47, 0x86, 0x09, 0xf2, 0x5d, 0x79, 0x73,
-	0x41, 0xc2, 0x66, 0x3d, 0xf4, 0x91, 0x05, 0xf3, 0x62, 0xb1, 0x5e, 0x7b, 0x40, 0xab, 0x1d, 0x21,
-	0x95, 0x20, 0x03, 0xb9, 0x50, 0xc8, 0xe2, 0x75, 0x54, 0xd2, 0x20, 0xa2, 0x98, 0x47, 0x2a, 0x19,
-	0xa7, 0x33, 0x46, 0xf7, 0x95, 0x31, 0x46, 0x65, 0x48, 0xe9, 0xe8, 0x91, 0xe2, 0xd0, 0x30, 0x53,
-	0x7a, 0xc7, 0xa7, 0xf6, 0x0f, 0x86, 0x4c, 0x75, 0xd5, 0x5f, 0xfc, 0xfa, 0x1e, 0x0c, 0xf9, 0x84,
-	0xef, 0xe8, 0x5d, 0xf0, 0xc6, 0x00, 0x0f, 0x0c, 0xa2, 0xbd, 0x20, 0xe3, 0x1b, 0xb2, 0x48, 0x62,
-	0xa2, 0x45, 0xc8, 0x11, 0x9e, 0xcc, 0xa0, 0xae, 0x70, 0x9c, 0x23, 0x5c, 0x66, 0x57, 0xb7, 0x75,
-	0xf4, 0x29, 0xca, 0xae, 0x6e, 0xe3, 0x9c, 0xb3, 0x8d, 0x56, 0x60, 0xba, 0xea, 0xb9, 0xbe, 0xe3,
-	0x76, 0xe8, 0x2d, 0xf7, 0x1a, 0x63, 0x1e, 0xd3, 0xb1, 0xa6, 0xa7, 0x75, 0xc5, 0xe9, 0x72, 0x9c,
-	0x8c, 0x93, 0xf5, 0xd1, 0xdb, 0x30, 0xcc, 0xa8, 0xcf, 0xf6, 0xf4, 0x81, 0x70, 0x71, 0x00, 0xdd,
-	0x87, 0x45, 0x7b, 0x25, 0x65, 0xf9, 0x13, 0x2b, 0xc4, 0x50, 0x65, 0x8f, 0x9c, 0x80, 0xca, 0x8e,
-	0xb2, 0x09, 0xf9, 0x13, 0xcb, 0x26, 0xfc, 0xd0, 0x32, 0x6c, 0x84, 0x70, 0xa0, 0xe8, 0x36, 0x8c,
-	0xfa, 0x4e, 0x8b, 0x7a, 0x1d, 0x3f, 0x9b, 0x71, 0x1a, 0xde, 0xe8, 0x91, 0x9a, 0x70, 0x53, 0x41,
-	0xe0, 0x00, 0x0b, 0x5d, 0x85, 0x29, 0x2a, 0x66, 0x64, 0xb3, 0x21, 0x34, 0xbb, 0xd7, 0x54, 0x96,
-	0xd8, 0x64, 0x14, 0xe8, 0xbb, 0x16, 0xa3, 0xe2, 0x44, 0x6d, 0xfb, 0xc7, 0xa6, 0x19, 0xfd, 0x7f,
-	0xff, 0xd1, 0x8d, 0x8e, 0x31, 0x3d, 0xd6, 0xd7, 0x36, 0x03, 0xc7, 0x98, 0x0e, 0x7d, 0x66, 0xf3,
-	0x2e, 0x3c, 0x95, 0xae, 0x0a, 0x8e, 0xe5, 0x99, 0xea, 0x8f, 0x92, 0xb2, 0x92, 0x16, 0x58, 0xb0,
-	0xfd, 0xac, 0x93, 0xb4, 0x98, 0x72, 0xc7, 0x6d, 0x31, 0x31, 0x73, 0x28, 0xfa, 0x51, 0x2f, 0x7a,
-	0x4f, 0xaf, 0x33, 0x2b, 0xcb, 0x33, 0xd1, 0x2e, 0x98, 0x9e, 0x6b, 0xed, 0x27, 0x16, 0xcc, 0xa7,
-	0xd6, 0x0e, 0x65, 0x98, 0x3b, 0x49, 0x19, 0x5a, 0xc7, 0x2d, 0xc3, 0xef, 0xe7, 0x60, 0x06, 0xd3,
-	0xb6, 0x17, 0x4b, 0x40, 0x6d, 0x04, 0xcf, 0xa1, 0x32, 0xb8, 0x15, 0x89, 0x5b, 0x1d, 0xa5, 0xd1,
-	0xd8, 0x3b, 0x28, 0xb1, 0x5d, 0x5a, 0x81, 0x0d, 0xd9, 0xf7, 0xf6, 0xef, 0x4a, 0x8d, 0xa9, 0x93,
-	0x43, 0x25, 0xd9, 0x14, 0xa0, 0x40, 0x96, 0xf7, 0x4e, 0xb5, 0x72, 0x7f, 0x3d, 0xc3, 0x0d, 0xd6,
-	0x6e, 0x64, 0x59, 0x8c, 0x15, 0xa0, 0xfd, 0x71, 0x0e, 0x94, 0x0b, 0xf2, 0x18, 0xb4, 0xe3, 0xaf,
-	0xc4, 0xb4, 0xe3, 0x72, 0x96, 0x10, 0x59, 0xaf, 0x50, 0x4c, 0xd2, 0x3d, 0x3c, 0x97, 0x31, 0xee,
-	0xf6, 0x88, 0x30, 0xcc, 0xdf, 0x59, 0x30, 0x2e, 0xeb, 0x3d, 0x06, 0x45, 0xbb, 0x11, 0x57, 0xb4,
-	0x2f, 0x66, 0x18, 0x45, 0x0f, 0x05, 0xfb, 0x9f, 0x79, 0xdd, 0xfb, 0xd0, 0xf9, 0x6c, 0x10, 0x56,
-	0xd3, 0x5e, 0x55, 0xb4, 0x4b, 0x44, 0x21, 0x56, 0xb4, 0x70, 0x6f, 0x8f, 0x9e, 0xc0, 0xde, 0xfe,
-	0x35, 0x75, 0xfd, 0x97, 0x72, 0x9f, 0xd6, 0xae, 0x87, 0xee, 0x53, 0x3e, 0xf3, 0x3d, 0x66, 0x7d,
-	0xd7, 0x3a, 0x8a, 0x68, 0xe3, 0x04, 0x2a, 0xee, 0xe2, 0x23, 0x5c, 0xaa, 0x76, 0x52, 0x99, 0x69,
-	0x57, 0xe3, 0xf5, 0x01, 0x35, 0xa7, 0x72, 0xa9, 0xba, 0x8a, 0x71, 0x37, 0x23, 0xd4, 0x80, 0x09,
-	0xf3, 0x05, 0x86, 0x5e, 0xa7, 0xe7, 0xb3, 0x3f, 0xf5, 0x50, 0x97, 0x7e, 0xcc, 0x12, 0x1c, 0x43,
-	0xb6, 0xff, 0xd0, 0x02, 0x88, 0x02, 0xca, 0x62, 0xce, 0xab, 0x5e, 0xc7, 0x55, 0x91, 0x84, 0x7c,
-	0x34, 0xe7, 0x65, 0x51, 0x88, 0x15, 0x4d, 0xec, 0x1f, 0xe5, 0x8f, 0xe9, 0x45, 0x7d, 0x2e, 0x8b,
-	0xab, 0x97, 0x08, 0x5c, 0xab, 0x42, 0xac, 0x01, 0xed, 0x0f, 0x47, 0xa0, 0x60, 0xec, 0xb3, 0x44,
-	0xd8, 0x7a, 0xf2, 0x64, 0xc2, 0xd6, 0xe9, 0xb1, 0x84, 0xc2, 0x40, 0xb1, 0x04, 0x0e, 0x53, 0xda,
-	0x43, 0x0e, 0x9e, 0xe9, 0xa8, 0x58, 0xcb, 0xc0, 0x7e, 0x38, 0x12, 0x56, 0xeb, 0xf5, 0x18, 0x24,
-	0x4e, 0xb0, 0x10, 0x56, 0xaf, 0x2e, 0xa9, 0x74, 0x5a, 0x2d, 0xc2, 0xf6, 0x16, 0x26, 0x64, 0xe7,
-	0x43, 0xab, 0xf7, 0x7a, 0x8c, 0x8a, 0x13, 0xb5, 0xd1, 0x46, 0x38, 0xa1, 0xea, 0xe9, 0xc7, 0x4b,
-	0x59, 0x26, 0x54, 0x59, 0xfd, 0xf1, 0x79, 0x14, 0x22, 0xf5, 0xb6, 0xa4, 0xd3, 0x50, 0xbb, 0xa1,
-	0x3e, 0x72, 0x23, 0x96, 0xf1, 0x88, 0x5c, 0x54, 0xa1, 0x48, 0x6f, 0x75, 0xd5, 0xc0, 0x29, 0xad,
-	0x84, 0x1a, 0xd0, 0xae, 0x76, 0xb8, 0x77, 0x74, 0x70, 0x23, 0xab, 0x9f, 0x15, 0xf9, 0x8e, 0xf2,
-	0x3d, 0x40, 0x39, 0x81, 0x8a, 0xbb, 0xf8, 0xa0, 0xf7, 0x61, 0x52, 0x4c, 0x72, 0xc4, 0x18, 0x8e,
-	0xc8, 0x58, 0x07, 0x55, 0x0d, 0x48, 0x1c, 0xe7, 0x60, 0x7f, 0x9e, 0x87, 0x74, 0x47, 0x3f, 0x7a,
-	0x8a, 0x68, 0x3d, 0xe2, 0x29, 0xe2, 0x5d, 0x18, 0xe7, 0x3e, 0x61, 0xea, 0x4d, 0x68, 0x6e, 0xb0,
-	0x37, 0xa1, 0x95, 0x00, 0x00, 0x47, 0x58, 0x89, 0xa8, 0x4b, 0xfe, 0x58, 0xa3, 0x2e, 0xe7, 0x01,
-	0xa4, 0x23, 0x26, 0xd5, 0x8c, 0x3c, 0x6f, 0x26, 0xa3, 0x5d, 0x7b, 0x2d, 0xa4, 0x60, 0xa3, 0x16,
-	0xfa, 0x7a, 0x78, 0x8a, 0xab, 0x4b, 0x2b, 0xbf, 0xd0, 0x75, 0xc7, 0xf0, 0x74, 0xcc, 0xcc, 0x4b,
-	0x04, 0x72, 0x33, 0x5c, 0x86, 0x4e, 0x09, 0x10, 0x8c, 0x66, 0x0b, 0x10, 0xd8, 0xff, 0x9d, 0x83,
-	0x98, 0x16, 0x46, 0xdf, 0xb5, 0x60, 0x96, 0x24, 0x3e, 0xbb, 0x13, 0x18, 0xb1, 0xbf, 0x9c, 0xed,
-	0x5b, 0x48, 0x5d, 0x5f, 0xed, 0x89, 0x92, 0xe4, 0xc9, 0x2a, 0x1c, 0x77, 0x33, 0x45, 0xbf, 0x6b,
-	0xc1, 0x69, 0xd2, 0xfd, 0x5d, 0x25, 0xbd, 0x78, 0x2e, 0x0d, 0xfc, 0x61, 0xa6, 0xd2, 0xd3, 0x07,
-	0xfb, 0x4b, 0x69, 0x5f, 0x9c, 0xc2, 0x69, 0xec, 0xd0, 0x3b, 0x30, 0x44, 0x58, 0x3d, 0x08, 0x1f,
-	0x67, 0x67, 0x1b, 0x7c, 0x2e, 0x2b, 0x32, 0x25, 0x56, 0x58, 0x9d, 0x63, 0x09, 0x6a, 0xff, 0x34,
-	0x0f, 0x33, 0xc9, 0x27, 0x90, 0xfa, 0xca, 0xfd, 0x50, 0xea, 0x95, 0x7b, 0xb1, 0xd7, 0x64, 0x02,
-	0x25, 0xf9, 0xec, 0x57, 0xe6, 0x41, 0x14, 0x2d, 0xdc, 0x6b, 0xf2, 0x61, 0xd2, 0xf0, 0x11, 0xf6,
-	0x9a, 0x7c, 0x8d, 0x14, 0x61, 0xa1, 0x8b, 0xf1, 0x88, 0xb4, 0x9d, 0x8c, 0x48, 0xcf, 0x9a, 0x63,
-	0x19, 0x34, 0x28, 0xdd, 0x82, 0x82, 0x31, 0x0f, 0x7a, 0x47, 0x5f, 0xce, 0x2c, 0xf7, 0x68, 0xd9,
-	0x4d, 0xab, 0x7b, 0x8f, 0x11, 0xc5, 0xc4, 0x8f, 0xf4, 0x87, 0x94, 0xd6, 0x91, 0xa2, 0xb6, 0x52,
-	0x5c, 0x06, 0x9a, 0xfd, 0x2f, 0x16, 0x4c, 0xc6, 0x1e, 0xa1, 0x08, 0x6e, 0xc1, 0xeb, 0xa2, 0xc1,
-	0xbf, 0x31, 0x75, 0x27, 0x44, 0xc0, 0x06, 0x1a, 0xfa, 0x36, 0x14, 0x9a, 0x9e, 0x5b, 0xa7, 0xdc,
-	0xaf, 0x78, 0x64, 0x47, 0xef, 0x93, 0xac, 0xf1, 0xab, 0x85, 0x83, 0xfd, 0xa5, 0xb9, 0x75, 0x05,
-	0x53, 0xf6, 0x5a, 0xed, 0x26, 0xf5, 0xd5, 0x3b, 0x34, 0x6c, 0x82, 0xcb, 0xec, 0x77, 0x78, 0x7d,
-	0xe0, 0x49, 0xcd, 0x7e, 0x47, 0xf7, 0x1e, 0x8e, 0x39, 0xfb, 0x1d, 0xbb, 0x50, 0x71, 0x48, 0xf6,
-	0x3b, 0xac, 0xfb, 0xc4, 0x66, 0xbf, 0xc3, 0x1e, 0xf6, 0x70, 0xbf, 0xfe, 0x2b, 0x67, 0x8c, 0x22,
-	0xee, 0x82, 0xe5, 0x1e, 0xe1, 0x82, 0xbd, 0x0b, 0x63, 0x8e, 0xeb, 0x53, 0xb6, 0x4b, 0x9a, 0x3a,
-	0xfe, 0x9c, 0x75, 0x2d, 0x86, 0x43, 0x5d, 0xd3, 0x38, 0x38, 0x44, 0x44, 0x4d, 0x98, 0x0f, 0x52,
-	0x3e, 0x8c, 0x92, 0x28, 0x29, 0xad, 0xaf, 0xc4, 0xbe, 0x16, 0xe4, 0x26, 0xae, 0xa7, 0x55, 0x7a,
-	0xd8, 0x8b, 0x80, 0xd3, 0x41, 0x11, 0x87, 0x49, 0x6e, 0xc4, 0x1e, 0x82, 0x13, 0xb1, 0xcf, 0x74,
-	0x59, 0x32, 0x5c, 0x63, 0xdc, 0xa3, 0x35, 0x41, 0x71, 0x9c, 0x87, 0xfd, 0x91, 0x05, 0x53, 0xf1,
-	0xab, 0x3b, 0xff, 0xeb, 0x7e, 0xd0, 0xe7, 0x79, 0x98, 0x4e, 0x2c, 0xfe, 0x84, 0x2f, 0x34, 0xfe,
-	0x38, 0x7d, 0xa1, 0x91, 0x81, 0x7c, 0xa1, 0x74, 0x27, 0x60, 0x68, 0x20, 0x27, 0xe0, 0x8a, 0x32,
-	0xc4, 0xf5, 0x62, 0x5a, 0x5b, 0xd5, 0x8f, 0xcd, 0xc2, 0x09, 0x5e, 0x37, 0x89, 0x38, 0x5e, 0x57,
-	0x5a, 0x38, 0xb5, 0xee, 0x4f, 0x28, 0x69, 0x2f, 0xe2, 0x52, 0xd6, 0xab, 0xec, 0x21, 0x80, 0xb2,
-	0x70, 0x52, 0x08, 0x38, 0x8d, 0x9d, 0xed, 0xc3, 0x74, 0xf2, 0x41, 0x59, 0x5f, 0x81, 0xeb, 0x36,
-	0xf1, 0x83, 0x07, 0x56, 0x61, 0x8d, 0x0d, 0xe2, 0x37, 0xb0, 0xa4, 0xa0, 0x67, 0x20, 0xdf, 0x61,
-	0xcd, 0xe4, 0xab, 0xbf, 0xdb, 0x78, 0x1d, 0x8b, 0x72, 0xfb, 0x4f, 0x2c, 0x98, 0x4f, 0xbd, 0xcd,
-	0xd8, 0x07, 0xf3, 0xfb, 0x30, 0xa2, 0x64, 0xa3, 0xcf, 0x83, 0x2b, 0x7d, 0x47, 0x3c, 0xbb, 0x1f,
-	0xcf, 0x29, 0x3f, 0x51, 0x91, 0xb0, 0x86, 0x2d, 0xbd, 0xf9, 0xe9, 0x97, 0x67, 0x4e, 0x7d, 0xf6,
-	0xe5, 0x99, 0x53, 0x5f, 0x7c, 0x79, 0xe6, 0xd4, 0x87, 0x07, 0x67, 0xac, 0x4f, 0x0f, 0xce, 0x58,
-	0x9f, 0x1d, 0x9c, 0xb1, 0xbe, 0x38, 0x38, 0x63, 0xfd, 0xdb, 0xc1, 0x19, 0xeb, 0xa3, 0x9f, 0x9d,
-	0x39, 0x75, 0xef, 0xd9, 0x7e, 0xbe, 0x57, 0xfb, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x82,
-	0x13, 0x96, 0xd6, 0x56, 0x00, 0x00,
+	// 4633 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0x4d, 0x6c, 0x1c, 0x47,
+	0x76, 0x56, 0xcf, 0x90, 0x43, 0xf2, 0x0d, 0x7f, 0x4b, 0xa4, 0xcd, 0xe5, 0xc6, 0xa2, 0xd3, 0x76,
+	0x0c, 0x3b, 0xb6, 0x87, 0xb1, 0x6c, 0xd9, 0xb2, 0xe4, 0x55, 0xc0, 0x21, 0x29, 0x89, 0x5e, 0xae,
+	0xc5, 0xd4, 0x50, 0xd2, 0x5a, 0xb6, 0xa1, 0x14, 0x67, 0x8a, 0x33, 0xbd, 0x9c, 0xe9, 0x1e, 0x57,
+	0xf5, 0xd0, 0x62, 0x36, 0x48, 0x9c, 0x9f, 0x0d, 0x16, 0x48, 0x10, 0xf8, 0xb0, 0x81, 0x17, 0x41,
+	0x82, 0x04, 0xd9, 0x53, 0xb0, 0x40, 0x72, 0xcc, 0x21, 0x07, 0x1f, 0x72, 0xf1, 0x26, 0xbb, 0x81,
+	0xe1, 0x1c, 0xe2, 0x00, 0x0b, 0x22, 0xe6, 0x02, 0x01, 0x72, 0xcb, 0x25, 0x17, 0x01, 0x01, 0x82,
+	0xfa, 0xe9, 0xee, 0xea, 0x9e, 0x1e, 0x71, 0x7a, 0x48, 0x2a, 0xca, 0xde, 0x66, 0xea, 0x55, 0x7d,
+	0xaf, 0xfe, 0xde, 0xab, 0xf7, 0x53, 0xd5, 0xf0, 0x4a, 0xdd, 0xf1, 0x1b, 0x9d, 0xed, 0x52, 0xd5,
+	0x6b, 0x2d, 0x91, 0xdd, 0x8e, 0xe3, 0xef, 0x2f, 0xed, 0x12, 0x56, 0xf7, 0x96, 0x48, 0xdb, 0x59,
+	0xda, 0x7b, 0x89, 0x34, 0xdb, 0x0d, 0xf2, 0xd2, 0x52, 0x9d, 0xba, 0x94, 0x11, 0x9f, 0xd6, 0x4a,
+	0x6d, 0xe6, 0xf9, 0x1e, 0x7a, 0x3a, 0x6a, 0x55, 0x52, 0xad, 0x4a, 0xb2, 0x55, 0x89, 0xb4, 0x9d,
+	0x52, 0xd0, 0x6a, 0xe1, 0x45, 0x03, 0xbb, 0xee, 0xd5, 0xbd, 0x25, 0xd9, 0x78, 0xbb, 0xb3, 0x23,
+	0xff, 0xc9, 0x3f, 0xf2, 0x97, 0x02, 0x5d, 0xb0, 0x77, 0x2f, 0xf2, 0x92, 0xa3, 0x38, 0x57, 0x3d,
+	0x46, 0x97, 0xf6, 0xba, 0x18, 0x2f, 0x5c, 0x8f, 0xea, 0xd0, 0x7b, 0x3e, 0x75, 0xb9, 0xe3, 0xb9,
+	0xfc, 0x45, 0xd2, 0x76, 0x38, 0x65, 0x7b, 0x94, 0x2d, 0xb5, 0x77, 0xeb, 0x82, 0xc6, 0xe3, 0x15,
+	0xd2, 0x90, 0x5e, 0x89, 0x90, 0x5a, 0xa4, 0xda, 0x70, 0x5c, 0xca, 0xf6, 0xa3, 0xe6, 0x2d, 0xea,
+	0x93, 0xb4, 0x56, 0x4b, 0xbd, 0x5a, 0xb1, 0x8e, 0xeb, 0x3b, 0x2d, 0xda, 0xd5, 0xe0, 0xd5, 0xa3,
+	0x1a, 0xf0, 0x6a, 0x83, 0xb6, 0x48, 0xb2, 0x9d, 0xfd, 0x2e, 0x9c, 0x5d, 0x76, 0x49, 0x73, 0x9f,
+	0x3b, 0x1c, 0x77, 0xdc, 0x65, 0x56, 0xef, 0xb4, 0xa8, 0xeb, 0xa3, 0x27, 0x61, 0xc8, 0x25, 0x2d,
+	0x3a, 0x6f, 0x3d, 0x69, 0x3d, 0x3b, 0x56, 0x1e, 0xff, 0xf4, 0x60, 0xf1, 0xcc, 0xe1, 0xc1, 0xe2,
+	0xd0, 0x5b, 0xa4, 0x45, 0xb1, 0xa4, 0xa0, 0xa7, 0x60, 0x78, 0x8f, 0x34, 0x3b, 0x74, 0x3e, 0x27,
+	0xab, 0x4c, 0xe8, 0x2a, 0xc3, 0xb7, 0x44, 0x21, 0x56, 0x34, 0xfb, 0xf7, 0xf2, 0x31, 0xf8, 0x6f,
+	0x50, 0x9f, 0xd4, 0x88, 0x4f, 0x50, 0x0b, 0x0a, 0x4d, 0xb2, 0x4d, 0x9b, 0x7c, 0xde, 0x7a, 0x32,
+	0xff, 0x6c, 0xf1, 0xfc, 0x5a, 0xa9, 0x9f, 0x85, 0x2e, 0xa5, 0x40, 0x95, 0x36, 0x24, 0xce, 0x9a,
+	0xeb, 0xb3, 0xfd, 0xf2, 0xa4, 0xee, 0x44, 0x41, 0x15, 0x62, 0xcd, 0x04, 0xfd, 0x8e, 0x05, 0x45,
+	0xe2, 0xba, 0x9e, 0x4f, 0x7c, 0xb1, 0x4c, 0xf3, 0x39, 0xc9, 0xf4, 0xcd, 0xc1, 0x99, 0x2e, 0x47,
+	0x60, 0x8a, 0xf3, 0x59, 0xcd, 0xb9, 0x68, 0x50, 0xb0, 0xc9, 0x73, 0xe1, 0x75, 0x28, 0x1a, 0x5d,
+	0x45, 0xd3, 0x90, 0xdf, 0xa5, 0xfb, 0x6a, 0x7e, 0xb1, 0xf8, 0x89, 0x66, 0x63, 0x13, 0xaa, 0x67,
+	0xf0, 0x52, 0xee, 0xa2, 0xb5, 0x70, 0x05, 0xa6, 0x93, 0x0c, 0xb3, 0xb4, 0xb7, 0xff, 0xd8, 0x82,
+	0x59, 0x63, 0x14, 0x98, 0xee, 0x50, 0x46, 0xdd, 0x2a, 0x45, 0x4b, 0x30, 0x26, 0xd6, 0x92, 0xb7,
+	0x49, 0x35, 0x58, 0xea, 0x19, 0x3d, 0x90, 0xb1, 0xb7, 0x02, 0x02, 0x8e, 0xea, 0x84, 0xdb, 0x22,
+	0xf7, 0xa0, 0x6d, 0xd1, 0x6e, 0x10, 0x4e, 0xe7, 0xf3, 0xf1, 0x6d, 0xb1, 0x29, 0x0a, 0xb1, 0xa2,
+	0xd9, 0x77, 0xe1, 0x2b, 0x41, 0x7f, 0xb6, 0x68, 0xab, 0xdd, 0x24, 0x3e, 0x8d, 0x3a, 0x75, 0xf4,
+	0xd6, 0x7b, 0x12, 0x86, 0x76, 0x1d, 0xb7, 0x96, 0xec, 0xc5, 0xd7, 0x1d, 0xb7, 0x86, 0x25, 0xc5,
+	0xde, 0x85, 0x89, 0xe5, 0x76, 0x9b, 0x79, 0x7b, 0xb4, 0x56, 0xf1, 0x49, 0x9d, 0xa2, 0x3b, 0x00,
+	0x44, 0x17, 0x2c, 0xfb, 0x12, 0xba, 0x78, 0xfe, 0x97, 0x4b, 0x4a, 0x66, 0x4a, 0xa6, 0xcc, 0x94,
+	0xda, 0xbb, 0x75, 0x51, 0xc0, 0x4b, 0x42, 0x34, 0x4b, 0x7b, 0x2f, 0x95, 0xb6, 0x9c, 0x16, 0x2d,
+	0x4f, 0x1e, 0x1e, 0x2c, 0xc2, 0x72, 0x88, 0x80, 0x0d, 0x34, 0xfb, 0x77, 0x2d, 0x98, 0x5b, 0x66,
+	0x75, 0x6f, 0x65, 0x75, 0xb9, 0xdd, 0xbe, 0x4e, 0x49, 0xd3, 0x6f, 0x54, 0x7c, 0xe2, 0x77, 0x38,
+	0xba, 0x02, 0x05, 0x2e, 0x7f, 0xe9, 0xc1, 0x3c, 0x13, 0xec, 0x4f, 0x45, 0xbf, 0x7f, 0xb0, 0x38,
+	0x9b, 0xd2, 0x90, 0x62, 0xdd, 0x0a, 0x3d, 0x07, 0x23, 0x2d, 0xca, 0x39, 0xa9, 0x07, 0x33, 0x3e,
+	0xa5, 0x01, 0x46, 0xbe, 0xa1, 0x8a, 0x71, 0x40, 0xb7, 0xff, 0x31, 0x07, 0x53, 0x21, 0x96, 0x66,
+	0x7f, 0x0a, 0xcb, 0xdb, 0x81, 0xf1, 0x86, 0x31, 0x42, 0xb9, 0xca, 0xc5, 0xf3, 0x97, 0xfb, 0x94,
+	0xa4, 0xb4, 0x49, 0x2a, 0xcf, 0x6a, 0x36, 0xe3, 0x66, 0x29, 0x8e, 0xb1, 0x41, 0x2d, 0x00, 0xbe,
+	0xef, 0x56, 0x35, 0xd3, 0x21, 0xc9, 0xf4, 0xf5, 0x8c, 0x4c, 0x2b, 0x21, 0x40, 0x19, 0x69, 0x96,
+	0x10, 0x95, 0x61, 0x83, 0x81, 0xfd, 0x37, 0x16, 0x9c, 0x4d, 0x69, 0x87, 0xde, 0x48, 0xac, 0xe7,
+	0xd3, 0x5d, 0xeb, 0x89, 0xba, 0x9a, 0x45, 0xab, 0xf9, 0x02, 0x8c, 0x32, 0xba, 0xe7, 0x88, 0x93,
+	0x42, 0xcf, 0xf0, 0xb4, 0x6e, 0x3f, 0x8a, 0x75, 0x39, 0x0e, 0x6b, 0xa0, 0xe7, 0x61, 0x2c, 0xf8,
+	0x2d, 0xa6, 0x39, 0x2f, 0x84, 0x49, 0x2c, 0x5c, 0x50, 0x95, 0xe3, 0x88, 0x6e, 0xff, 0x36, 0x0c,
+	0xaf, 0x34, 0x08, 0xf3, 0xc5, 0x8e, 0x61, 0xb4, 0xed, 0xdd, 0xc4, 0x1b, 0xba, 0x8b, 0xe1, 0x8e,
+	0xc1, 0xaa, 0x18, 0x07, 0xf4, 0x3e, 0x16, 0xfb, 0x39, 0x18, 0xd9, 0xa3, 0x4c, 0xf6, 0x37, 0x1f,
+	0x07, 0xbb, 0xa5, 0x8a, 0x71, 0x40, 0xb7, 0xff, 0xc5, 0x82, 0x59, 0xd9, 0x83, 0x55, 0x87, 0x57,
+	0xbd, 0x3d, 0xca, 0xf6, 0x31, 0xe5, 0x9d, 0xe6, 0x09, 0x77, 0x68, 0x15, 0xa6, 0x39, 0x6d, 0xed,
+	0x51, 0xb6, 0xe2, 0xb9, 0xdc, 0x67, 0xc4, 0x71, 0x7d, 0xdd, 0xb3, 0x79, 0x5d, 0x7b, 0xba, 0x92,
+	0xa0, 0xe3, 0xae, 0x16, 0xe8, 0x59, 0x18, 0xd5, 0xdd, 0x16, 0x5b, 0x49, 0x4c, 0xec, 0xb8, 0x58,
+	0x03, 0x3d, 0x26, 0x8e, 0x43, 0xaa, 0xfd, 0x1f, 0x16, 0xcc, 0xc8, 0x51, 0x55, 0x3a, 0xdb, 0xbc,
+	0xca, 0x9c, 0xb6, 0x50, 0xc0, 0x8f, 0xe2, 0x90, 0xae, 0xc0, 0x64, 0x2d, 0x98, 0xf8, 0x0d, 0xa7,
+	0xe5, 0xf8, 0x52, 0x46, 0x86, 0xcb, 0x8f, 0x69, 0x8c, 0xc9, 0xd5, 0x18, 0x15, 0x27, 0x6a, 0xab,
+	0xe5, 0x6b, 0x76, 0xb8, 0x4f, 0xd9, 0x26, 0xf3, 0x5a, 0x9e, 0x18, 0xe7, 0x16, 0xe1, 0xbb, 0xe8,
+	0xd7, 0x61, 0xb4, 0xa5, 0x0f, 0x3d, 0xad, 0x35, 0x7f, 0xa5, 0x3f, 0xad, 0x79, 0x63, 0xfb, 0x5b,
+	0xb4, 0xea, 0x8b, 0x03, 0x33, 0x92, 0xb6, 0xa8, 0x0c, 0x87, 0xa8, 0xe8, 0x6d, 0x18, 0xe2, 0x6d,
+	0x5a, 0x95, 0x53, 0x54, 0x3c, 0xff, 0x5a, 0x7f, 0x42, 0x1d, 0xeb, 0x64, 0xa5, 0x4d, 0xab, 0xd1,
+	0xdc, 0x8a, 0x7f, 0x58, 0x42, 0xda, 0xff, 0x66, 0xc1, 0x7c, 0xda, 0xa8, 0x36, 0x1c, 0xee, 0xa3,
+	0x77, 0xbb, 0x46, 0x56, 0xea, 0x6f, 0x64, 0xa2, 0xb5, 0x1c, 0x57, 0x28, 0xbd, 0x41, 0x89, 0x31,
+	0xaa, 0xbb, 0x30, 0xec, 0xf8, 0xb4, 0x15, 0x98, 0x1a, 0x97, 0xfa, 0x1b, 0x56, 0x5a, 0x67, 0xa3,
+	0x23, 0x74, 0x5d, 0x00, 0x62, 0x85, 0x6b, 0xbf, 0x03, 0xe3, 0x2b, 0x1d, 0xc6, 0xa8, 0xeb, 0xab,
+	0x03, 0xee, 0xeb, 0x30, 0xcc, 0x1d, 0x57, 0xeb, 0xf9, 0x6c, 0x67, 0xdb, 0x98, 0x00, 0xaf, 0x88,
+	0xc6, 0x58, 0x61, 0xd8, 0x7f, 0x96, 0x87, 0xb3, 0xc1, 0x8e, 0xa1, 0xb5, 0x65, 0xe6, 0x3b, 0x3b,
+	0xa4, 0xea, 0x73, 0x54, 0x83, 0xf1, 0x5a, 0x54, 0xec, 0x6b, 0x45, 0x9c, 0x85, 0x57, 0xa8, 0xec,
+	0x0d, 0x78, 0x1f, 0xc7, 0x50, 0xd1, 0x6d, 0xc8, 0xd7, 0x1d, 0x5f, 0x5b, 0x86, 0x17, 0xfb, 0x9b,
+	0xb9, 0x6b, 0x4e, 0x52, 0xf3, 0x94, 0x8b, 0x9a, 0x55, 0xfe, 0x9a, 0xe3, 0x63, 0x81, 0x88, 0xb6,
+	0xa1, 0xe0, 0xb4, 0x48, 0x9d, 0x66, 0x5c, 0x95, 0x75, 0xd1, 0x26, 0x89, 0x1e, 0x9a, 0x9a, 0x92,
+	0xca, 0xb1, 0x46, 0x16, 0x3c, 0xaa, 0x42, 0x63, 0x28, 0x9d, 0xdd, 0xff, 0xca, 0xa7, 0xe8, 0xce,
+	0x88, 0x87, 0xa4, 0x72, 0xac, 0x91, 0xed, 0x2f, 0x72, 0x30, 0x1d, 0xcd, 0xdf, 0x8a, 0xd7, 0x6a,
+	0x39, 0x3e, 0x5a, 0x80, 0x9c, 0x53, 0xd3, 0x0a, 0x09, 0x74, 0xc3, 0xdc, 0xfa, 0x2a, 0xce, 0x39,
+	0x35, 0xf4, 0x0c, 0x14, 0xb6, 0x19, 0x71, 0xab, 0x0d, 0xad, 0x88, 0x42, 0xe0, 0xb2, 0x2c, 0xc5,
+	0x9a, 0x8a, 0x9e, 0x80, 0xbc, 0x4f, 0xea, 0x5a, 0xff, 0x84, 0xf3, 0xb7, 0x45, 0xea, 0x58, 0x94,
+	0x0b, 0xc5, 0xc7, 0x3b, 0x52, 0x86, 0xe5, 0xca, 0x1b, 0x8a, 0xaf, 0xa2, 0x8a, 0x71, 0x40, 0x17,
+	0x1c, 0x49, 0xc7, 0x6f, 0x78, 0x6c, 0x7e, 0x38, 0xce, 0x71, 0x59, 0x96, 0x62, 0x4d, 0x15, 0x26,
+	0x4a, 0x55, 0xf6, 0xdf, 0xa7, 0x6c, 0xbe, 0x10, 0x37, 0x51, 0x56, 0x02, 0x02, 0x8e, 0xea, 0xa0,
+	0xf7, 0xa0, 0x58, 0x65, 0x94, 0xf8, 0x1e, 0x5b, 0x25, 0x3e, 0x9d, 0x1f, 0xc9, 0xbc, 0x03, 0xa7,
+	0x84, 0x95, 0xbe, 0x12, 0x41, 0x60, 0x13, 0xcf, 0xfe, 0xbb, 0x3c, 0xcc, 0x47, 0x53, 0x2b, 0xd7,
+	0x36, 0xb2, 0x4c, 0xf5, 0xf4, 0x58, 0x3d, 0xa6, 0xe7, 0x19, 0x28, 0xd4, 0x9c, 0x3a, 0xe5, 0x7e,
+	0x72, 0x96, 0x57, 0x65, 0x29, 0xd6, 0x54, 0xf4, 0x07, 0x09, 0x6f, 0x64, 0x58, 0x6e, 0x94, 0x1b,
+	0xfd, 0x6d, 0x94, 0x5e, 0x9d, 0x1b, 0xc0, 0x25, 0x41, 0xe7, 0x01, 0xea, 0x8e, 0xaf, 0x0f, 0x2d,
+	0xbd, 0xea, 0xa1, 0xb2, 0xbe, 0x16, 0x52, 0xb0, 0x51, 0x0b, 0xdd, 0x86, 0x31, 0x39, 0x5f, 0x03,
+	0xca, 0xbf, 0x34, 0x61, 0x56, 0x02, 0x00, 0x1c, 0x61, 0x1d, 0xdb, 0xc9, 0x79, 0x07, 0xd0, 0xda,
+	0xbd, 0x36, 0xa3, 0x5c, 0x1c, 0xdd, 0xb7, 0x08, 0x73, 0xc8, 0x76, 0x93, 0x9e, 0x94, 0x1f, 0xfb,
+	0xd9, 0x10, 0x8c, 0x5c, 0x65, 0xd4, 0xa9, 0x37, 0xfc, 0x87, 0x70, 0x24, 0x3e, 0x05, 0xc3, 0xa4,
+	0xe9, 0x10, 0x2e, 0x77, 0xb7, 0xd1, 0xa5, 0x65, 0x51, 0x88, 0x15, 0x0d, 0xbd, 0x03, 0x05, 0x8f,
+	0x39, 0x75, 0xc7, 0x9d, 0x1f, 0x93, 0x9d, 0x78, 0xb9, 0xbf, 0xfd, 0xa3, 0x47, 0x71, 0x43, 0x36,
+	0x8d, 0xb6, 0xa8, 0xfa, 0x8f, 0x35, 0x24, 0xba, 0x03, 0x23, 0x4a, 0xe4, 0x02, 0x35, 0xb6, 0xd4,
+	0xb7, 0x1a, 0x56, 0x52, 0x1b, 0xa9, 0x06, 0xf5, 0x9f, 0xe3, 0x00, 0x10, 0x55, 0x42, 0x2d, 0x3c,
+	0x24, 0xa1, 0x9f, 0xcf, 0xa0, 0x85, 0x7b, 0xaa, 0xdd, 0x4a, 0xa8, 0x76, 0x87, 0xb3, 0x80, 0x4a,
+	0xc5, 0xda, 0x4b, 0xcf, 0x8a, 0x29, 0xd6, 0xe6, 0x7e, 0x61, 0x80, 0x29, 0xd6, 0xbe, 0xc6, 0x64,
+	0xdc, 0x47, 0x08, 0xbc, 0x01, 0xfb, 0x7b, 0x79, 0x98, 0xd1, 0x35, 0x57, 0xbc, 0x66, 0x93, 0x56,
+	0xa5, 0x6d, 0xa9, 0xb4, 0x78, 0x3e, 0x55, 0x8b, 0x3b, 0x81, 0x4d, 0xa1, 0x4e, 0xc6, 0x72, 0xa6,
+	0xde, 0x44, 0x3c, 0x4a, 0xd2, 0x8e, 0x50, 0x3a, 0x22, 0x5c, 0x25, 0x5d, 0x4b, 0x5b, 0x17, 0xe8,
+	0x3b, 0x16, 0x9c, 0xdd, 0xa3, 0xcc, 0xd9, 0x71, 0xaa, 0x52, 0x1e, 0xaf, 0x3b, 0xdc, 0xf7, 0xd8,
+	0xbe, 0x3e, 0x37, 0x5f, 0xed, 0x8f, 0xf3, 0x2d, 0x03, 0x60, 0xdd, 0xdd, 0xf1, 0xca, 0x5f, 0xd5,
+	0xdc, 0xce, 0xde, 0xea, 0x86, 0xc6, 0x69, 0xfc, 0x16, 0xda, 0x00, 0x51, 0x6f, 0x53, 0xd4, 0xc1,
+	0x86, 0x29, 0xbc, 0x7d, 0x77, 0x2c, 0x18, 0x6c, 0xa0, 0x3b, 0x4d, 0x35, 0xf2, 0x89, 0x05, 0x45,
+	0x4d, 0x7f, 0x08, 0x66, 0x22, 0x8e, 0x9b, 0x89, 0x2f, 0x66, 0xea, 0x7f, 0x0f, 0xcb, 0x90, 0xc1,
+	0x44, 0x4c, 0xc8, 0xd1, 0x05, 0x1d, 0x2e, 0x51, 0x3a, 0xf0, 0x17, 0xcd, 0x70, 0xc9, 0xfd, 0x83,
+	0xc5, 0x99, 0x58, 0xe5, 0x28, 0x86, 0x72, 0xb4, 0xef, 0x72, 0x69, 0xf4, 0xfb, 0x7f, 0xb9, 0x78,
+	0xe6, 0xc3, 0x9f, 0x3e, 0x79, 0xc6, 0xfe, 0x38, 0x0f, 0xd3, 0xc9, 0x59, 0xed, 0x43, 0xf7, 0x46,
+	0x3a, 0x6c, 0xf4, 0x54, 0x75, 0x58, 0xee, 0xf4, 0x74, 0x58, 0xfe, 0x34, 0x74, 0xd8, 0xd0, 0x89,
+	0xe9, 0x30, 0xfb, 0x9f, 0x2d, 0x98, 0x0c, 0x57, 0xe6, 0xfd, 0x8e, 0xb0, 0x3f, 0xa2, 0x59, 0xb7,
+	0x4e, 0x7e, 0xd6, 0xef, 0xc2, 0x08, 0xf7, 0x3a, 0xac, 0x2a, 0x8d, 0x6c, 0x81, 0xfe, 0x4a, 0x36,
+	0xa5, 0xa9, 0xda, 0x1a, 0x96, 0xa5, 0x2a, 0xc0, 0x01, 0xaa, 0xfd, 0x49, 0x2e, 0x1c, 0x90, 0xa6,
+	0x29, 0xc3, 0x8b, 0x09, 0xb3, 0x54, 0x0c, 0x68, 0xd4, 0x34, 0xbc, 0x44, 0x29, 0xd6, 0x54, 0x64,
+	0x4b, 0x7d, 0x1e, 0xd8, 0xff, 0x63, 0x65, 0xd0, 0x6a, 0x59, 0x2e, 0x82, 0xa2, 0xa0, 0x36, 0x4c,
+	0x33, 0xfa, 0x7e, 0xc7, 0x61, 0xb4, 0x56, 0xf1, 0xc8, 0xae, 0x30, 0x5a, 0x74, 0x90, 0xab, 0x4f,
+	0xb9, 0x5f, 0xed, 0x30, 0xa9, 0xc2, 0xca, 0xb3, 0xc2, 0x77, 0xc7, 0x09, 0x2c, 0xdc, 0x85, 0x8e,
+	0x3c, 0x98, 0x25, 0x7b, 0xc4, 0x69, 0x92, 0x6d, 0xa7, 0xe9, 0xf8, 0xfb, 0x15, 0x9f, 0x11, 0x9f,
+	0xd6, 0xf7, 0xb5, 0x89, 0x7d, 0x59, 0x8f, 0x65, 0x76, 0x39, 0xa5, 0xce, 0xfd, 0x83, 0xc5, 0xaf,
+	0xea, 0xb9, 0x48, 0x23, 0xe3, 0x54, 0x60, 0xfb, 0x27, 0x23, 0xa1, 0x86, 0xd0, 0x71, 0xad, 0x6f,
+	0x43, 0xb1, 0xaa, 0x9c, 0xc9, 0xe6, 0xfe, 0xba, 0xab, 0xf7, 0xf4, 0xea, 0x00, 0xa7, 0x5d, 0x69,
+	0x25, 0x82, 0x49, 0x58, 0xa1, 0x06, 0x05, 0x9b, 0xdc, 0xd0, 0x07, 0x00, 0x4a, 0xf5, 0xd3, 0xda,
+	0xba, 0xab, 0xcf, 0xb6, 0x95, 0x41, 0x78, 0xdf, 0x0a, 0x51, 0x14, 0xeb, 0xd0, 0xc8, 0x8a, 0x08,
+	0xd8, 0x60, 0x25, 0x46, 0x1d, 0x44, 0x71, 0xaf, 0x7a, 0x4c, 0x2b, 0x89, 0x81, 0x46, 0xbd, 0x1c,
+	0xc1, 0x24, 0x6d, 0xef, 0x88, 0x82, 0x4d, 0x6e, 0xc8, 0x33, 0xce, 0x15, 0x25, 0xee, 0xcb, 0x83,
+	0x70, 0x0e, 0x32, 0x12, 0x8a, 0x6d, 0x78, 0xd4, 0x04, 0xc5, 0xd1, 0x51, 0xb3, 0xc0, 0x60, 0x3a,
+	0xb9, 0x38, 0x29, 0x07, 0xea, 0xf5, 0xf8, 0x81, 0x7a, 0xbe, 0x4f, 0x15, 0x64, 0x44, 0x22, 0xcc,
+	0xc4, 0x05, 0x83, 0xa9, 0xc4, 0xa2, 0xa4, 0xb0, 0x5c, 0x8f, 0xb3, 0x7c, 0x39, 0x8b, 0x71, 0xa1,
+	0xc3, 0xfb, 0x26, 0x4f, 0x0e, 0xd3, 0xc9, 0xe5, 0x38, 0x31, 0xa6, 0xb1, 0x9c, 0x82, 0xc9, 0xf4,
+	0xdb, 0x30, 0x11, 0x5b, 0x89, 0x14, 0x8e, 0x5b, 0x71, 0x8e, 0x57, 0x0c, 0x6d, 0x12, 0x25, 0x10,
+	0xef, 0x86, 0x19, 0xc6, 0x48, 0xb1, 0xc4, 0x2a, 0x08, 0x0d, 0xf3, 0x66, 0xe5, 0xc6, 0x5b, 0xa6,
+	0xc9, 0xf2, 0xe7, 0x39, 0x18, 0x0b, 0x0f, 0xad, 0x2c, 0xd1, 0x49, 0x65, 0x6c, 0xe6, 0x8e, 0x08,
+	0x19, 0xe4, 0xfb, 0x09, 0x19, 0x0c, 0xf5, 0x0e, 0x19, 0x04, 0x19, 0x8c, 0xc2, 0x83, 0x33, 0x18,
+	0x46, 0xc8, 0x60, 0xa4, 0xff, 0x90, 0xc1, 0xe8, 0xd1, 0x21, 0x03, 0xfb, 0xaf, 0x2c, 0x40, 0xdd,
+	0xf1, 0xa1, 0x2c, 0x13, 0x45, 0x92, 0xa6, 0xc4, 0xab, 0x59, 0x9d, 0xf5, 0xa3, 0x2c, 0x0a, 0x9b,
+	0xc1, 0xdc, 0x35, 0xc7, 0xbf, 0xde, 0xd9, 0xbe, 0x4d, 0xb7, 0x1b, 0x9e, 0xb7, 0x8b, 0x69, 0x95,
+	0x3a, 0x7b, 0x94, 0xa1, 0xb7, 0x61, 0x8c, 0xd3, 0x2a, 0xa3, 0xc2, 0xb0, 0xd2, 0x07, 0xf6, 0xb3,
+	0xc6, 0xde, 0x29, 0x55, 0x3d, 0x46, 0xa5, 0xbd, 0xe9, 0x55, 0x49, 0x53, 0xb9, 0x93, 0xa1, 0x09,
+	0x16, 0x4d, 0x4c, 0x25, 0x80, 0xc0, 0x11, 0x9a, 0xfd, 0x9d, 0x02, 0x4c, 0x5d, 0x73, 0x06, 0x0e,
+	0x6e, 0xfb, 0xf0, 0xb8, 0xea, 0x7d, 0x85, 0x6a, 0xd7, 0x22, 0x3c, 0xbb, 0xd4, 0x9e, 0xba, 0xa4,
+	0x9b, 0x3e, 0xbe, 0x92, 0x5e, 0xed, 0x7e, 0x6f, 0x12, 0xee, 0x05, 0xdd, 0xf7, 0xc6, 0xbc, 0x0c,
+	0x13, 0xdc, 0x67, 0x4e, 0xd5, 0x57, 0xe1, 0x73, 0x3e, 0x5f, 0x94, 0xb6, 0xc1, 0x9c, 0xae, 0x3e,
+	0x51, 0x31, 0x89, 0x38, 0x5e, 0x37, 0x35, 0x2a, 0x3f, 0x94, 0x39, 0x2a, 0xbf, 0x04, 0x63, 0xa4,
+	0xd9, 0xf4, 0x3e, 0xd8, 0x22, 0x75, 0xae, 0xe3, 0x60, 0xe1, 0x82, 0x2c, 0x07, 0x04, 0x1c, 0xd5,
+	0x41, 0x25, 0x00, 0xa7, 0xee, 0x7a, 0x8c, 0xca, 0x16, 0x05, 0x69, 0xa4, 0xc8, 0xcc, 0xe3, 0x7a,
+	0x58, 0x8a, 0x8d, 0x1a, 0xa2, 0x9b, 0x34, 0x8c, 0x79, 0x5c, 0x75, 0x9a, 0x42, 0x22, 0xc6, 0xe3,
+	0xdd, 0x5c, 0x4b, 0xd0, 0x71, 0x57, 0x0b, 0x54, 0x81, 0x39, 0xc7, 0xe5, 0xb4, 0xda, 0x61, 0xb4,
+	0xb2, 0xeb, 0xb4, 0xb7, 0x36, 0x2a, 0x52, 0xb9, 0xee, 0x4b, 0x39, 0x1c, 0x2d, 0x3f, 0xa1, 0xa1,
+	0xe6, 0xd6, 0xd3, 0x2a, 0xe1, 0xf4, 0xb6, 0xe8, 0x15, 0x18, 0x77, 0xdc, 0x6a, 0xb3, 0x53, 0xa3,
+	0x9b, 0xc4, 0x6f, 0xf0, 0xf9, 0x51, 0x39, 0x98, 0xe9, 0xc3, 0x83, 0xc5, 0xf1, 0x75, 0xa3, 0x1c,
+	0xc7, 0x6a, 0x89, 0x56, 0xf4, 0x9e, 0xd1, 0x6a, 0x2c, 0x6a, 0xb5, 0x76, 0xcf, 0x6c, 0x65, 0xd6,
+	0x4a, 0xc9, 0x7e, 0x40, 0xa6, 0xec, 0xc7, 0x0f, 0x73, 0x50, 0x50, 0xc9, 0x47, 0x74, 0x21, 0x91,
+	0xe1, 0x7b, 0xa2, 0x2b, 0xc3, 0x57, 0x4c, 0x4b, 0xd4, 0xda, 0x50, 0x70, 0x38, 0xef, 0xc4, 0x2d,
+	0xcb, 0x75, 0x59, 0x82, 0x35, 0x45, 0x46, 0x86, 0x3d, 0x77, 0xc7, 0xa9, 0xeb, 0xb0, 0xd9, 0x31,
+	0x4f, 0x00, 0xc5, 0x63, 0x45, 0x22, 0x62, 0x8d, 0x2c, 0x78, 0x78, 0x1d, 0xbf, 0xdd, 0xf1, 0xe5,
+	0x76, 0x3b, 0x21, 0x1e, 0x37, 0x24, 0x22, 0xd6, 0xc8, 0xf6, 0xc7, 0x16, 0x4c, 0xa9, 0x39, 0x58,
+	0x69, 0xd0, 0xea, 0x6e, 0xc5, 0xa7, 0x6d, 0xe1, 0xea, 0x75, 0x38, 0xe5, 0x49, 0x57, 0xef, 0x26,
+	0xa7, 0x1c, 0x4b, 0x8a, 0x31, 0xfa, 0xdc, 0x69, 0x8d, 0xde, 0xbe, 0x08, 0xc6, 0xe2, 0xc8, 0xec,
+	0xb9, 0x4a, 0x22, 0xab, 0x73, 0x38, 0x1f, 0xa9, 0x32, 0x55, 0x6b, 0x1f, 0x07, 0x74, 0xfb, 0x30,
+	0x07, 0xc3, 0xd2, 0x1b, 0xcb, 0xa2, 0xff, 0xe2, 0xe1, 0xd3, 0x5c, 0x5f, 0xe1, 0xd3, 0x23, 0x22,
+	0xec, 0x51, 0x08, 0x79, 0xe8, 0x81, 0x21, 0x64, 0x9e, 0x16, 0x41, 0x7e, 0x23, 0x83, 0x13, 0x3a,
+	0xc8, 0x0d, 0x96, 0xe3, 0x46, 0x68, 0x7f, 0x66, 0xc1, 0x6c, 0x5a, 0x2e, 0x25, 0xcb, 0x9c, 0xbf,
+	0x00, 0xa3, 0xed, 0x26, 0xf1, 0x77, 0x3c, 0xd6, 0x4a, 0xe6, 0xd0, 0x37, 0x75, 0x39, 0x0e, 0x6b,
+	0x20, 0x06, 0xc0, 0x82, 0xb3, 0x30, 0x70, 0xd5, 0xaf, 0x1c, 0x2f, 0xce, 0x1e, 0xad, 0x70, 0x58,
+	0xc4, 0xb1, 0xc1, 0xc5, 0xfe, 0xc3, 0x61, 0x98, 0x91, 0x4d, 0x06, 0x3d, 0x56, 0x07, 0xd9, 0x56,
+	0x6d, 0x78, 0x4c, 0x06, 0x11, 0xba, 0x4f, 0x62, 0xb5, 0xd3, 0x2e, 0xea, 0xf6, 0x8f, 0xad, 0xa7,
+	0xd6, 0xba, 0xdf, 0x93, 0x82, 0x7b, 0xe0, 0x76, 0x1f, 0xaf, 0xf0, 0xf3, 0x77, 0xbc, 0x9a, 0x9b,
+	0x6d, 0xe4, 0xc8, 0xcd, 0xd6, 0xf3, 0x18, 0x1d, 0x3d, 0xc6, 0x31, 0xda, 0x7d, 0xb4, 0x8d, 0x65,
+	0x3a, 0xda, 0xfe, 0x22, 0x07, 0x23, 0x9b, 0xcc, 0x93, 0x39, 0xb9, 0xd3, 0x4f, 0x5c, 0xdc, 0x1c,
+	0x30, 0x97, 0x2f, 0xa0, 0x94, 0x2e, 0x97, 0xb9, 0xfc, 0xd1, 0x78, 0x1e, 0xdf, 0x88, 0xc3, 0xe7,
+	0xb3, 0x78, 0x6b, 0x1a, 0xf8, 0x88, 0x38, 0xfc, 0xdf, 0xe6, 0x60, 0x22, 0xd6, 0x85, 0x47, 0xf8,
+	0xce, 0x43, 0x62, 0x9e, 0x52, 0xee, 0x3c, 0x20, 0x92, 0x98, 0xab, 0xd7, 0x07, 0x01, 0x7f, 0xf0,
+	0x8c, 0xfd, 0x93, 0x05, 0x33, 0xb1, 0xfa, 0x0f, 0x21, 0x50, 0xfe, 0xcd, 0x78, 0xa0, 0xfc, 0xe5,
+	0x01, 0x46, 0xd5, 0x23, 0x5c, 0xfe, 0xdd, 0x5c, 0x62, 0x34, 0x62, 0x32, 0xd1, 0x6f, 0xc1, 0x4c,
+	0x3b, 0xb8, 0x85, 0xb1, 0xe9, 0x35, 0x9d, 0xaa, 0x43, 0x83, 0xbc, 0xcb, 0x85, 0x8c, 0x57, 0x54,
+	0x64, 0xf3, 0xfd, 0xf2, 0x57, 0x34, 0xf7, 0x99, 0xcd, 0x24, 0x2e, 0xee, 0x66, 0x85, 0x38, 0x8c,
+	0x31, 0xed, 0x01, 0x06, 0x63, 0xee, 0xf3, 0x92, 0x5d, 0xc2, 0x7f, 0xd4, 0x63, 0x0f, 0xf5, 0x6a,
+	0x82, 0x2c, 0x6f, 0x91, 0xe9, 0x9f, 0xf6, 0x7f, 0x5a, 0x70, 0x36, 0x65, 0x23, 0xa0, 0x2a, 0x40,
+	0xd5, 0x73, 0x6b, 0x8e, 0x32, 0x36, 0x2c, 0x1d, 0x4c, 0xef, 0x6b, 0x71, 0x57, 0x82, 0x76, 0x91,
+	0x44, 0x84, 0x45, 0x1c, 0x1b, 0xb0, 0xa8, 0xd5, 0x3d, 0xe2, 0x0b, 0x03, 0x8d, 0xb8, 0xbf, 0xb1,
+	0x7e, 0x62, 0x41, 0x51, 0x8f, 0xf5, 0x91, 0xcd, 0xf3, 0xe8, 0xfe, 0xf5, 0xd8, 0xb8, 0x9f, 0x5b,
+	0x30, 0x6e, 0xa8, 0x38, 0x8e, 0x1a, 0x00, 0x1f, 0x10, 0x46, 0x1b, 0x5e, 0x68, 0x8a, 0xf7, 0x1d,
+	0x7d, 0xbf, 0x1d, 0xb4, 0x93, 0x48, 0xd1, 0x5a, 0x85, 0xe5, 0x1c, 0x1b, 0xd8, 0xe8, 0x9b, 0x46,
+	0x20, 0x5d, 0xe9, 0xc7, 0xbe, 0xb8, 0xc8, 0xb0, 0x99, 0xe2, 0x60, 0xea, 0x16, 0x23, 0xfc, 0x6e,
+	0xff, 0xc8, 0x0a, 0xb5, 0x71, 0xea, 0xe6, 0xcb, 0x9f, 0xce, 0xe6, 0xab, 0xc0, 0xb0, 0x50, 0x6e,
+	0xc1, 0xd5, 0xd2, 0xf3, 0x99, 0x0f, 0x18, 0xae, 0x6f, 0x51, 0x89, 0x9f, 0x58, 0x61, 0xd9, 0x3f,
+	0xc8, 0xc1, 0x58, 0x28, 0xec, 0x0f, 0xfd, 0xf4, 0x7d, 0x39, 0xa3, 0x9a, 0xea, 0x79, 0xa2, 0xbc,
+	0x97, 0x38, 0x51, 0xb2, 0xea, 0xbf, 0x23, 0x4e, 0x93, 0x7f, 0x50, 0x2b, 0xae, 0xea, 0x3e, 0x04,
+	0x51, 0xdc, 0x8a, 0x8b, 0xe2, 0x52, 0xc6, 0xd1, 0xf4, 0x10, 0xc6, 0x0f, 0x73, 0x30, 0x95, 0xd0,
+	0xf8, 0xe8, 0x29, 0xb9, 0xa9, 0xea, 0x41, 0x02, 0x34, 0x6c, 0xa8, 0xa3, 0xc7, 0x92, 0x86, 0xf6,
+	0x84, 0x1d, 0x1d, 0x5a, 0xd8, 0x1e, 0xd3, 0x93, 0xfc, 0xb5, 0x81, 0x0e, 0x99, 0x00, 0xa4, 0x3c,
+	0xa3, 0x4c, 0x70, 0x03, 0x17, 0xc7, 0xd9, 0xa0, 0x4d, 0x98, 0x25, 0x1d, 0xdf, 0x0b, 0x01, 0xd6,
+	0x5c, 0xb2, 0xdd, 0xa4, 0x2a, 0x1a, 0x3c, 0x5a, 0xfe, 0x85, 0x30, 0xeb, 0x94, 0x52, 0x07, 0xa7,
+	0xb6, 0xb4, 0xff, 0xda, 0x82, 0xc7, 0x7b, 0xf4, 0xa7, 0x8f, 0x54, 0x70, 0x13, 0x26, 0xe4, 0x63,
+	0x8d, 0x70, 0x1e, 0x82, 0x5d, 0xdc, 0xdf, 0xca, 0x9b, 0x4d, 0xd5, 0xe8, 0x63, 0x45, 0x38, 0x0e,
+	0x6e, 0xff, 0x38, 0x07, 0x28, 0xec, 0x6b, 0x96, 0x8c, 0xf5, 0x7b, 0x30, 0xb2, 0xa3, 0x12, 0x30,
+	0xc7, 0xbb, 0x72, 0x50, 0x2e, 0x9a, 0xb7, 0x2e, 0x02, 0x4c, 0xf4, 0xf6, 0xc9, 0xc8, 0x1a, 0x74,
+	0xcb, 0x19, 0xba, 0x03, 0xb0, 0xe3, 0xb8, 0x0e, 0x6f, 0x0c, 0x78, 0x73, 0x4b, 0x3a, 0x4a, 0x57,
+	0x43, 0x04, 0x6c, 0xa0, 0xd9, 0x7f, 0x92, 0x33, 0x64, 0x58, 0xda, 0x4f, 0x7d, 0xed, 0xfd, 0xe7,
+	0xe2, 0x93, 0x39, 0xd6, 0x7d, 0x1d, 0x25, 0x9c, 0x98, 0x3b, 0x30, 0xb4, 0x47, 0x58, 0x90, 0x19,
+	0xef, 0xf3, 0x52, 0x68, 0xf7, 0x7d, 0xb0, 0x68, 0x4d, 0x6f, 0x11, 0xc6, 0xb1, 0xc4, 0x14, 0xb6,
+	0x25, 0xf7, 0x69, 0x3b, 0x38, 0x5c, 0x32, 0x2b, 0x4e, 0x9f, 0xb6, 0xcd, 0x01, 0xd2, 0xb6, 0x3c,
+	0x01, 0x68, 0x9b, 0xdb, 0xdf, 0x1b, 0x31, 0xb4, 0x82, 0x3e, 0xcf, 0xde, 0x04, 0xd4, 0x24, 0xdc,
+	0xbf, 0x4e, 0xdc, 0x9a, 0x90, 0x25, 0xba, 0xc3, 0x28, 0x6f, 0x68, 0xef, 0x77, 0x41, 0xa3, 0xa0,
+	0x8d, 0xae, 0x1a, 0x38, 0xa5, 0x15, 0xba, 0x10, 0x3c, 0xb6, 0x51, 0xb3, 0xbc, 0x18, 0x7b, 0x6c,
+	0x73, 0xff, 0x60, 0x71, 0x32, 0x92, 0x47, 0xe3, 0xf9, 0x4d, 0x86, 0x67, 0x25, 0xe6, 0x7e, 0x1f,
+	0x3e, 0x85, 0xfd, 0xfe, 0x9b, 0x30, 0xb3, 0x93, 0xbc, 0x9f, 0xa4, 0xef, 0x74, 0xbe, 0x36, 0xe0,
+	0xf5, 0xa6, 0xf2, 0xdc, 0x61, 0x74, 0xa9, 0x25, 0x2a, 0xc6, 0xdd, 0x8c, 0x90, 0x17, 0x3c, 0x66,
+	0x91, 0x81, 0x4c, 0x15, 0xa3, 0xee, 0x5b, 0xe6, 0x12, 0x21, 0xd0, 0xe4, 0x33, 0x16, 0x05, 0x89,
+	0x63, 0x0c, 0x12, 0x32, 0x58, 0x38, 0x49, 0x19, 0x44, 0x17, 0xc2, 0x1c, 0xbe, 0xe8, 0x8e, 0x0c,
+	0x13, 0xe4, 0xbb, 0xb2, 0xef, 0x82, 0x84, 0xcd, 0x7a, 0xe8, 0x23, 0x0b, 0xe6, 0xc4, 0x66, 0x5d,
+	0xbb, 0x47, 0xab, 0x1d, 0x31, 0x2b, 0x41, 0x1e, 0x73, 0xbe, 0x98, 0xc5, 0xeb, 0xa8, 0xa4, 0x41,
+	0x44, 0x31, 0x8f, 0x54, 0x32, 0x4e, 0x67, 0x8c, 0xee, 0x2a, 0x63, 0x8c, 0xca, 0x90, 0xd2, 0xf1,
+	0x23, 0xc5, 0xa1, 0x61, 0xa6, 0xf4, 0x8e, 0x4f, 0xed, 0x1f, 0x0c, 0x99, 0xea, 0xaa, 0xbf, 0xf8,
+	0xf5, 0x1d, 0x18, 0xf2, 0x09, 0xdf, 0xd5, 0x52, 0xf0, 0xc6, 0x00, 0xcf, 0x14, 0x22, 0x59, 0x90,
+	0xf1, 0x0d, 0x59, 0x24, 0x31, 0xd1, 0x02, 0xe4, 0x08, 0x4f, 0xe6, 0x61, 0x97, 0x39, 0xce, 0x11,
+	0x2e, 0x73, 0xb4, 0x3b, 0x3a, 0xfa, 0x14, 0xe5, 0x68, 0x77, 0x70, 0xce, 0xd9, 0x41, 0xcb, 0x30,
+	0x55, 0xf5, 0x5c, 0xdf, 0x71, 0x3b, 0xf4, 0x86, 0xbb, 0xc6, 0x98, 0xc7, 0x74, 0xac, 0xe9, 0x71,
+	0x5d, 0x71, 0x6a, 0x25, 0x4e, 0xc6, 0xc9, 0xfa, 0xe8, 0x6d, 0x18, 0x66, 0xd4, 0x67, 0xfb, 0xfa,
+	0x40, 0xb8, 0x38, 0x80, 0xee, 0xc3, 0xa2, 0xbd, 0x9a, 0x65, 0xf9, 0x13, 0x2b, 0xc4, 0x50, 0x65,
+	0x17, 0x4e, 0x41, 0x65, 0x47, 0xd9, 0x84, 0xfc, 0xa9, 0x65, 0x13, 0x7e, 0x68, 0x19, 0x36, 0x42,
+	0x38, 0x50, 0x74, 0x13, 0x46, 0x7c, 0xa7, 0x45, 0xbd, 0x8e, 0x9f, 0xcd, 0x38, 0x0d, 0xef, 0x05,
+	0x49, 0x4d, 0xb8, 0xa5, 0x20, 0x70, 0x80, 0x85, 0xae, 0xc0, 0x24, 0x15, 0x2b, 0xb2, 0xd5, 0x10,
+	0x9a, 0xdd, 0x6b, 0x2a, 0x4b, 0x6c, 0x22, 0x0a, 0xf4, 0xad, 0xc5, 0xa8, 0x38, 0x51, 0xdb, 0xfe,
+	0xb1, 0x69, 0x46, 0xff, 0xff, 0x7f, 0xba, 0xa3, 0x63, 0x4c, 0x0f, 0xf5, 0xcd, 0xce, 0xc0, 0x31,
+	0xa6, 0x23, 0x1f, 0xeb, 0xbc, 0x0b, 0x8f, 0xa5, 0xab, 0x82, 0x13, 0x79, 0xec, 0xfa, 0xa3, 0xe4,
+	0x5c, 0x49, 0x0b, 0x2c, 0x10, 0x3f, 0xeb, 0x34, 0x2d, 0xa6, 0xdc, 0x49, 0x5b, 0x4c, 0xcc, 0x1c,
+	0x8a, 0x7e, 0x1a, 0x8c, 0xde, 0xd3, 0xfb, 0xcc, 0xca, 0xf2, 0xd8, 0xb4, 0x0b, 0xa6, 0xe7, 0x5e,
+	0xfb, 0x89, 0x05, 0x73, 0xa9, 0xb5, 0xc3, 0x39, 0xcc, 0x9d, 0xe6, 0x1c, 0x5a, 0x27, 0x3d, 0x87,
+	0xdf, 0xcf, 0xc1, 0x34, 0xa6, 0x6d, 0x2f, 0x96, 0x80, 0xda, 0x0c, 0x1e, 0x55, 0x65, 0x70, 0x2b,
+	0x12, 0x77, 0x43, 0xca, 0x23, 0xb1, 0xd7, 0x54, 0x42, 0x5c, 0x5a, 0x81, 0x0d, 0xd9, 0xb7, 0xf8,
+	0x77, 0xa5, 0xc6, 0xd4, 0xc9, 0xa1, 0x92, 0x6c, 0x0a, 0x50, 0x20, 0xcb, 0xdb, 0xab, 0x5a, 0xb9,
+	0xbf, 0x96, 0xe1, 0x1e, 0x6c, 0x37, 0xb2, 0x2c, 0xc6, 0x0a, 0xd0, 0xfe, 0x38, 0x07, 0xca, 0x05,
+	0x79, 0x08, 0xda, 0xf1, 0xd7, 0x62, 0xda, 0x71, 0x29, 0x4b, 0x88, 0xac, 0x57, 0x28, 0x26, 0xe9,
+	0x1e, 0xbe, 0x94, 0x31, 0xee, 0xf6, 0x80, 0x30, 0xcc, 0xdf, 0x5b, 0x30, 0x26, 0xeb, 0x3d, 0x04,
+	0x45, 0xbb, 0x19, 0x57, 0xb4, 0xcf, 0x67, 0x18, 0x45, 0x0f, 0x05, 0xfb, 0x5f, 0x79, 0xdd, 0xfb,
+	0xd0, 0xf9, 0x6c, 0x10, 0x56, 0xd3, 0x5e, 0x55, 0x24, 0x25, 0xa2, 0x10, 0x2b, 0x5a, 0x28, 0xdb,
+	0x23, 0xa7, 0x20, 0xdb, 0xbf, 0xa1, 0x2e, 0x11, 0x53, 0xee, 0xd3, 0xda, 0xd5, 0xd0, 0x7d, 0xca,
+	0x67, 0xbe, 0x0d, 0xad, 0x6f, 0x6c, 0x47, 0x11, 0x6d, 0x9c, 0x40, 0xc5, 0x5d, 0x7c, 0x84, 0x4b,
+	0xd5, 0x4e, 0x2a, 0x33, 0xed, 0x6a, 0xbc, 0x36, 0xa0, 0xe6, 0x54, 0x2e, 0x55, 0x57, 0x31, 0xee,
+	0x66, 0x84, 0x1a, 0x30, 0x6e, 0xbe, 0xe3, 0xd0, 0xfb, 0xf4, 0x7c, 0xf6, 0x07, 0x23, 0xea, 0xd2,
+	0x8f, 0x59, 0x82, 0x63, 0xc8, 0xf6, 0x1f, 0x59, 0x00, 0x51, 0x40, 0x59, 0xac, 0x79, 0xd5, 0xeb,
+	0xb8, 0x2a, 0x92, 0x90, 0x8f, 0xd6, 0x7c, 0x45, 0x14, 0x62, 0x45, 0x13, 0xf2, 0xa3, 0xfc, 0x31,
+	0xbd, 0xa9, 0x5f, 0xca, 0xe2, 0xea, 0x25, 0x02, 0xd7, 0xaa, 0x10, 0x6b, 0x40, 0xfb, 0xc3, 0x02,
+	0x14, 0x0d, 0x39, 0x4b, 0x84, 0xad, 0x27, 0x4e, 0x27, 0x6c, 0x9d, 0x1e, 0x4b, 0x28, 0x0e, 0x14,
+	0x4b, 0xe0, 0x30, 0xa9, 0x3d, 0xe4, 0xe0, 0xb1, 0x8f, 0x8a, 0xb5, 0x0c, 0xec, 0x87, 0x23, 0x61,
+	0xb5, 0x5e, 0x8d, 0x41, 0xe2, 0x04, 0x0b, 0x61, 0xf5, 0xea, 0x92, 0x4a, 0xa7, 0xd5, 0x22, 0x6c,
+	0x5f, 0x5f, 0x5f, 0x0b, 0xad, 0xde, 0xab, 0x31, 0x2a, 0x4e, 0xd4, 0x46, 0x9b, 0xe1, 0x82, 0xaa,
+	0x07, 0x24, 0x2f, 0x64, 0x59, 0x50, 0x65, 0xf5, 0xc7, 0xd7, 0x51, 0x4c, 0xa9, 0xb7, 0x2d, 0x9d,
+	0x86, 0xda, 0x35, 0xf5, 0xa9, 0x1c, 0xb1, 0x8d, 0x0b, 0x72, 0x53, 0x85, 0x53, 0x7a, 0xa3, 0xab,
+	0x06, 0x4e, 0x69, 0x25, 0xd4, 0x80, 0x76, 0xb5, 0x43, 0xd9, 0xd1, 0xc1, 0x8d, 0xac, 0x7e, 0x56,
+	0xe4, 0x3b, 0xca, 0x57, 0x05, 0x2b, 0x09, 0x54, 0xdc, 0xc5, 0x07, 0xbd, 0x0f, 0x13, 0x62, 0x91,
+	0x23, 0xc6, 0x70, 0x4c, 0xc6, 0x3a, 0xa8, 0x6a, 0x40, 0xe2, 0x38, 0x07, 0xfb, 0xf3, 0x3c, 0xa4,
+	0x3b, 0xfa, 0xd1, 0x83, 0x46, 0xeb, 0x01, 0x0f, 0x1a, 0x6f, 0xc3, 0x18, 0xf7, 0x09, 0x53, 0x2f,
+	0x4b, 0x73, 0x83, 0xbd, 0x2c, 0xad, 0x04, 0x00, 0x38, 0xc2, 0x4a, 0x44, 0x5d, 0xf2, 0x27, 0x1a,
+	0x75, 0x39, 0x0f, 0x20, 0x1d, 0x31, 0xa9, 0x66, 0xe4, 0x79, 0x33, 0x11, 0x49, 0xed, 0x5a, 0x48,
+	0xc1, 0x46, 0x2d, 0xf4, 0xb5, 0xf0, 0x14, 0x57, 0x97, 0x56, 0x7e, 0xa9, 0xeb, 0x8e, 0xe1, 0xd9,
+	0x98, 0x99, 0x97, 0x08, 0xe4, 0x66, 0xb8, 0x52, 0x9d, 0x12, 0x20, 0x18, 0xc9, 0x16, 0x20, 0xb0,
+	0xff, 0x27, 0x07, 0x31, 0x2d, 0x8c, 0xbe, 0x6b, 0xc1, 0x0c, 0x49, 0x7c, 0xbc, 0x27, 0x30, 0x62,
+	0x7f, 0x35, 0xdb, 0x17, 0x95, 0xba, 0xbe, 0xfd, 0x13, 0x25, 0xc9, 0x93, 0x55, 0x38, 0xee, 0x66,
+	0x8a, 0x7e, 0xdf, 0x82, 0xb3, 0xa4, 0xfb, 0xeb, 0x4c, 0x7a, 0xf3, 0xbc, 0x3e, 0xf0, 0xe7, 0x9d,
+	0xca, 0x8f, 0x1f, 0x1e, 0x2c, 0xa6, 0x7d, 0xb7, 0x0a, 0xa7, 0xb1, 0x43, 0xef, 0xc0, 0x10, 0x61,
+	0xf5, 0x20, 0x7c, 0x9c, 0x9d, 0x6d, 0xf0, 0xd1, 0xad, 0xc8, 0x94, 0x58, 0x66, 0x75, 0x8e, 0x25,
+	0xa8, 0xfd, 0xd3, 0x3c, 0x4c, 0x27, 0x1f, 0x52, 0xea, 0x8b, 0xfb, 0x43, 0xa9, 0x17, 0xf7, 0x85,
+	0xac, 0xc9, 0x04, 0x4a, 0xf2, 0xf1, 0xb0, 0xcc, 0x83, 0x28, 0x5a, 0x28, 0x6b, 0xf2, 0x79, 0xd3,
+	0xf0, 0x31, 0x64, 0x4d, 0xbe, 0x69, 0x8a, 0xb0, 0xd0, 0xc5, 0x78, 0x44, 0xda, 0x4e, 0x46, 0xa4,
+	0x67, 0xcc, 0xb1, 0x0c, 0x1a, 0x94, 0x6e, 0x41, 0xd1, 0x58, 0x07, 0x2d, 0xd1, 0x97, 0x32, 0xcf,
+	0x7b, 0xb4, 0xed, 0xa6, 0xd4, 0xbd, 0xc7, 0x88, 0x62, 0xe2, 0x47, 0xfa, 0x43, 0xce, 0xd6, 0xb1,
+	0xa2, 0xb6, 0x72, 0xba, 0x0c, 0x34, 0xfb, 0x5f, 0x2d, 0x98, 0x88, 0x3d, 0x65, 0x11, 0xdc, 0x82,
+	0x37, 0x4a, 0x83, 0x7f, 0xa9, 0xea, 0x56, 0x88, 0x80, 0x0d, 0x34, 0xf4, 0x2d, 0x28, 0x36, 0x3d,
+	0xb7, 0x4e, 0xb9, 0x5f, 0xf1, 0xc8, 0xae, 0x96, 0x93, 0xac, 0xf1, 0xab, 0xf9, 0xc3, 0x83, 0xc5,
+	0xd9, 0x0d, 0x05, 0xb3, 0xe2, 0xb5, 0xda, 0x4d, 0xea, 0xab, 0xd7, 0x6c, 0xd8, 0x04, 0x97, 0xd9,
+	0xef, 0xf0, 0xfa, 0xc0, 0xa3, 0x9a, 0xfd, 0x8e, 0xee, 0x3d, 0x9c, 0x70, 0xf6, 0x3b, 0x76, 0xa1,
+	0xe2, 0x88, 0xec, 0x77, 0x58, 0xf7, 0x91, 0xcd, 0x7e, 0x87, 0x3d, 0xec, 0xe1, 0x7e, 0xfd, 0x77,
+	0xce, 0x18, 0x45, 0xdc, 0x05, 0xcb, 0x3d, 0xc0, 0x05, 0x7b, 0x17, 0x46, 0x1d, 0xd7, 0xa7, 0x6c,
+	0x8f, 0x34, 0x75, 0xfc, 0x39, 0xeb, 0x5e, 0x0c, 0x87, 0xba, 0xae, 0x71, 0x70, 0x88, 0x88, 0x9a,
+	0x30, 0x17, 0xa4, 0x7c, 0x18, 0x25, 0x51, 0x52, 0x5a, 0x5f, 0x89, 0x7d, 0x35, 0xc8, 0x4d, 0x5c,
+	0x4d, 0xab, 0x74, 0xbf, 0x17, 0x01, 0xa7, 0x83, 0x22, 0x0e, 0x13, 0xdc, 0x88, 0x3d, 0x04, 0x27,
+	0x62, 0x9f, 0xe9, 0xb2, 0x64, 0xb8, 0xc6, 0xb8, 0x47, 0x6b, 0x82, 0xe2, 0x38, 0x0f, 0xfb, 0x23,
+	0x0b, 0x26, 0xe3, 0x57, 0x77, 0xfe, 0xcf, 0xfd, 0xa0, 0xcf, 0xf3, 0x30, 0x95, 0xd8, 0xfc, 0x09,
+	0x5f, 0x68, 0xec, 0x61, 0xfa, 0x42, 0x85, 0x81, 0x7c, 0xa1, 0x74, 0x27, 0x60, 0x68, 0x20, 0x27,
+	0xe0, 0xb2, 0x32, 0xc4, 0xf5, 0x66, 0x5a, 0x5f, 0xd5, 0x4f, 0xd6, 0xc2, 0x05, 0xde, 0x30, 0x89,
+	0x38, 0x5e, 0x57, 0x5a, 0x38, 0xb5, 0xee, 0x0f, 0x31, 0x69, 0x2f, 0xe2, 0xf5, 0xac, 0x57, 0xd9,
+	0x43, 0x00, 0x65, 0xe1, 0xa4, 0x10, 0x70, 0x1a, 0x3b, 0xdb, 0x87, 0xa9, 0xe4, 0xb3, 0xb4, 0xbe,
+	0x02, 0xd7, 0x6d, 0xe2, 0x07, 0xcf, 0xb4, 0xc2, 0x1a, 0x9b, 0xc4, 0x6f, 0x60, 0x49, 0x41, 0x4f,
+	0x40, 0xbe, 0xc3, 0x9a, 0xc9, 0xb7, 0x83, 0x37, 0xf1, 0x06, 0x16, 0xe5, 0xf6, 0x9f, 0x5a, 0x30,
+	0x97, 0x7a, 0x9b, 0xb1, 0x0f, 0xe6, 0x77, 0xa1, 0xa0, 0xe6, 0x46, 0x9f, 0x07, 0x97, 0xfb, 0x8e,
+	0x78, 0x76, 0x3f, 0xc1, 0x53, 0x7e, 0xa2, 0x22, 0x61, 0x0d, 0x5b, 0x7e, 0xf3, 0xd3, 0x2f, 0xcf,
+	0x9d, 0xf9, 0xec, 0xcb, 0x73, 0x67, 0xbe, 0xf8, 0xf2, 0xdc, 0x99, 0x0f, 0x0f, 0xcf, 0x59, 0x9f,
+	0x1e, 0x9e, 0xb3, 0x3e, 0x3b, 0x3c, 0x67, 0x7d, 0x71, 0x78, 0xce, 0xfa, 0xf7, 0xc3, 0x73, 0xd6,
+	0x47, 0x3f, 0x3b, 0x77, 0xe6, 0xce, 0xd3, 0xfd, 0x7c, 0xf5, 0xf6, 0x7f, 0x03, 0x00, 0x00, 0xff,
+	0xff, 0x22, 0xdb, 0xde, 0x81, 0x1c, 0x57, 0x00, 0x00,
 }
 
 func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) {
@@ -4102,6 +4103,11 @@ func (m *GitSubscription) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	i -= len(m.ExpressionFilter)
+	copy(dAtA[i:], m.ExpressionFilter)
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.ExpressionFilter)))
+	i--
+	dAtA[i] = 0x62
 	i--
 	if m.StrictSemvers {
 		dAtA[i] = 1
@@ -7304,6 +7310,8 @@ func (m *GitSubscription) Size() (n int) {
 	}
 	n += 1 + sovGenerated(uint64(m.DiscoveryLimit))
 	n += 2
+	l = len(m.ExpressionFilter)
+	n += 1 + l + sovGenerated(uint64(l))
 	return n
 }
 
@@ -8728,6 +8736,7 @@ func (this *GitSubscription) String() string {
 		`ExcludePaths:` + fmt.Sprintf("%v", this.ExcludePaths) + `,`,
 		`DiscoveryLimit:` + fmt.Sprintf("%v", this.DiscoveryLimit) + `,`,
 		`StrictSemvers:` + fmt.Sprintf("%v", this.StrictSemvers) + `,`,
+		`ExpressionFilter:` + fmt.Sprintf("%v", this.ExpressionFilter) + `,`,
 		`}`,
 	}, "")
 	return s
@@ -15007,6 +15016,38 @@ func (m *GitSubscription) Unmarshal(dAtA []byte) error {
 				}
 			}
 			m.StrictSemvers = bool(v != 0)
+		case 12:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ExpressionFilter", 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 < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.ExpressionFilter = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipGenerated(dAtA[iNdEx:])
diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto
index 53bc6007..de9f3fe9 100644
--- a/api/v1alpha1/generated.proto
+++ b/api/v1alpha1/generated.proto
@@ -579,7 +579,7 @@ message GitSubscription {
   //   by the Branch field or the default branch if none is specified. This is
   //   the default strategy.
   //
-  // - "SemVer": Selects the commit referenced by the the semantically greatest
+  // - "SemVer": Selects the commit referenced by the semantically greatest
   //   tag. The SemverConstraint field can optionally be used to narrow the set
   //   of tags eligible for selection.
   //
@@ -647,6 +647,53 @@ message GitSubscription {
   // +kubebuilder:validation:Optional
   repeated string ignoreTags = 6;
 
+  // ExpressionFilter is an expression that can optionally be used to limit
+  // the commits or tags that are considered in determining the newest commit
+  // of interest based on their metadata.
+  //
+  // For commit-based strategies (NewestFromBranch), the filter applies to
+  // commits and has access to commit metadata variables.
+  // For tag-based strategies (Lexical, NewestTag, SemVer), the filter applies
+  // to tags and has access to tag metadata variables. The filter is applied
+  // after AllowTags, IgnoreTags, and SemverConstraint fields.
+  //
+  // The expression should be a valid expr-lang expression that evaluates to
+  // true or false. When the expression evaluates to true, the commit/tag is
+  // included in the set that is considered. When the expression evaluates to
+  // false, the commit/tag is excluded.
+  //
+  // Available variables depend on the CommitSelectionStrategy:
+  //
+  // For NewestFromBranch (commit filtering):
+  //   - `id`: The ID (sha) of the commit.
+  //   - `commitDate`: The commit date of the commit.
+  //   - `author`: The author of the commit message, in the format "Name <email>".
+  //   - `committer`: The person who committed the commit, in the format
+  // 	   "Name <email>".
+  //   - `subject`: The subject (first line) of the commit message.
+  //
+  // For Lexical, NewestTag, SemVer (tag filtering):
+  //   - `tag`: The name of the tag.
+  //   - `id`: The ID (sha) of the commit associated with the tag.
+  //   - `creatorDate`: The creation date of an annotated tag, or the commit
+  // 		date of a lightweight tag.
+  //   - `author`: The author of the commit message associated with the tag,
+  // 	   in the format "Name <email>".
+  //   - `committer`: The person who committed the commit associated with the
+  // 	   tag, in the format "Name <email>".
+  //   - `subject`: The subject (first line) of the commit message associated
+  // 	   with the tag.
+  // 	 - `tagger`: The person who created the tag, in the format "Name <email>".
+  // 	   Only available for annotated tags.
+  // 	 - `annotation`: The subject (first line) of the tag annotation. Only
+  // 	   available for annotated tags.
+  //
+  // Refer to the expr-lang documentation for more details on syntax and
+  // capabilities of the expression language: https://expr-lang.org.
+  //
+  // +kubebuilder:validation:Optional
+  optional string expressionFilter = 12;
+
   // InsecureSkipTLSVerify specifies whether certificate verification errors
   // should be ignored when connecting to the repository. This should be enabled
   // only with great caution.
diff --git a/api/v1alpha1/warehouse_types.go b/api/v1alpha1/warehouse_types.go
index 6075273b..c95f6a82 100644
--- a/api/v1alpha1/warehouse_types.go
+++ b/api/v1alpha1/warehouse_types.go
@@ -126,7 +126,7 @@ type GitSubscription struct {
 	//   by the Branch field or the default branch if none is specified. This is
 	//   the default strategy.
 	//
-	// - "SemVer": Selects the commit referenced by the the semantically greatest
+	// - "SemVer": Selects the commit referenced by the semantically greatest
 	//   tag. The SemverConstraint field can optionally be used to narrow the set
 	//   of tags eligible for selection.
 	//
@@ -188,6 +188,52 @@ type GitSubscription struct {
 	//
 	// +kubebuilder:validation:Optional
 	IgnoreTags []string `json:"ignoreTags,omitempty" protobuf:"bytes,6,rep,name=ignoreTags"`
+	// ExpressionFilter is an expression that can optionally be used to limit
+	// the commits or tags that are considered in determining the newest commit
+	// of interest based on their metadata.
+	//
+	// For commit-based strategies (NewestFromBranch), the filter applies to
+	// commits and has access to commit metadata variables.
+	// For tag-based strategies (Lexical, NewestTag, SemVer), the filter applies
+	// to tags and has access to tag metadata variables. The filter is applied
+	// after AllowTags, IgnoreTags, and SemverConstraint fields.
+	//
+	// The expression should be a valid expr-lang expression that evaluates to
+	// true or false. When the expression evaluates to true, the commit/tag is
+	// included in the set that is considered. When the expression evaluates to
+	// false, the commit/tag is excluded.
+	//
+	// Available variables depend on the CommitSelectionStrategy:
+	//
+	// For NewestFromBranch (commit filtering):
+	//   - `id`: The ID (sha) of the commit.
+	//   - `commitDate`: The commit date of the commit.
+	//   - `author`: The author of the commit message, in the format "Name <email>".
+	//   - `committer`: The person who committed the commit, in the format
+	//	   "Name <email>".
+	//   - `subject`: The subject (first line) of the commit message.
+	//
+	// For Lexical, NewestTag, SemVer (tag filtering):
+	//   - `tag`: The name of the tag.
+	//   - `id`: The ID (sha) of the commit associated with the tag.
+	//   - `creatorDate`: The creation date of an annotated tag, or the commit
+	//		date of a lightweight tag.
+	//   - `author`: The author of the commit message associated with the tag,
+	//	   in the format "Name <email>".
+	//   - `committer`: The person who committed the commit associated with the
+	//	   tag, in the format "Name <email>".
+	//   - `subject`: The subject (first line) of the commit message associated
+	//	   with the tag.
+	//	 - `tagger`: The person who created the tag, in the format "Name <email>".
+	//	   Only available for annotated tags.
+	//	 - `annotation`: The subject (first line) of the tag annotation. Only
+	//	   available for annotated tags.
+	//
+	// Refer to the expr-lang documentation for more details on syntax and
+	// capabilities of the expression language: https://expr-lang.org.
+	//
+	// +kubebuilder:validation:Optional
+	ExpressionFilter string `json:"expressionFilter,omitempty" protobuf:"bytes,12,opt,name=expressionFilter"`
 	// InsecureSkipTLSVerify specifies whether certificate verification errors
 	// should be ignored when connecting to the repository. This should be enabled
 	// only with great caution.
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_warehouses.yaml b/charts/kargo/resources/crds/kargo.akuity.io_warehouses.yaml
index 10669fe9..939d3220 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_warehouses.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_warehouses.yaml
@@ -175,7 +175,7 @@ spec:
                               by the Branch field or the default branch if none is specified. This is
                               the default strategy.
 
-                            - "SemVer": Selects the commit referenced by the the semantically greatest
+                            - "SemVer": Selects the commit referenced by the semantically greatest
                               tag. The SemverConstraint field can optionally be used to narrow the set
                               of tags eligible for selection.
 
@@ -223,6 +223,45 @@ spec:
                           items:
                             type: string
                           type: array
+                        expressionFilter:
+                          description: "ExpressionFilter is an expression that can
+                            optionally be used to limit\nthe commits or tags that
+                            are considered in determining the newest commit\nof interest
+                            based on their metadata.\n\nFor commit-based strategies
+                            (NewestFromBranch), the filter applies to\ncommits and
+                            has access to commit metadata variables.\nFor tag-based
+                            strategies (Lexical, NewestTag, SemVer), the filter applies\nto
+                            tags and has access to tag metadata variables. The filter
+                            is applied\nafter AllowTags, IgnoreTags, and SemverConstraint
+                            fields.\n\nThe expression should be a valid expr-lang
+                            expression that evaluates to\ntrue or false. When the
+                            expression evaluates to true, the commit/tag is\nincluded
+                            in the set that is considered. When the expression evaluates
+                            to\nfalse, the commit/tag is excluded.\n\nAvailable variables
+                            depend on the CommitSelectionStrategy:\n\nFor NewestFromBranch
+                            (commit filtering):\n  - `id`: The ID (sha) of the commit.\n
+                            \ - `commitDate`: The commit date of the commit.\n  -
+                            `author`: The author of the commit message, in the format
+                            \"Name <email>\".\n  - `committer`: The person who committed
+                            the commit, in the format\n\t   \"Name <email>\".\n  -
+                            `subject`: The subject (first line) of the commit message.\n\nFor
+                            Lexical, NewestTag, SemVer (tag filtering):\n  - `tag`:
+                            The name of the tag.\n  - `id`: The ID (sha) of the commit
+                            associated with the tag.\n  - `creatorDate`: The creation
+                            date of an annotated tag, or the commit\n\t\tdate of a
+                            lightweight tag.\n  - `author`: The author of the commit
+                            message associated with the tag,\n\t   in the format \"Name
+                            <email>\".\n  - `committer`: The person who committed
+                            the commit associated with the\n\t   tag, in the format
+                            \"Name <email>\".\n  - `subject`: The subject (first line)
+                            of the commit message associated\n\t   with the tag.\n\t
+                            - `tagger`: The person who created the tag, in the format
+                            \"Name <email>\".\n\t   Only available for annotated tags.\n\t
+                            - `annotation`: The subject (first line) of the tag annotation.
+                            Only\n\t   available for annotated tags.\n\nRefer to the
+                            expr-lang documentation for more details on syntax and\ncapabilities
+                            of the expression language: https://expr-lang.org."
+                          type: string
                         ignoreTags:
                           description: |-
                             IgnoreTags is a list of tags that must be ignored when determining the
diff --git a/docs/docs/50-user-guide/20-how-to-guides/30-working-with-warehouses.md b/docs/docs/50-user-guide/20-how-to-guides/30-working-with-warehouses.md
index 44d01b21..974c284b 100644
--- a/docs/docs/50-user-guide/20-how-to-guides/30-working-with-warehouses.md
+++ b/docs/docs/50-user-guide/20-how-to-guides/30-working-with-warehouses.md
@@ -19,7 +19,7 @@ _as a unit_.
 
 :::info
 For a broader, conceptual understanding of warehouses and their relation
-to other Kargo concepts, refer to 
+to other Kargo concepts, refer to
 [Core Concepts](./../10-core-concepts/index.md).
 :::
 
@@ -215,12 +215,16 @@ Git repository subscriptions can be defined using the following fields:
   the desired commit. (See next section.)
 
 - `allowTags`: An optional regular expression that limits the eligibility for
-  selection to commits with tags that match the pattern. (This is not applicable
-  to selection strategies that do not involve tags.)
+  selection to tags that match the pattern. (This is not applicable to selection
+  strategies that do not involve tags.)
 
 - `ignoreTags`: An optional list of tags that should explicitly be ignored.
   (This is not applicable to selection strategies that do not involve tags.)
 
+- `expressionFilter`: An optional expression that filters commits and tags based 
+  on their metadata. See [Expression Filtering](#expression-filtering) for 
+  details.
+
 - `includePaths`: See
   [Git Subscription Path Filtering](#git-subscription-path-filtering).
 
@@ -344,6 +348,165 @@ strategies are:
           allowTags: ^nightly
     ```
 
+#### Expression Filtering
+
+Git repository subscriptions support advanced filtering using expressions. These
+expressions allow you to filter commits and tags based on their metadata using
+[expr-lang](https://expr-lang.org) syntax.
+
+:::info
+The expressions must evaluate to a boolean value (`true` or `false`). If an
+expression evaluates to a non-boolean value, an attempt will be made to
+convert it to a boolean (e.g., `0` to `false`, `1` to `true`).
+:::
+
+:::warning
+Invalid expressions will cause the subscription to fail. Always test your
+expressions to ensure they evaluate correctly with your repository's data.
+:::
+
+:::tip
+You can test your expressions using the
+[expr-lang playground](https://expr-lang.org/playground).
+
+The playground allows you to evaluate expressions against sample data and
+see the results in real-time. This is especially useful for debugging and
+validating your expressions before applying them to your `Warehouse` resources.
+:::
+
+The `expressionFilter` field provides a unified way to filter commits or tags
+based on the selected commit selection strategy. The behavior and available
+variables depend on your `commitSelectionStrategy`:
+
+**For commit-based filtering** (`NewestFromBranch` strategy):
+
+- Filters commits based on commit metadata
+- Applied when selecting the newest commit from a branch
+
+**For tag-based filtering** (`SemVer`, `Lexical`, and `NewestTag` strategies):
+
+- Filters tags based on tag and associated commit metadata
+- Applied after `allowTags`, `ignoreTags`, and `semverConstraint` fields
+
+##### Available Expression Filtering Variables
+
+The variables available in your expression depend on the commit selection
+strategy:
+
+**For `NewestFromBranch` (commit filtering):**
+
+- `id`: The ID (SHA) of the commit
+- `commitDate`: The date of the commit
+- `author`: The author of the commit, in format `Name <email>`
+- `committer`: The committer of the commit, in format `Name <email>`
+- `subject`: The first line of the commit message
+
+**For `SemVer`, `Lexical`, and `NewestTag` (tag filtering):**
+
+- `tag`: The name of the tag
+- `id`: The commit ID that the tag references
+- `creatorDate`: The tag creation date (annotated tag) or commit date
+  (lightweight tag)
+- `author`: The author of the commit that the tag references, in the format of
+  `Name <email>`
+- `committer`: The committer of the commit that the tag references, in the
+  format of `Name <email>`
+- `subject`: The first line of the commit message associated with the tag
+- `tagger`: The tagger of the tag, in the format of `Name <email>`. Only
+  available for annotated tags.
+- `annotation`: The first line of the tag annotation. Only available for
+  annotated tags.
+
+##### Expression Filtering Examples
+
+**Filtering commits by excluding bot authors:**
+
+```yaml
+spec:
+  subscriptions:
+  - git:
+      repoURL: https://github.com/example/repo.git
+      commitSelectionStrategy: NewestFromBranch
+      expressionFilter: !(author contains '<bot@example.com>')
+```
+
+**Filtering commits with specific message patterns:**
+
+```yaml
+spec:
+  subscriptions:
+  - git:
+      repoURL: https://github.com/example/repo.git
+      commitSelectionStrategy: NewestFromBranch
+      expressionFilter: subject contains 'feat:' || subject contains 'fix:'
+```
+
+**Filtering commits with multiple criteria:**
+
+```yaml
+spec:
+  subscriptions:
+  - git:
+      repoURL: https://github.com/example/repo.git
+      commitSelectionStrategy: NewestFromBranch
+      expressionFilter: !(author == 'Example Bot') && commitDate.After(date('2025-01-01'))
+```
+
+**Filtering commits to exclude those with ignore markers:**
+
+```yaml
+spec:
+  subscriptions:
+  - git:
+      repoURL: https://github.com/example/repo.git
+      commitSelectionStrategy: NewestFromBranch
+      expressionFilter: !(subject contains '[kargo-ignore]')
+```
+
+**Filtering tags by author name:**
+
+```yaml
+spec:
+  subscriptions:
+  - git:
+      repoURL: https://github.com/example/repo.git
+      commitSelectionStrategy: SemVer
+      expressionFilter: author == 'John Doe <john@example.com>'
+```
+
+**Filtering tags created after a specific date:**
+
+```yaml
+spec:
+  subscriptions:
+  - git:
+      repoURL: https://github.com/example/repo.git
+      commitSelectionStrategy: NewestTag
+      expressionFilter: creatorDate.Year() >= 2024
+```
+
+**Filtering tags to exclude those committed by bots:**
+
+```yaml
+spec:
+  subscriptions:
+  - git:
+      repoURL: https://github.com/example/repo.git
+      commitSelectionStrategy: Lexical
+      expressionFilter: !(committer contains '<bot@example.com>')
+```
+
+**Filtering tags with complex conditions:**
+
+```yaml
+spec:
+  subscriptions:
+  - git:
+      repoURL: https://github.com/example/repo.git
+      commitSelectionStrategy: SemVer
+      expressionFilter: creatorDate.After(date('2024-01-01')) && !(tag contains 'alpha')
+```
+
 #### Git Subscription Path Filtering
 
 In some cases, it may be necessary to constrain the paths within a Git
@@ -480,7 +643,7 @@ Helm chart repository subscriptions can be defined using the following fields:
   _single_ chart version; rather it selects the n best fits for the specified
   constraints. The _best_ fit is the zero element in the list of selected
   charts. `discoveryLimit` specifies how many chart versions to discover.
-  
+
   The default is `20`.
 
   Example:
diff --git a/internal/controller/git/client_opts.go b/internal/controller/git/client_opts.go
deleted file mode 100644
index cd99cdbe..00000000
--- a/internal/controller/git/client_opts.go
+++ /dev/null
@@ -1 +0,0 @@
-package git
diff --git a/internal/controller/git/work_tree.go b/internal/controller/git/work_tree.go
index 6d1dce89..a1317096 100644
--- a/internal/controller/git/work_tree.go
+++ b/internal/controller/git/work_tree.go
@@ -460,6 +460,11 @@ type TagMetadata struct {
 	// Subject is the subject (first line) of the commit message associated
 	// with the tag.
 	Subject string
+	// Tagger is the person who created the tag, in the format "Name <email>".
+	// This field is only populated for annotated tags.
+	Tagger string
+	// Annotation is the annotation of the tag, if it is an annotated tag.
+	Annotation string
 }
 
 func (w *workTree) ListTags() ([]TagMetadata, error) {
@@ -478,13 +483,17 @@ func (w *workTree) ListTags() ([]TagMetadata, error) {
 	// - committer name and email
 	// - creator date
 	//
+	// For annotated tags, we also output the following fields:
+	// - tagger name and email
+	// - tag annotation (the first line of the tag message)
+	//
 	// The `if`/`then`/`else` logic is used to ensure that we get the commit ID
 	// and subject of the tag, regardless of whether it's an annotated or
 	// lightweight tag.
 	//
 	// nolint: lll
 	const (
-		formatAnnotatedTag   = `%(refname:short)|*|%(*objectname)|*|%(*contents:subject)|*|%(*authorname) %(*authoremail)|*|%(*committername) %(*committeremail)|*|%(*creatordate:iso8601)`
+		formatAnnotatedTag   = `%(refname:short)|*|%(*objectname)|*|%(*contents:subject)|*|%(*authorname) %(*authoremail)|*|%(*committername) %(*committeremail)|*|%(creatordate:iso8601)|*|%(taggername) %(taggeremail)|*|%(contents:subject)`
 		formatLightweightTag = `%(refname:short)|*|%(objectname)|*|%(contents:subject)|*|%(authorname) %(authoremail)|*|%(committername) %(committeremail)|*|%(creatordate:iso8601)`
 		tagFormat            = `%(if)%(*objectname)%(then)` + formatAnnotatedTag + `%(else)` + formatLightweightTag + `%(end)`
 	)
@@ -504,7 +513,7 @@ func (w *workTree) ListTags() ([]TagMetadata, error) {
 	for scanner.Scan() {
 		line := scanner.Bytes()
 		parts := bytes.SplitN(scanner.Bytes(), []byte("|*|"), 6)
-		if len(parts) != 6 {
+		if len(parts) != 6 && len(parts) != 8 {
 			return nil, fmt.Errorf("unexpected number of fields: %q", line)
 		}
 
@@ -513,14 +522,23 @@ func (w *workTree) ListTags() ([]TagMetadata, error) {
 			return nil, fmt.Errorf("error parsing creator date %q: %w", parts[5], err)
 		}
 
-		tags = append(tags, TagMetadata{
+		tag := TagMetadata{
 			Tag:         string(parts[0]),
 			CommitID:    string(parts[1]),
 			Subject:     string(parts[2]),
 			Author:      string(parts[3]),
 			Committer:   string(parts[4]),
 			CreatorDate: creatorDate,
-		})
+		}
+
+		if len(parts) == 8 {
+			// This is an annotated tag, so we also have the tagger and tag
+			// annotation.
+			tag.Tagger = string(parts[6])
+			tag.Annotation = string(parts[7])
+		}
+
+		tags = append(tags, tag)
 	}
 
 	return tags, nil
diff --git a/internal/controller/warehouses/git.go b/internal/controller/warehouses/git.go
index c0554d74..cca86c18 100644
--- a/internal/controller/warehouses/git.go
+++ b/internal/controller/warehouses/git.go
@@ -5,10 +5,13 @@ import (
 	"fmt"
 	"regexp"
 	"slices"
+	"strconv"
 	"strings"
 	"time"
 
 	"github.com/Masterminds/semver/v3"
+	"github.com/expr-lang/expr"
+	"github.com/expr-lang/expr/vm"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	kargoapi "github.com/akuity/kargo/api/v1alpha1"
@@ -197,6 +200,26 @@ func (r *reconciler) discoverCommits(
 // list contains more than 20 commits, it is clipped to the 20 most recent
 // commits.
 func (r *reconciler) discoverBranchHistory(repo git.Repo, sub kargoapi.GitSubscription) ([]git.CommitMetadata, error) {
+	// Compile the commit expression filter if it is specified.
+	var exprProgram *vm.Program
+	if sub.ExpressionFilter != "" {
+		program, err := expr.Compile(sub.ExpressionFilter)
+		if err != nil {
+			return nil, fmt.Errorf("error compiling expression filter: %w", err)
+		}
+		exprProgram = program
+	}
+
+	// Compile include and exclude path selectors.
+	includeSelectors, err := getPathSelectors(sub.IncludePaths)
+	if err != nil {
+		return nil, fmt.Errorf("error parsing include selector: %w", err)
+	}
+	excludeSelectors, err := getPathSelectors(sub.ExcludePaths)
+	if err != nil {
+		return nil, fmt.Errorf("error parsing exclude selector: %w", err)
+	}
+
 	limit := int(sub.DiscoveryLimit)
 	var filteredCommits = make([]git.CommitMetadata, 0, limit)
 	for skip := uint(0); ; skip += uint(limit) { // nolint: gosec
@@ -205,41 +228,43 @@ func (r *reconciler) discoverBranchHistory(repo git.Repo, sub kargoapi.GitSubscr
 			return nil, fmt.Errorf("error listing commits from git repo %q: %w", sub.RepoURL, err)
 		}
 
-		// If no include or exclude paths are specified, return the first commits
-		// up to the limit.
-		if sub.IncludePaths == nil && sub.ExcludePaths == nil {
+		// If no filters are specified, return the first commits up to the limit.
+		if includeSelectors == nil && excludeSelectors == nil && exprProgram == nil {
 			return commits, nil
 		}
 
-		if filteredCommits == nil {
-			filteredCommits = make([]git.CommitMetadata, 0, limit)
-		}
-
-		// Compile include and exclude path selectors.
-		includeSelectors, err := getPathSelectors(sub.IncludePaths)
-		if err != nil {
-			return nil, fmt.Errorf("error parsing include selector: %w", err)
-		}
-		excludeSelectors, err := getPathSelectors(sub.ExcludePaths)
-		if err != nil {
-			return nil, fmt.Errorf("error parsing exclude selector: %w", err)
-		}
-
 		// Filter commits based on include and exclude paths.
 		for _, meta := range commits {
-			diffPaths, err := r.getDiffPathsForCommitIDFn(repo, meta.ID)
-			if err != nil {
-				return nil, fmt.Errorf(
-					"error getting diff paths for commit %q in git repo %q: %w",
-					meta.ID,
-					sub.RepoURL,
-					err,
-				)
+			// If the commit expression filter is specified, evaluate it.
+			if exprProgram != nil {
+				include, err := evaluateCommitExpression(meta, exprProgram)
+				if err != nil {
+					return nil, fmt.Errorf("error evaluating expression commit filter: %w", err)
+				}
+				if !include {
+					continue
+				}
 			}
-			if matchesPathsFilters(includeSelectors, excludeSelectors, diffPaths) {
-				filteredCommits = append(filteredCommits, meta)
+
+			// If include or exclude path selectors are specified, filter the commits.
+			if includeSelectors != nil || excludeSelectors != nil {
+				diffPaths, err := r.getDiffPathsForCommitIDFn(repo, meta.ID)
+				if err != nil {
+					return nil, fmt.Errorf(
+						"error getting diff paths for commit %q in git repo %q: %w",
+						meta.ID,
+						sub.RepoURL,
+						err,
+					)
+				}
+				if !matchesPathsFilters(includeSelectors, excludeSelectors, diffPaths) {
+					continue
+				}
 			}
 
+			// If we reach this point, the commit matches the filters.
+			filteredCommits = append(filteredCommits, meta)
+
 			if len(filteredCommits) >= limit {
 				return trimSlice(filteredCommits, limit), nil
 			}
@@ -268,6 +293,10 @@ func (r *reconciler) discoverTags(repo git.Repo, sub kargoapi.GitSubscription) (
 		return nil, fmt.Errorf("failed to filter tags: %w", err)
 	}
 
+	if tags, err = filterTagsByExpression(tags, sub.ExpressionFilter); err != nil {
+		return nil, fmt.Errorf("failed to filter tags by expression: %w", err)
+	}
+
 	switch sub.CommitSelectionStrategy {
 	case kargoapi.CommitSelectionStrategySemVer:
 		if tags, err = selectSemVerTags(tags, sub.StrictSemvers, sub.SemverConstraint); err != nil {
@@ -340,6 +369,103 @@ func filterTags(tags []git.TagMetadata, ignoreTags []string, allow string) ([]gi
 	return slices.Clip(filteredTags), nil
 }
 
+// filterTagsByExpression filters the given list of tags based on the given
+// expression. It returns the filtered list of tags. If the expression is empty,
+// it returns the original list of tags.
+//
+// The expression is evaluated using the expr package, and the tag metadata is
+// passed as the environment.
+//
+// For a tag to be included in the result, the expression must evaluate to true.
+// If the expression evaluates to a non-boolean value, it is converted to a
+// boolean using strconv.ParseBool. If the conversion fails, an error is
+// returned.
+func filterTagsByExpression(
+	tags []git.TagMetadata,
+	expression string,
+) ([]git.TagMetadata, error) {
+	if expression == "" {
+		return tags, nil
+	}
+
+	program, err := expr.Compile(expression)
+	if err != nil {
+		return nil, fmt.Errorf("error compiling tag expression filter: %w", err)
+	}
+
+	filteredTags := make([]git.TagMetadata, 0, len(tags))
+	for _, tag := range tags {
+		env := map[string]any{
+			"tag":         tag.Tag,
+			"id":          tag.CommitID,
+			"creatorDate": tag.CreatorDate,
+			"author":      tag.Author,
+			"committer":   tag.Committer,
+			"subject":     tag.Subject,
+			"tagger":      tag.Tagger,
+			"annotation":  tag.Annotation,
+		}
+
+		result, err := expr.Run(program, env)
+		if err != nil {
+			return nil, fmt.Errorf("error evaluating tag expression filter: %w", err)
+		}
+
+		switch result := result.(type) {
+		case bool:
+			if !result {
+				continue
+			}
+		default:
+			parsedBool, err := strconv.ParseBool(fmt.Sprintf("%v", result))
+			if err != nil {
+				return nil, fmt.Errorf("error parsing expression result: %w", err)
+			}
+			if !parsedBool {
+				continue
+			}
+		}
+
+		filteredTags = append(filteredTags, tag)
+	}
+	return slices.Clip(filteredTags), nil
+}
+
+// evaluateCommitExpression evaluates the given commit expression against
+// the given commit metadata. The commit metadata is passed as the environment
+// for the expression evaluation. It returns true if the expression evaluates to
+// true, and false otherwise. If the expression is not a boolean, it is
+// converted to a boolean using strconv.ParseBool. If the conversion fails,
+// an error is returned.
+func evaluateCommitExpression(
+	commit git.CommitMetadata,
+	expression *vm.Program,
+) (bool, error) {
+	env := map[string]any{
+		"id":         commit.ID,
+		"commitDate": commit.CommitDate,
+		"author":     commit.Author,
+		"committer":  commit.Committer,
+		"subject":    commit.Subject,
+	}
+
+	result, err := expr.Run(expression, env)
+	if err != nil {
+		return false, err
+	}
+
+	switch result := result.(type) {
+	case bool:
+		return result, nil
+	default:
+		parsedBool, err := strconv.ParseBool(fmt.Sprintf("%v", result))
+		if err != nil {
+			return false, err
+		}
+		return parsedBool, nil
+	}
+}
+
 // allows returns true if the given tag name matches the given regular
 // expression or if the regular expression is nil. It returns false otherwise.
 func allows(tagName string, allowRegex *regexp.Regexp) bool {
diff --git a/ui/src/gen/api/v1alpha1/generated_pb.ts b/ui/src/gen/api/v1alpha1/generated_pb.ts
index 0360accb..aaf3ab22 100644
--- a/ui/src/gen/api/v1alpha1/generated_pb.ts
+++ b/ui/src/gen/api/v1alpha1/generated_pb.ts
@@ -20,7 +20,7 @@ import type { Message } from "@bufbuild/protobuf";
  * Describes the file api/v1alpha1/generated.proto.
  */
 export const file_api_v1alpha1_generated: GenFile = /*@__PURE__*/
-  fileDesc("ChxhcGkvdjFhbHBoYTEvZ2VuZXJhdGVkLnByb3RvEiRnaXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEiMgoTQW5hbHlzaXNSdW5Bcmd1bWVudBIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIrACChNBbmFseXNpc1J1bk1ldGFkYXRhElUKBmxhYmVscxgBIAMoCzJFLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bk1ldGFkYXRhLkxhYmVsc0VudHJ5El8KC2Fubm90YXRpb25zGAIgAygLMkouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuQW5ub3RhdGlvbnNFbnRyeRotCgtMYWJlbHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJGChRBbmFseXNpc1J1blJlZmVyZW5jZRIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRINCgVwaGFzZRgDIAEoCSI3ChlBbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSDAoEa2luZBgCIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKnAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkkKBWl0ZW1zGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrIkkKDEN1cnJlbnRTdGFnZRI5CgVzaW5jZRgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIrYCChNEaXNjb3ZlcmVkQXJ0aWZhY3RzEkAKDGRpc2NvdmVyZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkUKA2dpdBgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXREaXNjb3ZlcnlSZXN1bHQSSgoGaW1hZ2VzGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlRGlzY292ZXJ5UmVzdWx0EkoKBmNoYXJ0cxgDIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydERpc2NvdmVyeVJlc3VsdCKwAQoQRGlzY292ZXJlZENvbW1pdBIKCgJpZBgBIAEoCRIOCgZicmFuY2gYAiABKAkSCwoDdGFnGAMgASgJEg8KB3N1YmplY3QYBCABKAkSDgoGYXV0aG9yGAUgASgJEhEKCWNvbW1pdHRlchgGIAEoCRI/CgtjcmVhdG9yRGF0ZRgHIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIqQCChhEaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2USCwoDdGFnGAEgASgJEg4KBmRpZ2VzdBgCIAEoCRJkCgthbm5vdGF0aW9ucxgFIAMoCzJPLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2UuQW5ub3RhdGlvbnNFbnRyeRISCgpnaXRSZXBvVVJMGAMgASgJEj0KCWNyZWF0ZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lGjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIxChJFeHByZXNzaW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyKYAQoORnJlaWdodFNvdXJjZXMSDgoGZGlyZWN0GAEgASgIEg4KBnN0YWdlcxgCIAMoCRJIChByZXF1aXJlZFNvYWtUaW1lGAMgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEhwKFGF2YWlsYWJpbGl0eVN0cmF0ZWd5GAQgASgJIp0GCg1GcmVpZ2h0U3RhdHVzElkKC2N1cnJlbnRseUluGAMgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQ3VycmVudGx5SW5FbnRyeRJXCgp2ZXJpZmllZEluGAEgAygLMkMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuVmVyaWZpZWRJbkVudHJ5ElkKC2FwcHJvdmVkRm9yGAIgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQXBwcm92ZWRGb3JFbnRyeRJTCghtZXRhZGF0YRgEIAMoCzJBLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U3RhdHVzLk1ldGFkYXRhRW50cnkaZgoQQ3VycmVudGx5SW5FbnRyeRILCgNrZXkYASABKAkSQQoFdmFsdWUYAiABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ3VycmVudFN0YWdlOgI4ARpmCg9WZXJpZmllZEluRW50cnkSCwoDa2V5GAEgASgJEkIKBXZhbHVlGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlZlcmlmaWVkU3RhZ2U6AjgBGmcKEEFwcHJvdmVkRm9yRW50cnkSCwoDa2V5GAEgASgJEkIKBXZhbHVlGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFwcHJvdmVkU3RhZ2U6AjgBGm8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEk0KBXZhbHVlGAIgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTjoCOAEieQoJR2l0Q29tbWl0Eg8KB3JlcG9VUkwYASABKAkSCgoCaWQYAiABKAkSDgoGYnJhbmNoGAMgASgJEgsKA3RhZxgEIAEoCRIPCgdtZXNzYWdlGAYgASgJEg4KBmF1dGhvchgHIAEoCRIRCgljb21taXR0ZXIYCCABKAkibgoSR2l0RGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSRwoHY29tbWl0cxgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQ29tbWl0IlQKFUdpdEh1YldlYmhvb2tSZWNlaXZlchI7CglzZWNyZXRSZWYYASABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2UijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIh4KC0hlYWx0aFN0YXRzEg8KB2hlYWx0aHkYASABKAMi0AEKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJElEKC2Fubm90YXRpb25zGAUgAygLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlLkFubm90YXRpb25zRW50cnkaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItkBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0Q29uZmlnU3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyLlAQoNUHJvamVjdENvbmZpZxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdENvbmZpZ1NwZWMSSQoGc3RhdHVzGAMgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RDb25maWdTdGF0dXMimQEKEVByb2plY3RDb25maWdMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkIKBWl0ZW1zGAIgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RDb25maWcitQEKEVByb2plY3RDb25maWdTcGVjElAKEXByb21vdGlvblBvbGljaWVzGAEgAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblBvbGljeRJOCglyZWNlaXZlcnMYAiADKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2ViaG9va1JlY2VpdmVyQ29uZmlnIqQBChNQcm9qZWN0Q29uZmlnU3RhdHVzEkMKCmNvbmRpdGlvbnMYASADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEkgKCXJlY2VpdmVycxgCIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XZWJob29rUmVjZWl2ZXIijQEKC1Byb2plY3RMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjwKBWl0ZW1zGAIgAygLMi0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3QimgEKDFByb2plY3RTdGF0cxJICgp3YXJlaG91c2VzGAEgASgLMjQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVN0YXRzEkAKBnN0YWdlcxgCIAEoCzIwLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXRzIpcBCg1Qcm9qZWN0U3RhdHVzEkMKCmNvbmRpdGlvbnMYAyADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEkEKBXN0YXRzGAQgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RTdGF0cyLZAQoJUHJvbW90aW9uEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGF0dXMikQEKDVByb21vdGlvbkxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uIpQBCg9Qcm9tb3Rpb25Qb2xpY3kSDQoFc3RhZ2UYASABKAkSVAoNc3RhZ2VTZWxlY3RvchgDIAEoCzI9LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3lTZWxlY3RvchIcChRhdXRvUHJvbW90aW9uRW5hYmxlZBgCIAEoCCJzChdQcm9tb3Rpb25Qb2xpY3lTZWxlY3RvchIMCgRuYW1lGAEgASgJEkoKDWxhYmVsU2VsZWN0b3IYAiABKAsyMy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGFiZWxTZWxlY3RvciLyAQoSUHJvbW90aW9uUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSRwoHZnJlaWdodBgCIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGF0dXMSPgoKZmluaXNoZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIrsBCg1Qcm9tb3Rpb25TcGVjEg0KBXN0YWdlGAEgASgJEg8KB2ZyZWlnaHQYAiABKAkSRgoEdmFycxgEIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5FeHByZXNzaW9uVmFyaWFibGUSQgoFc3RlcHMYAyADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCK3BAoPUHJvbW90aW9uU3RhdHVzEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgEIAEoCRINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEkcKB2ZyZWlnaHQYBSABKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFJlZmVyZW5jZRJSChFmcmVpZ2h0Q29sbGVjdGlvbhgHIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbhJLCgxoZWFsdGhDaGVja3MYCCADKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoQ2hlY2tTdGVwEj4KCmZpbmlzaGVkQXQYBiABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRITCgtjdXJyZW50U3RlcBgJIAEoAxJaChVzdGVwRXhlY3V0aW9uTWV0YWRhdGEYCyADKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEk0KBXN0YXRlGAogASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiL7AgoNUHJvbW90aW9uU3RlcBIMCgR1c2VzGAEgASgJEkoKBHRhc2sYBSABKAsyPC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1JlZmVyZW5jZRIKCgJhcxgCIAEoCRIKCgJpZhgHIAEoCRIXCg9jb250aW51ZU9uRXJyb3IYCCABKAgSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5EkYKBHZhcnMYBiADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRXhwcmVzc2lvblZhcmlhYmxlEk4KBmNvbmZpZxgDIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibQoSUHJvbW90aW9uU3RlcFJldHJ5Ej8KB3RpbWVvdXQYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SFgoOZXJyb3JUaHJlc2hvbGQYAiABKA0imgEKDVByb21vdGlvblRhc2sSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJFCgRzcGVjGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tTcGVjIpkBChFQcm9tb3Rpb25UYXNrTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRJCCgVpdGVtcxgCIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrIjQKFlByb21vdGlvblRhc2tSZWZlcmVuY2USDAoEbmFtZRgBIAEoCRIMCgRraW5kGAIgASgJIp8BChFQcm9tb3Rpb25UYXNrU3BlYxJGCgR2YXJzGAEgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkV4cHJlc3Npb25WYXJpYWJsZRJCCgVzdGVwcxgCIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIl4KEVByb21vdGlvblRlbXBsYXRlEkkKBHNwZWMYASABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGVtcGxhdGVTcGVjIqMBChVQcm9tb3Rpb25UZW1wbGF0ZVNwZWMSRgoEdmFycxgCIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5FeHByZXNzaW9uVmFyaWFibGUSQgoFc3RlcHMYASADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCLmAQoQUmVwb1N1YnNjcmlwdGlvbhJCCgNnaXQYASABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0U3Vic2NyaXB0aW9uEkYKBWltYWdlGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlU3Vic2NyaXB0aW9uEkYKBWNoYXJ0GAMgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0U3Vic2NyaXB0aW9uIs0BCgVTdGFnZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj0KBHNwZWMYAiABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTcGVjEkEKBnN0YXR1cxgDIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXR1cyKJAQoJU3RhZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjoKBWl0ZW1zGAIgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlItACCglTdGFnZVNwZWMSDQoFc2hhcmQYBCABKAkSRgoEdmFycxgHIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5FeHByZXNzaW9uVmFyaWFibGUSTgoQcmVxdWVzdGVkRnJlaWdodBgFIAMoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVxdWVzdBJSChFwcm9tb3Rpb25UZW1wbGF0ZRgGIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZRJICgx2ZXJpZmljYXRpb24YAyABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uIl4KClN0YWdlU3RhdHMSDQoFY291bnQYAiABKAMSQQoGaGVhbHRoGAEgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aFN0YXRzItYDCgtTdGFnZVN0YXR1cxJDCgpjb25kaXRpb25zGA0gAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYCyABKAkSTwoOZnJlaWdodEhpc3RvcnkYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SFgoOZnJlaWdodFN1bW1hcnkYDCABKAkSPAoGaGVhbHRoGAggASgLMiwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aBIaChJvYnNlcnZlZEdlbmVyYXRpb24YBiABKAMSUgoQY3VycmVudFByb21vdGlvbhgHIAEoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25SZWZlcmVuY2USTwoNbGFzdFByb21vdGlvbhgKIAEoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25SZWZlcmVuY2Ui8wEKFVN0ZXBFeGVjdXRpb25NZXRhZGF0YRINCgVhbGlhcxgBIAEoCRI9CglzdGFydGVkQXQYAiABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRI+CgpmaW5pc2hlZEF0GAMgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEgoKZXJyb3JDb3VudBgEIAEoDRIOCgZzdGF0dXMYBSABKAkSDwoHbWVzc2FnZRgGIAEoCRIXCg9jb250aW51ZU9uRXJyb3IYByABKAgiiwIKDFZlcmlmaWNhdGlvbhJaChFhbmFseXNpc1RlbXBsYXRlcxgBIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlElYKE2FuYWx5c2lzUnVuTWV0YWRhdGEYAiABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YRJHCgRhcmdzGAMgAygLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuQXJndW1lbnQinQIKEFZlcmlmaWNhdGlvbkluZm8SCgoCaWQYBCABKAkSDQoFYWN0b3IYByABKAkSPQoJc3RhcnRUaW1lGAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJPCgthbmFseXNpc1J1bhgDIAEoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1blJlZmVyZW5jZRI+CgpmaW5pc2hUaW1lGAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUilAEKDVZlcmlmaWVkU3RhZ2USPgoKdmVyaWZpZWRBdBgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkMKC2xvbmdlc3RTb2FrGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItkBCglXYXJlaG91c2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVN0YXR1cyKRAQoNV2FyZWhvdXNlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2UizgEKDVdhcmVob3VzZVNwZWMSDQoFc2hhcmQYAiABKAkSQAoIaW50ZXJ2YWwYBCABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SHQoVZnJlaWdodENyZWF0aW9uUG9saWN5GAMgASgJEk0KDXN1YnNjcmlwdGlvbnMYASADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUmVwb1N1YnNjcmlwdGlvbiJiCg5XYXJlaG91c2VTdGF0cxINCgVjb3VudBgCIAEoAxJBCgZoZWFsdGgYASABKAsyMS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoU3RhdHMi/QEKD1dhcmVob3VzZVN0YXR1cxJDCgpjb25kaXRpb25zGAkgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBiABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAQgASgDEhUKDWxhc3RGcmVpZ2h0SUQYCCABKAkSVgoTZGlzY292ZXJlZEFydGlmYWN0cxgHIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQXJ0aWZhY3RzIjoKD1dlYmhvb2tSZWNlaXZlchIMCgRuYW1lGAEgASgJEgwKBHBhdGgYAyABKAkSCwoDdXJsGAQgASgJInIKFVdlYmhvb2tSZWNlaXZlckNvbmZpZxIMCgRuYW1lGAEgASgJEksKBmdpdGh1YhgCIAEoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRIdWJXZWJob29rUmVjZWl2ZXJClwIKKGNvbS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTFCDkdlbmVyYXRlZFByb3RvUAFaJGdpdGh1Yi5jb20vYWt1aXR5L2thcmdvL2FwaS92MWFscGhhMaICBUdDQUtBqgIkR2l0aHViLkNvbS5Ba3VpdHkuS2FyZ28uQXBpLlYxYWxwaGExygIkR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGEx4gIwR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIpR2l0aHViOjpDb206OkFrdWl0eTo6S2FyZ286OkFwaTo6VjFhbHBoYTE", [file_k8s_io_api_core_v1_generated, file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]);
+  fileDesc("ChxhcGkvdjFhbHBoYTEvZ2VuZXJhdGVkLnByb3RvEiRnaXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEiMgoTQW5hbHlzaXNSdW5Bcmd1bWVudBIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIrACChNBbmFseXNpc1J1bk1ldGFkYXRhElUKBmxhYmVscxgBIAMoCzJFLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bk1ldGFkYXRhLkxhYmVsc0VudHJ5El8KC2Fubm90YXRpb25zGAIgAygLMkouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuQW5ub3RhdGlvbnNFbnRyeRotCgtMYWJlbHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJGChRBbmFseXNpc1J1blJlZmVyZW5jZRIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRINCgVwaGFzZRgDIAEoCSI3ChlBbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSDAoEa2luZBgCIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKnAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkkKBWl0ZW1zGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrIkkKDEN1cnJlbnRTdGFnZRI5CgVzaW5jZRgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIrYCChNEaXNjb3ZlcmVkQXJ0aWZhY3RzEkAKDGRpc2NvdmVyZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkUKA2dpdBgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXREaXNjb3ZlcnlSZXN1bHQSSgoGaW1hZ2VzGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlRGlzY292ZXJ5UmVzdWx0EkoKBmNoYXJ0cxgDIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydERpc2NvdmVyeVJlc3VsdCKwAQoQRGlzY292ZXJlZENvbW1pdBIKCgJpZBgBIAEoCRIOCgZicmFuY2gYAiABKAkSCwoDdGFnGAMgASgJEg8KB3N1YmplY3QYBCABKAkSDgoGYXV0aG9yGAUgASgJEhEKCWNvbW1pdHRlchgGIAEoCRI/CgtjcmVhdG9yRGF0ZRgHIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIqQCChhEaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2USCwoDdGFnGAEgASgJEg4KBmRpZ2VzdBgCIAEoCRJkCgthbm5vdGF0aW9ucxgFIAMoCzJPLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2UuQW5ub3RhdGlvbnNFbnRyeRISCgpnaXRSZXBvVVJMGAMgASgJEj0KCWNyZWF0ZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lGjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIxChJFeHByZXNzaW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyKYAQoORnJlaWdodFNvdXJjZXMSDgoGZGlyZWN0GAEgASgIEg4KBnN0YWdlcxgCIAMoCRJIChByZXF1aXJlZFNvYWtUaW1lGAMgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEhwKFGF2YWlsYWJpbGl0eVN0cmF0ZWd5GAQgASgJIp0GCg1GcmVpZ2h0U3RhdHVzElkKC2N1cnJlbnRseUluGAMgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQ3VycmVudGx5SW5FbnRyeRJXCgp2ZXJpZmllZEluGAEgAygLMkMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuVmVyaWZpZWRJbkVudHJ5ElkKC2FwcHJvdmVkRm9yGAIgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQXBwcm92ZWRGb3JFbnRyeRJTCghtZXRhZGF0YRgEIAMoCzJBLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U3RhdHVzLk1ldGFkYXRhRW50cnkaZgoQQ3VycmVudGx5SW5FbnRyeRILCgNrZXkYASABKAkSQQoFdmFsdWUYAiABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ3VycmVudFN0YWdlOgI4ARpmCg9WZXJpZmllZEluRW50cnkSCwoDa2V5GAEgASgJEkIKBXZhbHVlGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlZlcmlmaWVkU3RhZ2U6AjgBGmcKEEFwcHJvdmVkRm9yRW50cnkSCwoDa2V5GAEgASgJEkIKBXZhbHVlGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFwcHJvdmVkU3RhZ2U6AjgBGm8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEk0KBXZhbHVlGAIgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTjoCOAEieQoJR2l0Q29tbWl0Eg8KB3JlcG9VUkwYASABKAkSCgoCaWQYAiABKAkSDgoGYnJhbmNoGAMgASgJEgsKA3RhZxgEIAEoCRIPCgdtZXNzYWdlGAYgASgJEg4KBmF1dGhvchgHIAEoCRIRCgljb21taXR0ZXIYCCABKAkibgoSR2l0RGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSRwoHY29tbWl0cxgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQ29tbWl0IlQKFUdpdEh1YldlYmhvb2tSZWNlaXZlchI7CglzZWNyZXRSZWYYASABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2UiqAIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSGAoQZXhwcmVzc2lvbkZpbHRlchgMIAEoCRIdChVpbnNlY3VyZVNraXBUTFNWZXJpZnkYByABKAgSFAoMaW5jbHVkZVBhdGhzGAggAygJEhQKDGV4Y2x1ZGVQYXRocxgJIAMoCRIWCg5kaXNjb3ZlcnlMaW1pdBgKIAEoBSLIAQoGSGVhbHRoEg4KBnN0YXR1cxgBIAEoCRIOCgZpc3N1ZXMYAiADKAkSTgoGY29uZmlnGAQgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPThJOCgZvdXRwdXQYBSABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIm8KD0hlYWx0aENoZWNrU3RlcBIMCgR1c2VzGAEgASgJEk4KBmNvbmZpZxgCIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04iHgoLSGVhbHRoU3RhdHMSDwoHaGVhbHRoeRgBIAEoAyLQAQoFSW1hZ2USDwoHcmVwb1VSTBgBIAEoCRISCgpnaXRSZXBvVVJMGAIgASgJEgsKA3RhZxgDIAEoCRIOCgZkaWdlc3QYBCABKAkSUQoLYW5ub3RhdGlvbnMYBSADKAsyPC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2UuQW5ub3RhdGlvbnNFbnRyeRoyChBBbm5vdGF0aW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEijQEKFEltYWdlRGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSEAoIcGxhdGZvcm0YAiABKAkSUgoKcmVmZXJlbmNlcxgDIAMoCzI+LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2Ui+QEKEUltYWdlU3Vic2NyaXB0aW9uEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRIeChZpbWFnZVNlbGVjdGlvblN0cmF0ZWd5GAMgASgJEhUKDXN0cmljdFNlbXZlcnMYCiABKAgSGAoQc2VtdmVyQ29uc3RyYWludBgEIAEoCRIRCglhbGxvd1RhZ3MYBSABKAkSEgoKaWdub3JlVGFncxgGIAMoCRIQCghwbGF0Zm9ybRgHIAEoCRIdChVpbnNlY3VyZVNraXBUTFNWZXJpZnkYCCABKAgSFgoOZGlzY292ZXJ5TGltaXQYCSABKAUi2QEKB1Byb2plY3QSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJFCgRzcGVjGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RDb25maWdTcGVjEkMKBnN0YXR1cxgDIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3RhdHVzIuUBCg1Qcm9qZWN0Q29uZmlnEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0Q29uZmlnU3BlYxJJCgZzdGF0dXMYAyABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdENvbmZpZ1N0YXR1cyKZAQoRUHJvamVjdENvbmZpZ0xpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESQgoFaXRlbXMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdENvbmZpZyK1AQoRUHJvamVjdENvbmZpZ1NwZWMSUAoRcHJvbW90aW9uUG9saWNpZXMYASADKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUG9saWN5Ek4KCXJlY2VpdmVycxgCIAMoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XZWJob29rUmVjZWl2ZXJDb25maWcipAEKE1Byb2plY3RDb25maWdTdGF0dXMSQwoKY29uZGl0aW9ucxgBIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SSAoJcmVjZWl2ZXJzGAIgAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldlYmhvb2tSZWNlaXZlciKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCKaAQoMUHJvamVjdFN0YXRzEkgKCndhcmVob3VzZXMYASABKAsyNC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlU3RhdHMSQAoGc3RhZ2VzGAIgASgLMjAuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHMilwEKDVByb2plY3RTdGF0dXMSQwoKY29uZGl0aW9ucxgDIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SQQoFc3RhdHMYBCABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXRzItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24ilAEKD1Byb21vdGlvblBvbGljeRINCgVzdGFnZRgBIAEoCRJUCg1zdGFnZVNlbGVjdG9yGAMgASgLMj0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblBvbGljeVNlbGVjdG9yEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIInMKF1Byb21vdGlvblBvbGljeVNlbGVjdG9yEgwKBG5hbWUYASABKAkSSgoNbGFiZWxTZWxlY3RvchgCIAEoCzIzLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MYWJlbFNlbGVjdG9yIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiuwEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJGCgR2YXJzGAQgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkV4cHJlc3Npb25WYXJpYWJsZRJCCgVzdGVwcxgDIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIrcECg9Qcm9tb3Rpb25TdGF0dXMSGgoSbGFzdEhhbmRsZWRSZWZyZXNoGAQgASgJEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSRwoHZnJlaWdodBgFIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlElIKEWZyZWlnaHRDb2xsZWN0aW9uGAcgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uEksKDGhlYWx0aENoZWNrcxgIIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5IZWFsdGhDaGVja1N0ZXASPgoKZmluaXNoZWRBdBgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhMKC2N1cnJlbnRTdGVwGAkgASgDEloKFXN0ZXBFeGVjdXRpb25NZXRhZGF0YRgLIAMoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGVwRXhlY3V0aW9uTWV0YWRhdGESTQoFc3RhdGUYCiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIvsCCg1Qcm9tb3Rpb25TdGVwEgwKBHVzZXMYASABKAkSSgoEdGFzaxgFIAEoCzI8LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrUmVmZXJlbmNlEgoKAmFzGAIgASgJEgoKAmlmGAcgASgJEhcKD2NvbnRpbnVlT25FcnJvchgIIAEoCBJHCgVyZXRyeRgEIAEoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwUmV0cnkSRgoEdmFycxgGIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5FeHByZXNzaW9uVmFyaWFibGUSTgoGY29uZmlnGAMgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJtChJQcm9tb3Rpb25TdGVwUmV0cnkSPwoHdGltZW91dBgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIWCg5lcnJvclRocmVzaG9sZBgCIAEoDSKaAQoNUHJvbW90aW9uVGFzaxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1NwZWMimQEKEVByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkIKBWl0ZW1zGAIgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2siNAoWUHJvbW90aW9uVGFza1JlZmVyZW5jZRIMCgRuYW1lGAEgASgJEgwKBGtpbmQYAiABKAkinwEKEVByb21vdGlvblRhc2tTcGVjEkYKBHZhcnMYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRXhwcmVzc2lvblZhcmlhYmxlEkIKBXN0ZXBzGAIgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiXgoRUHJvbW90aW9uVGVtcGxhdGUSSQoEc3BlYxgBIAEoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZVNwZWMiowEKFVByb21vdGlvblRlbXBsYXRlU3BlYxJGCgR2YXJzGAIgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkV4cHJlc3Npb25WYXJpYWJsZRJCCgVzdGVwcxgBIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIuYBChBSZXBvU3Vic2NyaXB0aW9uEkIKA2dpdBgBIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRTdWJzY3JpcHRpb24SRgoFaW1hZ2UYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VTdWJzY3JpcHRpb24SRgoFY2hhcnQYAyABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnRTdWJzY3JpcHRpb24izQEKBVN0YWdlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPQoEc3BlYxgCIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVNwZWMSQQoGc3RhdHVzGAMgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHVzIokBCglTdGFnZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESOgoFaXRlbXMYAiADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2Ui0AIKCVN0YWdlU3BlYxINCgVzaGFyZBgEIAEoCRJGCgR2YXJzGAcgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkV4cHJlc3Npb25WYXJpYWJsZRJOChByZXF1ZXN0ZWRGcmVpZ2h0GAUgAygLMjQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZXF1ZXN0ElIKEXByb21vdGlvblRlbXBsYXRlGAYgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlEkgKDHZlcmlmaWNhdGlvbhgDIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb24iXgoKU3RhZ2VTdGF0cxINCgVjb3VudBgCIAEoAxJBCgZoZWFsdGgYASABKAsyMS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoU3RhdHMi1gMKC1N0YWdlU3RhdHVzEkMKCmNvbmRpdGlvbnMYDSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgLIAEoCRJPCg5mcmVpZ2h0SGlzdG9yeRgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbhIWCg5mcmVpZ2h0U3VtbWFyeRgMIAEoCRI8CgZoZWFsdGgYCCABKAsyLC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgGIAEoAxJSChBjdXJyZW50UHJvbW90aW9uGAcgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZRJPCg1sYXN0UHJvbW90aW9uGAogASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZSLzAQoVU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEg0KBWFsaWFzGAEgASgJEj0KCXN0YXJ0ZWRBdBgCIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEj4KCmZpbmlzaGVkQXQYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRISCgplcnJvckNvdW50GAQgASgNEg4KBnN0YXR1cxgFIAEoCRIPCgdtZXNzYWdlGAYgASgJEhcKD2NvbnRpbnVlT25FcnJvchgHIAEoCCKLAgoMVmVyaWZpY2F0aW9uEloKEWFuYWx5c2lzVGVtcGxhdGVzGAEgAygLMj8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USVgoTYW5hbHlzaXNSdW5NZXRhZGF0YRgCIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bk1ldGFkYXRhEkcKBGFyZ3MYAyADKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5Bcmd1bWVudCKdAgoQVmVyaWZpY2F0aW9uSW5mbxIKCgJpZBgEIAEoCRINCgVhY3RvchgHIAEoCRI9CglzdGFydFRpbWUYBSABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEk8KC2FuYWx5c2lzUnVuGAMgASgLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuUmVmZXJlbmNlEj4KCmZpbmlzaFRpbWUYBiABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKUAQoNVmVyaWZpZWRTdGFnZRI+Cgp2ZXJpZmllZEF0GAEgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSQwoLbG9uZ2VzdFNvYWsYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i2QEKCVdhcmVob3VzZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkEKBHNwZWMYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlU3BlYxJFCgZzdGF0dXMYAyABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlU3RhdHVzIpEBCg1XYXJlaG91c2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEj4KBWl0ZW1zGAIgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZSLOAQoNV2FyZWhvdXNlU3BlYxINCgVzaGFyZBgCIAEoCRJACghpbnRlcnZhbBgEIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIdChVmcmVpZ2h0Q3JlYXRpb25Qb2xpY3kYAyABKAkSTQoNc3Vic2NyaXB0aW9ucxgBIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5SZXBvU3Vic2NyaXB0aW9uImIKDldhcmVob3VzZVN0YXRzEg0KBWNvdW50GAIgASgDEkEKBmhlYWx0aBgBIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5IZWFsdGhTdGF0cyL9AQoPV2FyZWhvdXNlU3RhdHVzEkMKCmNvbmRpdGlvbnMYCSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgGIAEoCRIaChJvYnNlcnZlZEdlbmVyYXRpb24YBCABKAMSFQoNbGFzdEZyZWlnaHRJRBgIIAEoCRJWChNkaXNjb3ZlcmVkQXJ0aWZhY3RzGAcgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRBcnRpZmFjdHMiOgoPV2ViaG9va1JlY2VpdmVyEgwKBG5hbWUYASABKAkSDAoEcGF0aBgDIAEoCRILCgN1cmwYBCABKAkicgoVV2ViaG9va1JlY2VpdmVyQ29uZmlnEgwKBG5hbWUYASABKAkSSwoGZ2l0aHViGAIgASgLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdEh1YldlYmhvb2tSZWNlaXZlckKXAgooY29tLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMUIOR2VuZXJhdGVkUHJvdG9QAVokZ2l0aHViLmNvbS9ha3VpdHkva2FyZ28vYXBpL3YxYWxwaGExogIFR0NBS0GqAiRHaXRodWIuQ29tLkFrdWl0eS5LYXJnby5BcGkuVjFhbHBoYTHKAiRHaXRodWJcQ29tXEFrdWl0eVxLYXJnb1xBcGlcVjFhbHBoYTHiAjBHaXRodWJcQ29tXEFrdWl0eVxLYXJnb1xBcGlcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAilHaXRodWI6OkNvbTo6QWt1aXR5OjpLYXJnbzo6QXBpOjpWMWFscGhhMQ", [file_k8s_io_api_core_v1_generated, file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]);
 
 /**
  * AnalysisRunArgument represents an argument to be added to an AnalysisRun.
@@ -1270,7 +1270,7 @@ export type GitSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.GitS
    *   by the Branch field or the default branch if none is specified. This is
    *   the default strategy.
    *
-   * - "SemVer": Selects the commit referenced by the the semantically greatest
+   * - "SemVer": Selects the commit referenced by the semantically greatest
    *   tag. The SemverConstraint field can optionally be used to narrow the set
    *   of tags eligible for selection.
    *
@@ -1361,6 +1361,57 @@ export type GitSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.GitS
    */
   ignoreTags: string[];
 
+  /**
+   * ExpressionFilter is an expression that can optionally be used to limit
+   * the commits or tags that are considered in determining the newest commit
+   * of interest based on their metadata.
+   *
+   * For commit-based strategies (NewestFromBranch), the filter applies to
+   * commits and has access to commit metadata variables.
+   * For tag-based strategies (Lexical, NewestTag, SemVer), the filter applies
+   * to tags and has access to tag metadata variables. The filter is applied
+   * after AllowTags, IgnoreTags, and SemverConstraint fields.
+   *
+   * The expression should be a valid expr-lang expression that evaluates to
+   * true or false. When the expression evaluates to true, the commit/tag is
+   * included in the set that is considered. When the expression evaluates to
+   * false, the commit/tag is excluded.
+   *
+   * Available variables depend on the CommitSelectionStrategy:
+   *
+   * For NewestFromBranch (commit filtering):
+   *   - `id`: The ID (sha) of the commit.
+   *   - `commitDate`: The commit date of the commit.
+   *   - `author`: The author of the commit message, in the format "Name <email>".
+   *   - `committer`: The person who committed the commit, in the format
+   * 	   "Name <email>".
+   *   - `subject`: The subject (first line) of the commit message.
+   *
+   * For Lexical, NewestTag, SemVer (tag filtering):
+   *   - `tag`: The name of the tag.
+   *   - `id`: The ID (sha) of the commit associated with the tag.
+   *   - `creatorDate`: The creation date of an annotated tag, or the commit
+   * 		date of a lightweight tag.
+   *   - `author`: The author of the commit message associated with the tag,
+   * 	   in the format "Name <email>".
+   *   - `committer`: The person who committed the commit associated with the
+   * 	   tag, in the format "Name <email>".
+   *   - `subject`: The subject (first line) of the commit message associated
+   * 	   with the tag.
+   * 	 - `tagger`: The person who created the tag, in the format "Name <email>".
+   * 	   Only available for annotated tags.
+   * 	 - `annotation`: The subject (first line) of the tag annotation. Only
+   * 	   available for annotated tags.
+   *
+   * Refer to the expr-lang documentation for more details on syntax and
+   * capabilities of the expression language: https://expr-lang.org.
+   *
+   * +kubebuilder:validation:Optional
+   *
+   * @generated from field: optional string expressionFilter = 12;
+   */
+  expressionFilter: string;
+
   /**
    * InsecureSkipTLSVerify specifies whether certificate verification errors
    * should be ignored when connecting to the repository. This should be enabled
diff --git a/ui/src/gen/schema/warehouses.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/warehouses.kargo.akuity.io_v1alpha1.json
index 2c22e6c9..de75017a 100644
--- a/ui/src/gen/schema/warehouses.kargo.akuity.io_v1alpha1.json
+++ b/ui/src/gen/schema/warehouses.kargo.akuity.io_v1alpha1.json
@@ -87,7 +87,7 @@
                   },
                   "commitSelectionStrategy": {
                     "default": "NewestFromBranch",
-                    "description": "CommitSelectionStrategy specifies the rules for how to identify the newest\ncommit of interest in the repository specified by the RepoURL field. This\nfield is optional. When left unspecified, the field is implicitly treated\nas if its value were \"NewestFromBranch\".\n\nAccepted values:\n\n- \"NewestFromBranch\": Selects the latest commit on the branch specified\n  by the Branch field or the default branch if none is specified. This is\n  the default strategy.\n\n- \"SemVer\": Selects the commit referenced by the the semantically greatest\n  tag. The SemverConstraint field can optionally be used to narrow the set\n  of tags eligible for selection.\n\n- \"Lexical\": Selects the commit referenced by the lexicographically\n  greatest tag. Useful when tags embed a _leading_ date or timestamp. The\n  AllowTags and IgnoreTags fields can optionally be used to narrow the set\n  of tags eligible for selection.\n\n- \"NewestTag\": Selects the commit referenced by the most recently created\n  tag. The AllowTags and IgnoreTags fields can optionally be used to\n  narrow the set of tags eligible for selection.",
+                    "description": "CommitSelectionStrategy specifies the rules for how to identify the newest\ncommit of interest in the repository specified by the RepoURL field. This\nfield is optional. When left unspecified, the field is implicitly treated\nas if its value were \"NewestFromBranch\".\n\nAccepted values:\n\n- \"NewestFromBranch\": Selects the latest commit on the branch specified\n  by the Branch field or the default branch if none is specified. This is\n  the default strategy.\n\n- \"SemVer\": Selects the commit referenced by the semantically greatest\n  tag. The SemverConstraint field can optionally be used to narrow the set\n  of tags eligible for selection.\n\n- \"Lexical\": Selects the commit referenced by the lexicographically\n  greatest tag. Useful when tags embed a _leading_ date or timestamp. The\n  AllowTags and IgnoreTags fields can optionally be used to narrow the set\n  of tags eligible for selection.\n\n- \"NewestTag\": Selects the commit referenced by the most recently created\n  tag. The AllowTags and IgnoreTags fields can optionally be used to\n  narrow the set of tags eligible for selection.",
                     "enum": [
                       "Lexical",
                       "NewestFromBranch",
@@ -111,6 +111,10 @@
                     },
                     "type": "array"
                   },
+                  "expressionFilter": {
+                    "description": "ExpressionFilter is an expression that can optionally be used to limit\nthe commits or tags that are considered in determining the newest commit\nof interest based on their metadata.\n\nFor commit-based strategies (NewestFromBranch), the filter applies to\ncommits and has access to commit metadata variables.\nFor tag-based strategies (Lexical, NewestTag, SemVer), the filter applies\nto tags and has access to tag metadata variables. The filter is applied\nafter AllowTags, IgnoreTags, and SemverConstraint fields.\n\nThe expression should be a valid expr-lang expression that evaluates to\ntrue or false. When the expression evaluates to true, the commit/tag is\nincluded in the set that is considered. When the expression evaluates to\nfalse, the commit/tag is excluded.\n\nAvailable variables depend on the CommitSelectionStrategy:\n\nFor NewestFromBranch (commit filtering):\n  - `id`: The ID (sha) of the commit.\n  - `commitDate`: The commit date of the commit.\n  - `author`: The author of the commit message, in the format \"Name <email>\".\n  - `committer`: The person who committed the commit, in the format\n\t   \"Name <email>\".\n  - `subject`: The subject (first line) of the commit message.\n\nFor Lexical, NewestTag, SemVer (tag filtering):\n  - `tag`: The name of the tag.\n  - `id`: The ID (sha) of the commit associated with the tag.\n  - `creatorDate`: The creation date of an annotated tag, or the commit\n\t\tdate of a lightweight tag.\n  - `author`: The author of the commit message associated with the tag,\n\t   in the format \"Name <email>\".\n  - `committer`: The person who committed the commit associated with the\n\t   tag, in the format \"Name <email>\".\n  - `subject`: The subject (first line) of the commit message associated\n\t   with the tag.\n\t - `tagger`: The person who created the tag, in the format \"Name <email>\".\n\t   Only available for annotated tags.\n\t - `annotation`: The subject (first line) of the tag annotation. Only\n\t   available for annotated tags.\n\nRefer to the expr-lang documentation for more details on syntax and\ncapabilities of the expression language: https://expr-lang.org.",
+                    "type": "string"
+                  },
                   "ignoreTags": {
                     "description": "IgnoreTags is a list of tags that must be ignored when determining the\nnewest commit of interest. No regular expressions or glob patterns are\nsupported yet. The value in this field only has any effect when the\nCommitSelectionStrategy is Lexical, NewestTag, or SemVer. This field is\noptional.",
                     "items": {



Test patch:
diff --git a/internal/controller/warehouses/git_test.go b/internal/controller/warehouses/git_test.go
index af54173b..25218535 100644
--- a/internal/controller/warehouses/git_test.go
+++ b/internal/controller/warehouses/git_test.go
@@ -5,7 +5,9 @@ import (
 	"errors"
 	"regexp"
 	"testing"
+	"time"
 
+	"github.com/expr-lang/expr"
 	"github.com/stretchr/testify/require"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
@@ -248,7 +250,65 @@ func TestDiscoverBranchHistory(t *testing.T) {
 			},
 		},
 		{
-			name: "without path filters",
+			name: "error compiling expression filter",
+			sub: kargoapi.GitSubscription{
+				ExpressionFilter: "invalid expression (",
+			},
+			reconciler: &reconciler{
+				listCommitsFn: func(git.Repo, uint, uint) ([]git.CommitMetadata, error) {
+					return []git.CommitMetadata{
+						{ID: "abc"},
+					}, nil
+				},
+			},
+			assertions: func(t *testing.T, _ []git.CommitMetadata, err error) {
+				require.ErrorContains(t, err, "error compiling expression filter")
+			},
+		},
+		{
+			name: "expression filter excludes commits",
+			sub: kargoapi.GitSubscription{
+				ExpressionFilter: "id == 'xyz'",
+				DiscoveryLimit:   10,
+			},
+			reconciler: &reconciler{
+				listCommitsFn: func(_ git.Repo, _ uint, skip uint) ([]git.CommitMetadata, error) {
+					if skip > 0 {
+						return nil, nil
+					}
+					return []git.CommitMetadata{
+						{ID: "abc"},
+						{ID: "def"},
+					}, nil
+				},
+			},
+			assertions: func(t *testing.T, commits []git.CommitMetadata, err error) {
+				require.NoError(t, err)
+				require.Empty(t, commits)
+			},
+		},
+		{
+			name: "expression filter includes commits",
+			sub: kargoapi.GitSubscription{
+				ExpressionFilter: "id == 'abc'",
+			},
+			reconciler: &reconciler{
+				listCommitsFn: func(git.Repo, uint, uint) ([]git.CommitMetadata, error) {
+					return []git.CommitMetadata{
+						{ID: "abc"},
+						{ID: "xyz"},
+					}, nil
+				},
+			},
+			assertions: func(t *testing.T, commits []git.CommitMetadata, err error) {
+				require.NoError(t, err)
+				require.Equal(t, []git.CommitMetadata{
+					{ID: "abc"},
+				}, commits)
+			},
+		},
+		{
+			name: "without path filters or expression",
 			reconciler: &reconciler{
 				listCommitsFn: func(git.Repo, uint, uint) ([]git.CommitMetadata, error) {
 					return []git.CommitMetadata{
@@ -315,6 +375,36 @@ func TestDiscoverBranchHistory(t *testing.T) {
 				}, commits)
 			},
 		},
+		{
+			name: "with expression filter and path filters",
+			sub: kargoapi.GitSubscription{
+				ExpressionFilter: "author == 'test-author'",
+				IncludePaths:     []string{regexpPrefix + "^.*third_path_to_a/file$"},
+			},
+			reconciler: &reconciler{
+				listCommitsFn: func(_ git.Repo, _ uint, skip uint) ([]git.CommitMetadata, error) {
+					if skip > 0 {
+						return nil, nil
+					}
+					return []git.CommitMetadata{
+						{ID: "abc", Author: "test-author"},
+						{ID: "xyz", Author: "other-author"},
+					}, nil
+				},
+				getDiffPathsForCommitIDFn: func(_ git.Repo, id string) ([]string, error) {
+					if id == "abc" {
+						return []string{"third_path_to_a/file"}, nil
+					}
+					return []string{"first_path_to_a/file", "second_path_to_a/file"}, nil
+				},
+			},
+			assertions: func(t *testing.T, commits []git.CommitMetadata, err error) {
+				require.NoError(t, err)
+				require.Equal(t, []git.CommitMetadata{
+					{ID: "abc", Author: "test-author"},
+				}, commits)
+			},
+		},
 	}
 
 	for _, testCase := range testCases {
@@ -378,6 +468,45 @@ func TestDiscoverTags(t *testing.T) {
 				require.ErrorContains(t, err, "error compiling regular expression")
 			},
 		},
+		{
+			name: "tag expression filter error",
+			sub: kargoapi.GitSubscription{
+				ExpressionFilter: "invalid expression (",
+			},
+			reconciler: &reconciler{
+				listTagsFn: func(git.Repo) ([]git.TagMetadata, error) {
+					return []git.TagMetadata{
+						{Tag: "v1.0.0"},
+					}, nil
+				},
+			},
+			assertions: func(t *testing.T, _ []git.TagMetadata, err error) {
+				require.ErrorContains(t, err, "failed to filter tags by expression")
+				require.ErrorContains(t, err, "error compiling tag expression filter")
+			},
+		},
+		{
+			name: "tag expression filter success",
+			sub: kargoapi.GitSubscription{
+				ExpressionFilter: "hasPrefix(tag, 'v1.')",
+			},
+			reconciler: &reconciler{
+				listTagsFn: func(git.Repo) ([]git.TagMetadata, error) {
+					return []git.TagMetadata{
+						{Tag: "v1.0.0"},
+						{Tag: "v2.0.0"},
+						{Tag: "v1.2.3"},
+					}, nil
+				},
+			},
+			assertions: func(t *testing.T, tags []git.TagMetadata, err error) {
+				require.NoError(t, err)
+				require.Equal(t, []git.TagMetadata{
+					{Tag: "v1.0.0"},
+					{Tag: "v1.2.3"},
+				}, tags)
+			},
+		},
 		{
 			name: "SemVer commit selection strategy",
 			sub: kargoapi.GitSubscription{
@@ -525,6 +654,231 @@ func TestDiscoverTags(t *testing.T) {
 	}
 }
 
+func TestFilterTagsByExpression(t *testing.T) {
+	testCases := []struct {
+		name       string
+		tags       []git.TagMetadata
+		expression string
+		assertions func(*testing.T, []git.TagMetadata, error)
+	}{
+		{
+			name:       "empty expression returns all tags",
+			expression: "",
+			tags: []git.TagMetadata{
+				{Tag: "v1.0.0"},
+				{Tag: "v2.0.0"},
+			},
+			assertions: func(t *testing.T, tags []git.TagMetadata, err error) {
+				require.NoError(t, err)
+				require.Len(t, tags, 2)
+			},
+		},
+		{
+			name:       "error compiling expression",
+			expression: "invalid expression (",
+			tags:       []git.TagMetadata{{Tag: "v1.0.0"}},
+			assertions: func(t *testing.T, _ []git.TagMetadata, err error) {
+				require.ErrorContains(t, err, "error compiling tag expression filter")
+			},
+		},
+		{
+			name:       "boolean expression filters correctly",
+			expression: "hasPrefix(tag, 'v1.')",
+			tags: []git.TagMetadata{
+				{Tag: "v1.0.0"},
+				{Tag: "v2.0.0"},
+				{Tag: "v1.2.3"},
+			},
+			assertions: func(t *testing.T, tags []git.TagMetadata, err error) {
+				require.NoError(t, err)
+				require.Equal(t, []git.TagMetadata{
+					{Tag: "v1.0.0"},
+					{Tag: "v1.2.3"},
+				}, tags)
+			},
+		},
+		{
+			name:       "non-boolean expression converted to boolean",
+			expression: "1", // Should be converted to true
+			tags: []git.TagMetadata{
+				{Tag: "v1.0.0"},
+				{Tag: "v2.0.0"},
+			},
+			assertions: func(t *testing.T, tags []git.TagMetadata, err error) {
+				require.NoError(t, err)
+				require.Len(t, tags, 2)
+			},
+		},
+		{
+			name:       "non-boolean expression false",
+			expression: "0", // Should be converted to false
+			tags: []git.TagMetadata{
+				{Tag: "v1.0.0"},
+				{Tag: "v2.0.0"},
+			},
+			assertions: func(t *testing.T, tags []git.TagMetadata, err error) {
+				require.NoError(t, err)
+				require.Empty(t, tags)
+			},
+		},
+		{
+			name:       "error parsing non-boolean result",
+			expression: "'invalid'", // Can't be parsed as boolean
+			tags:       []git.TagMetadata{{Tag: "v1.0.0"}},
+			assertions: func(t *testing.T, _ []git.TagMetadata, err error) {
+				require.ErrorContains(t, err, "error parsing expression result")
+			},
+		},
+		{
+			name:       "complex expression with tag metadata",
+			expression: "tag contains '1.' && author == 'test-author'",
+			tags: []git.TagMetadata{
+				{Tag: "v1.0.0", Author: "test-author"},
+				{Tag: "v1.2.3", Author: "other-author"},
+				{Tag: "v2.0.0", Author: "test-author"},
+			},
+			assertions: func(t *testing.T, tags []git.TagMetadata, err error) {
+				require.NoError(t, err)
+				require.Equal(t, []git.TagMetadata{
+					{Tag: "v1.0.0", Author: "test-author"},
+				}, tags)
+			},
+		},
+		{
+			name:       "expression with date comparison",
+			expression: "creatorDate.Year() >= 2023",
+			tags: []git.TagMetadata{
+				{Tag: "v1.0.0", CreatorDate: time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC)},
+				{Tag: "v2.0.0", CreatorDate: time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC)},
+			},
+			assertions: func(t *testing.T, tags []git.TagMetadata, err error) {
+				require.NoError(t, err)
+				require.Equal(t, []git.TagMetadata{
+					{Tag: "v1.0.0", CreatorDate: time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC)},
+				}, tags)
+			},
+		},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.name, func(t *testing.T) {
+			tags, err := filterTagsByExpression(testCase.tags, testCase.expression)
+			testCase.assertions(t, tags, err)
+		})
+	}
+}
+
+func TestEvaluateCommitExpression(t *testing.T) {
+	testCases := []struct {
+		name       string
+		commit     git.CommitMetadata
+		expression string
+		assertions func(*testing.T, bool, error)
+	}{
+		{
+			name:       "boolean true expression",
+			expression: "true",
+			commit:     git.CommitMetadata{ID: "abc"},
+			assertions: func(t *testing.T, result bool, err error) {
+				require.NoError(t, err)
+				require.True(t, result)
+			},
+		},
+		{
+			name:       "boolean false expression",
+			expression: "false",
+			commit:     git.CommitMetadata{ID: "abc"},
+			assertions: func(t *testing.T, result bool, err error) {
+				require.NoError(t, err)
+				require.False(t, result)
+			},
+		},
+		{
+			name:       "expression with commit data",
+			expression: "id == 'abc' && author == 'test-author'",
+			commit: git.CommitMetadata{
+				ID:     "abc",
+				Author: "test-author",
+			},
+			assertions: func(t *testing.T, result bool, err error) {
+				require.NoError(t, err)
+				require.True(t, result)
+			},
+		},
+		{
+			name:       "expression with commit data false",
+			expression: "id == 'xyz'",
+			commit: git.CommitMetadata{
+				ID: "abc",
+			},
+			assertions: func(t *testing.T, result bool, err error) {
+				require.NoError(t, err)
+				require.False(t, result)
+			},
+		},
+		{
+			name:       "non-boolean result converted to true",
+			expression: "1",
+			commit:     git.CommitMetadata{ID: "abc"},
+			assertions: func(t *testing.T, result bool, err error) {
+				require.NoError(t, err)
+				require.True(t, result)
+			},
+		},
+		{
+			name:       "non-boolean result converted to false",
+			expression: "0",
+			commit:     git.CommitMetadata{ID: "abc"},
+			assertions: func(t *testing.T, result bool, err error) {
+				require.NoError(t, err)
+				require.False(t, result)
+			},
+		},
+		{
+			name:       "error parsing non-boolean result",
+			expression: "'invalid'",
+			commit:     git.CommitMetadata{ID: "abc"},
+			assertions: func(t *testing.T, _ bool, err error) {
+				require.ErrorContains(t, err, "invalid syntax")
+			},
+		},
+		{
+			name:       "expression with date comparison",
+			expression: "commitDate.Year() >= 2023",
+			commit: git.CommitMetadata{
+				ID:         "abc",
+				CommitDate: time.Date(2023, 6, 1, 0, 0, 0, 0, time.UTC),
+			},
+			assertions: func(t *testing.T, result bool, err error) {
+				require.NoError(t, err)
+				require.True(t, result)
+			},
+		},
+		{
+			name:       "expression with subject matching",
+			expression: "subject contains 'fix:'",
+			commit: git.CommitMetadata{
+				ID:      "abc",
+				Subject: "fix: resolve issue with authentication",
+			},
+			assertions: func(t *testing.T, result bool, err error) {
+				require.NoError(t, err)
+				require.True(t, result)
+			},
+		},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.name, func(t *testing.T) {
+			expression, err := expr.Compile(testCase.expression)
+			require.NoError(t, err)
+
+			result, err := evaluateCommitExpression(testCase.commit, expression)
+			testCase.assertions(t, result, err)
+		})
+	}
+}
+
 func TestFilterTags(t *testing.T) {
 	testCases := []struct {
 		name       string