Repository: armadaproject/armada
Pull request #2301 (2023-03-30 14:07:15)

Add isDuplicate field to Job submission event
This is so ingesters can avoid processing events for duplicate jobs.
Also adds a small fix to avoid null pointer dereference in lookout ingester v2.


Patch:
diff --git a/internal/armada/server/submit_to_log.go b/internal/armada/server/submit_to_log.go
index d3c02857..30346b78 100644
--- a/internal/armada/server/submit_to_log.go
+++ b/internal/armada/server/submit_to_log.go
@@ -175,6 +175,7 @@ func (srv *PulsarSubmitServer) SubmitJobs(ctx context.Context, req *api.JobSubmi
 		originalId, found := originalIds[apiJob.GetId()]
 		if apiJob.ClientId != "" && originalId != apiJob.GetId() {
 			if found && originalId != "" {
+				logJob.IsDuplicate = true
 				oldJobId, err := armadaevents.ProtoUuidFromUlidString(originalIds[apiJob.GetId()])
 				if err != nil {
 					return nil, status.Error(codes.Internal, "error marshalling oldJobId")
diff --git a/internal/lookoutingester/instructions/instructions.go b/internal/lookoutingester/instructions/instructions.go
index ab4673d5..0bba2dfa 100644
--- a/internal/lookoutingester/instructions/instructions.go
+++ b/internal/lookoutingester/instructions/instructions.go
@@ -113,6 +113,10 @@ func (c *InstructionConverter) handleSubmitJob(
 		c.metrics.RecordPulsarMessageError(metrics.PulsarMessageErrorProcessing)
 		return err
 	}
+	if event.IsDuplicate {
+		log.Debugf("job %s is a duplicate, ignoring", jobId)
+		return nil
+	}
 
 	// Try and marshall the job Json. This shouldn't go wrong but if it does, it'c not a fatal error
 	// Rather it means that the json won't be available in the ui
diff --git a/internal/lookoutingesterv2/instructions/instructions.go b/internal/lookoutingesterv2/instructions/instructions.go
index 13b68932..a7c772e2 100644
--- a/internal/lookoutingesterv2/instructions/instructions.go
+++ b/internal/lookoutingesterv2/instructions/instructions.go
@@ -136,6 +136,10 @@ func (c *InstructionConverter) handleSubmitJob(
 		c.metrics.RecordPulsarMessageError(metrics.PulsarMessageErrorProcessing)
 		return err
 	}
+	if event.IsDuplicate {
+		log.Debugf("job %s is a duplicate, ignoring", jobId)
+		return nil
+	}
 
 	// Try and marshall the job proto. This shouldn't go wrong but if it does, it's not a fatal error
 	// Rather it means that the job spec won't be available in the ui
diff --git a/internal/lookoutingesterv2/lookoutdb/insertion.go b/internal/lookoutingesterv2/lookoutdb/insertion.go
index 1dc6192e..619a46f8 100644
--- a/internal/lookoutingesterv2/lookoutdb/insertion.go
+++ b/internal/lookoutingesterv2/lookoutdb/insertion.go
@@ -130,7 +130,7 @@ func (l *LookoutDb) CreateJobsBatch(ctx context.Context, instructions []*model.C
 
 		createTmp := func(tx pgx.Tx) error {
 			_, err := tx.Exec(ctx, fmt.Sprintf(`
-				CREATE TEMPORARY TABLE %s 
+				CREATE TEMPORARY TABLE %s
 				(
 					job_id 	                      varchar(32),
 					queue                        varchar(512),
@@ -725,7 +725,7 @@ func conflateJobUpdates(updates []*model.UpdateJobInstruction) []*model.UpdateJo
 		// Need to deal with preempted jobs separately
 		// We could get a JobFailed event (or another terminal event) after a JobPreempted event,
 		// but the job should still be marked as Preempted
-		if !isTerminal(existing.State) || *update.State == lookout.JobPreemptedOrdinal {
+		if !isTerminal(existing.State) || (update.State != nil && *update.State == lookout.JobPreemptedOrdinal) {
 			if update.Priority != nil {
 				existing.Priority = update.Priority
 			}
diff --git a/internal/scheduleringester/instructions.go b/internal/scheduleringester/instructions.go
index ff09c9fd..1e467cd9 100644
--- a/internal/scheduleringester/instructions.go
+++ b/internal/scheduleringester/instructions.go
@@ -123,6 +123,15 @@ func (c *InstructionConverter) convertSequence(es *armadaevents.EventSequence) [
 }
 
 func (c *InstructionConverter) handleSubmitJob(job *armadaevents.SubmitJob, submitTime time.Time, meta eventSequenceCommon) ([]DbOperation, error) {
+	jobId, err := armadaevents.UlidStringFromProtoUuid(job.JobId)
+	if err != nil {
+		return nil, err
+	}
+	if job.IsDuplicate {
+		log.Debugf("job %s is a duplicate, ignoring", jobId)
+		return nil, nil
+	}
+
 	// Store the job submit message so that it can be sent to an executor.
 	submitJobBytes, err := proto.Marshal(job)
 	if err != nil {
@@ -149,10 +158,6 @@ func (c *InstructionConverter) handleSubmitJob(job *armadaevents.SubmitJob, subm
 		return nil, err
 	}
 
-	jobId, err := armadaevents.UlidStringFromProtoUuid(job.JobId)
-	if err != nil {
-		return nil, err
-	}
 	return []DbOperation{InsertJobs{jobId: &schedulerdb.Job{
 		JobID:          jobId,
 		JobSet:         meta.jobset,
diff --git a/pkg/armadaevents/events.pb.go b/pkg/armadaevents/events.pb.go
index ffb99e41..b220747e 100644
--- a/pkg/armadaevents/events.pb.go
+++ b/pkg/armadaevents/events.pb.go
@@ -676,6 +676,8 @@ type SubmitJob struct {
 	// Indicates which scheduler should manage this job.
 	// If empty, the default scheduler is used.
 	Scheduler string `protobuf:"bytes,11,opt,name=scheduler,proto3" json:"scheduler,omitempty"`
+	// Indicates whether job is a duplicate
+	IsDuplicate bool `protobuf:"varint,12,opt,name=isDuplicate,proto3" json:"isDuplicate,omitempty"`
 }
 
 func (m *SubmitJob) Reset()         { *m = SubmitJob{} }
@@ -788,6 +790,13 @@ func (m *SubmitJob) GetScheduler() string {
 	return ""
 }
 
+func (m *SubmitJob) GetIsDuplicate() bool {
+	if m != nil {
+		return m.IsDuplicate
+	}
+	return false
+}
+
 // Kubernetes objects that can serve as main objects for an Armada job.
 type KubernetesMainObject struct {
 	ObjectMeta *ObjectMeta `protobuf:"bytes,1,opt,name=objectMeta,proto3" json:"objectMeta,omitempty"`
@@ -3296,211 +3305,212 @@ func init() {
 func init() { proto.RegisterFile("pkg/armadaevents/events.proto", fileDescriptor_6aab92ca59e015f8) }
 
 var fileDescriptor_6aab92ca59e015f8 = []byte{
-	// 3262 bytes of a gzipped FileDescriptorProto
+	// 3278 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0x4b, 0x6c, 0x1b, 0xc7,
 	0x19, 0xf6, 0x92, 0x12, 0x1f, 0x3f, 0x25, 0x91, 0x1e, 0x4b, 0x0e, 0xad, 0xd8, 0xa2, 0xb3, 0x4e,
 	0x1b, 0x27, 0x48, 0xc8, 0xc4, 0x79, 0x20, 0x8f, 0x22, 0x81, 0x68, 0x2b, 0xb1, 0x1d, 0xcb, 0x76,
 	0x28, 0x2b, 0x4d, 0x83, 0x14, 0xcc, 0x72, 0x77, 0x44, 0xad, 0x45, 0xee, 0x6e, 0xf6, 0x21, 0x4b,
-	0x40, 0x0e, 0x2d, 0xd0, 0xa6, 0xb7, 0xc6, 0x87, 0x1e, 0x0a, 0xf4, 0x90, 0x5e, 0x1b, 0xa0, 0xd7,
-	0xf6, 0xdc, 0x5b, 0x0a, 0x14, 0x45, 0x7a, 0xeb, 0x89, 0x2d, 0x12, 0xf4, 0xc2, 0x43, 0xaf, 0x7d,
-	0x9c, 0x8a, 0x79, 0xed, 0xce, 0x2c, 0x97, 0xb6, 0xea, 0x47, 0x9d, 0xc2, 0x27, 0x69, 0xbf, 0xff,
-	0x35, 0x33, 0xff, 0xfc, 0x33, 0xff, 0x3f, 0x33, 0x84, 0x13, 0xde, 0x4e, 0xbf, 0x65, 0xf8, 0x43,
-	0xc3, 0x32, 0xf0, 0x2e, 0x76, 0xc2, 0xa0, 0xc5, 0xfe, 0x34, 0x3d, 0xdf, 0x0d, 0x5d, 0x34, 0x27,
-	0x93, 0x96, 0xf5, 0x9d, 0x97, 0x83, 0xa6, 0xed, 0xb6, 0x0c, 0xcf, 0x6e, 0x99, 0xae, 0x8f, 0x5b,
-	0xbb, 0xcf, 0xb5, 0xfa, 0xd8, 0xc1, 0xbe, 0x11, 0x62, 0x8b, 0x49, 0x2c, 0x9f, 0x96, 0x78, 0x1c,
-	0x1c, 0xde, 0x70, 0xfd, 0x1d, 0xdb, 0xe9, 0x67, 0x71, 0x36, 0xfa, 0xae, 0xdb, 0x1f, 0xe0, 0x16,
-	0xfd, 0xea, 0x45, 0x5b, 0xad, 0xd0, 0x1e, 0xe2, 0x20, 0x34, 0x86, 0x1e, 0x67, 0x78, 0x21, 0x51,
-	0x35, 0x34, 0xcc, 0x6d, 0xdb, 0xc1, 0xfe, 0x7e, 0x8b, 0xb6, 0xd7, 0xb3, 0x5b, 0x3e, 0x0e, 0xdc,
-	0xc8, 0x37, 0xf1, 0x84, 0xda, 0x67, 0xfa, 0x76, 0xb8, 0x1d, 0xf5, 0x9a, 0xa6, 0x3b, 0x6c, 0xf5,
-	0xdd, 0xbe, 0x9b, 0xe8, 0x27, 0x5f, 0xf4, 0x83, 0xfe, 0xc7, 0xd8, 0xf5, 0xdf, 0x1c, 0x81, 0xf9,
-	0x35, 0xd2, 0xbd, 0x0d, 0xfc, 0x51, 0x84, 0x1d, 0x13, 0xa3, 0x27, 0x61, 0xf6, 0xa3, 0x08, 0x47,
-	0xb8, 0xae, 0x9d, 0xd4, 0x4e, 0x97, 0xdb, 0x47, 0xc6, 0xa3, 0x46, 0x95, 0x02, 0x4f, 0xbb, 0x43,
-	0x3b, 0xc4, 0x43, 0x2f, 0xdc, 0xef, 0x30, 0x0e, 0xf4, 0x2a, 0xcc, 0x5d, 0x77, 0x7b, 0xdd, 0x00,
-	0x87, 0x5d, 0xc7, 0x18, 0xe2, 0x7a, 0x8e, 0x4a, 0xd4, 0xc7, 0xa3, 0xc6, 0xe2, 0x75, 0xb7, 0xb7,
-	0x81, 0xc3, 0xcb, 0xc6, 0x50, 0x16, 0x83, 0x04, 0x45, 0xcf, 0x40, 0x31, 0x0a, 0xb0, 0xdf, 0xb5,
-	0xad, 0x7a, 0x9e, 0x8a, 0x2d, 0x8e, 0x47, 0x8d, 0x1a, 0x81, 0x2e, 0x58, 0x92, 0x48, 0x81, 0x21,
-	0xe8, 0x69, 0x28, 0xf4, 0x7d, 0x37, 0xf2, 0x82, 0xfa, 0xcc, 0xc9, 0xbc, 0xe0, 0x66, 0x88, 0xcc,
-	0xcd, 0x10, 0x74, 0x05, 0x0a, 0xcc, 0x67, 0xf5, 0xd9, 0x93, 0xf9, 0xd3, 0x95, 0x33, 0x8f, 0x35,
-	0x65, 0x47, 0x36, 0x95, 0x0e, 0xb3, 0x2f, 0xa6, 0x90, 0xd1, 0x65, 0x85, 0xdc, 0xf5, 0x9f, 0x1e,
-	0x86, 0x59, 0xca, 0x87, 0xae, 0x40, 0xd1, 0xf4, 0x31, 0x19, 0xf0, 0x3a, 0x3a, 0xa9, 0x9d, 0xae,
-	0x9c, 0x59, 0x6e, 0x32, 0x47, 0x36, 0xc5, 0x40, 0x37, 0xaf, 0x09, 0x47, 0xb6, 0x8f, 0x8d, 0x47,
-	0x8d, 0xc3, 0x9c, 0x3d, 0xd1, 0x7a, 0xf3, 0x2f, 0x0d, 0xad, 0x23, 0xb4, 0xa0, 0xab, 0x50, 0x0e,
-	0xa2, 0xde, 0xd0, 0x0e, 0x2f, 0xba, 0x3d, 0x3a, 0xe6, 0x95, 0x33, 0x8f, 0xa8, 0xcd, 0xdd, 0x10,
-	0xe4, 0xf6, 0x23, 0xe3, 0x51, 0xe3, 0x48, 0xcc, 0x9d, 0x68, 0x3c, 0x7f, 0xa8, 0x93, 0x28, 0x41,
-	0xdb, 0x50, 0xf5, 0xb1, 0xe7, 0xdb, 0xae, 0x6f, 0x87, 0x76, 0x80, 0x89, 0xde, 0x1c, 0xd5, 0x7b,
-	0x42, 0xd5, 0xdb, 0x51, 0x99, 0xda, 0x27, 0xc6, 0xa3, 0xc6, 0xb1, 0x94, 0xa4, 0x62, 0x23, 0xad,
-	0x16, 0x85, 0x80, 0x52, 0xd0, 0x06, 0x0e, 0xa9, 0x3f, 0x2b, 0x67, 0x4e, 0xde, 0xd2, 0xd8, 0x06,
-	0x0e, 0xdb, 0x27, 0xc7, 0xa3, 0xc6, 0xf1, 0x49, 0x79, 0xc5, 0x64, 0x86, 0x7e, 0x34, 0x80, 0x9a,
-	0x8c, 0x5a, 0xa4, 0x83, 0x33, 0xd4, 0xe6, 0xca, 0x74, 0x9b, 0x84, 0xab, 0xbd, 0x32, 0x1e, 0x35,
-	0x96, 0xd3, 0xb2, 0x8a, 0xbd, 0x09, 0xcd, 0xc4, 0x3f, 0xa6, 0xe1, 0x98, 0x78, 0x40, 0xcc, 0xcc,
-	0x66, 0xf9, 0xe7, 0xac, 0x20, 0x33, 0xff, 0xc4, 0xdc, 0xaa, 0x7f, 0x62, 0x18, 0x7d, 0x00, 0x73,
-	0xf1, 0x07, 0x19, 0xaf, 0x02, 0x9f, 0x47, 0xd9, 0x4a, 0xc9, 0x48, 0x2d, 0x8f, 0x47, 0x8d, 0xa3,
-	0xb2, 0x8c, 0xa2, 0x5a, 0xd1, 0x96, 0x68, 0x1f, 0xb0, 0x91, 0x29, 0x4e, 0xd7, 0xce, 0x38, 0x64,
-	0xed, 0x83, 0xc9, 0x11, 0x51, 0xb4, 0x11, 0xed, 0x24, 0x88, 0x23, 0xd3, 0xc4, 0xd8, 0xc2, 0x56,
-	0xbd, 0x94, 0xa5, 0xfd, 0xa2, 0xc4, 0xc1, 0xb4, 0xcb, 0x32, 0xaa, 0x76, 0x99, 0x42, 0xc6, 0xfa,
-	0xba, 0xdb, 0x5b, 0xf3, 0x7d, 0xd7, 0x0f, 0xea, 0xe5, 0xac, 0xb1, 0xbe, 0x28, 0xc8, 0x6c, 0xac,
-	0x63, 0x6e, 0x75, 0xac, 0x63, 0x98, 0xb7, 0xb7, 0x13, 0x39, 0x97, 0xb0, 0x11, 0x60, 0xab, 0x0e,
-	0x53, 0xda, 0x1b, 0x73, 0xc4, 0xed, 0x8d, 0x91, 0x89, 0xf6, 0xc6, 0x14, 0x64, 0xc1, 0x02, 0xfb,
-	0x5e, 0x0d, 0x02, 0xbb, 0xef, 0x60, 0xab, 0x5e, 0xa1, 0xfa, 0x8f, 0x67, 0xe9, 0x17, 0x3c, 0xed,
-	0xe3, 0xe3, 0x51, 0xa3, 0xae, 0xca, 0x29, 0x36, 0x52, 0x3a, 0xd1, 0x87, 0x30, 0xcf, 0x90, 0x4e,
-	0xe4, 0x38, 0xb6, 0xd3, 0xaf, 0xcf, 0x51, 0x23, 0x8f, 0x66, 0x19, 0xe1, 0x2c, 0xed, 0x47, 0xc7,
-	0xa3, 0xc6, 0x23, 0x8a, 0x94, 0x62, 0x42, 0x55, 0x48, 0x56, 0x0c, 0x06, 0x24, 0x8e, 0x9d, 0xcf,
-	0x5a, 0x31, 0x2e, 0xaa, 0x4c, 0x6c, 0xc5, 0x48, 0x49, 0xaa, 0x2b, 0x46, 0x8a, 0x98, 0xf8, 0x83,
-	0x3b, 0x79, 0x61, 0xba, 0x3f, 0xb8, 0x9f, 0x25, 0x7f, 0x64, 0xb8, 0x5a, 0xd1, 0x86, 0x3e, 0x06,
-	0xb2, 0xf1, 0x9c, 0x8b, 0xbc, 0x81, 0x6d, 0x1a, 0x21, 0x3e, 0x87, 0x43, 0x6c, 0x92, 0x95, 0xba,
-	0x4a, 0xad, 0xe8, 0x13, 0x56, 0x26, 0x38, 0xdb, 0xfa, 0x78, 0xd4, 0x58, 0xc9, 0xd2, 0xa1, 0x58,
-	0xcd, 0xb4, 0x82, 0x7e, 0xa0, 0xc1, 0x52, 0x10, 0x1a, 0x8e, 0x65, 0x0c, 0x5c, 0x07, 0x5f, 0x70,
-	0xfa, 0x3e, 0x0e, 0x82, 0x0b, 0xce, 0x96, 0x5b, 0xaf, 0x51, 0xfb, 0xa7, 0x52, 0xcb, 0x7a, 0x16,
-	0x6b, 0xfb, 0xd4, 0x78, 0xd4, 0x68, 0x64, 0x6a, 0x51, 0x5a, 0x90, 0x6d, 0x08, 0xed, 0xc1, 0x11,
-	0x91, 0x19, 0x6c, 0x86, 0xf6, 0xc0, 0x0e, 0x8c, 0xd0, 0x76, 0x9d, 0xfa, 0x61, 0x6a, 0xff, 0xb1,
-	0xf4, 0xea, 0x38, 0xc1, 0xd8, 0x7e, 0x6c, 0x3c, 0x6a, 0x9c, 0xc8, 0xd0, 0xa0, 0xd8, 0xce, 0x32,
-	0x91, 0x4c, 0xa1, 0xab, 0x3e, 0x26, 0x8c, 0xd8, 0xaa, 0x1f, 0x99, 0x3e, 0x85, 0x62, 0x26, 0x79,
-	0x0a, 0xc5, 0x60, 0xd6, 0x14, 0x8a, 0x89, 0xc4, 0x92, 0x67, 0xf8, 0xa1, 0x4d, 0xcc, 0xae, 0x1b,
-	0xfe, 0x0e, 0xf6, 0xeb, 0x8b, 0x59, 0x96, 0xae, 0xaa, 0x4c, 0xcc, 0x52, 0x4a, 0x52, 0xb5, 0x94,
-	0x22, 0xa2, 0x9b, 0x1a, 0xa8, 0x4d, 0xb3, 0x5d, 0xa7, 0x43, 0xd2, 0x86, 0x80, 0x74, 0x6f, 0x89,
-	0x1a, 0x7d, 0xe2, 0x16, 0xdd, 0x93, 0xd9, 0xdb, 0x4f, 0x8c, 0x47, 0x8d, 0x53, 0x53, 0xb5, 0x29,
-	0x0d, 0x99, 0x6e, 0xb4, 0x5d, 0x84, 0x59, 0x6a, 0x49, 0x1f, 0x17, 0xe0, 0x48, 0x86, 0x07, 0xd1,
-	0xeb, 0x50, 0xf0, 0x23, 0x87, 0xa4, 0x55, 0x2c, 0x97, 0x40, 0x6a, 0xfb, 0x36, 0x23, 0xdb, 0x62,
-	0x39, 0x9d, 0x1f, 0x39, 0x4a, 0xa6, 0x35, 0x4b, 0x01, 0x22, 0x4f, 0x72, 0x3a, 0xdb, 0xe2, 0x39,
-	0xc3, 0x54, 0xf9, 0xeb, 0x6e, 0x4f, 0x95, 0xa7, 0x00, 0xc2, 0x30, 0x2f, 0xa6, 0x47, 0xd7, 0x26,
-	0x73, 0x9f, 0x65, 0x03, 0x8f, 0xab, 0x6a, 0xde, 0x8e, 0x7a, 0xd8, 0x77, 0x70, 0x88, 0x03, 0xd1,
-	0x07, 0x3a, 0xf9, 0x69, 0xac, 0xfb, 0x12, 0x22, 0xe9, 0x9f, 0x93, 0x71, 0xf4, 0x33, 0x0d, 0xea,
-	0x43, 0x63, 0xaf, 0x2b, 0xc0, 0xa0, 0xbb, 0xe5, 0xfa, 0x5d, 0x0f, 0xfb, 0xb6, 0x6b, 0xd1, 0x14,
-	0xb1, 0x72, 0xe6, 0x3b, 0xb7, 0x9d, 0xee, 0xcd, 0x75, 0x63, 0x4f, 0xc0, 0xc1, 0x9b, 0xae, 0x7f,
-	0x95, 0x8a, 0xaf, 0x39, 0xa1, 0xbf, 0xdf, 0x3e, 0xf1, 0xc5, 0xa8, 0x71, 0x68, 0x3c, 0x6a, 0x2c,
-	0x0d, 0xb3, 0x78, 0x3a, 0xd9, 0x30, 0xfa, 0x54, 0x83, 0xa3, 0xa1, 0x1b, 0x1a, 0x83, 0xae, 0x19,
-	0x0d, 0xa3, 0x81, 0x11, 0xda, 0xbb, 0xb8, 0x1b, 0x05, 0x46, 0x1f, 0xf3, 0x4c, 0xf4, 0xb5, 0xdb,
-	0x37, 0xea, 0x1a, 0x91, 0x3f, 0x1b, 0x8b, 0x6f, 0x12, 0x69, 0xd6, 0xa6, 0xe3, 0xbc, 0x4d, 0x8b,
-	0x61, 0x06, 0x4b, 0x27, 0x13, 0x5d, 0xfe, 0xa5, 0x06, 0xcb, 0xd3, 0xbb, 0x89, 0x4e, 0x41, 0x7e,
-	0x07, 0xef, 0xf3, 0x5c, 0xff, 0xf0, 0x78, 0xd4, 0x98, 0xdf, 0xc1, 0xfb, 0xd2, 0xa8, 0x13, 0x2a,
-	0xfa, 0x1e, 0xcc, 0xee, 0x1a, 0x83, 0x08, 0xf3, 0x29, 0xd1, 0x6c, 0xb2, 0xca, 0xa4, 0x29, 0x57,
-	0x26, 0x4d, 0x6f, 0xa7, 0x4f, 0x80, 0xa6, 0xf0, 0x48, 0xf3, 0x9d, 0xc8, 0x70, 0x42, 0x3b, 0xdc,
-	0x67, 0xd3, 0x85, 0x2a, 0x90, 0xa7, 0x0b, 0x05, 0x5e, 0xcd, 0xbd, 0xac, 0x2d, 0x7f, 0xa6, 0xc1,
-	0xb1, 0xa9, 0x9d, 0xfe, 0x26, 0xb4, 0x50, 0xef, 0xc2, 0x0c, 0x99, 0xf8, 0xa4, 0x0a, 0xd9, 0xb6,
-	0xfb, 0xdb, 0x2f, 0xbd, 0x40, 0x9b, 0x53, 0x60, 0x45, 0x03, 0x43, 0xe4, 0xa2, 0x81, 0x21, 0xa4,
-	0x92, 0x1a, 0xb8, 0x37, 0x5e, 0x7a, 0x81, 0x36, 0xaa, 0xc0, 0x8c, 0x50, 0x40, 0x36, 0x42, 0x01,
-	0xfd, 0x1f, 0xb3, 0x50, 0x8e, 0xd3, 0x7c, 0x29, 0x06, 0xb5, 0x3b, 0x8a, 0xc1, 0xf3, 0x50, 0xb3,
-	0xb0, 0xc5, 0xf7, 0x27, 0xdb, 0x75, 0x44, 0x34, 0x97, 0xd9, 0x1a, 0xa8, 0xd0, 0x14, 0xf9, 0x6a,
-	0x8a, 0x84, 0xce, 0x40, 0x89, 0xa7, 0xc3, 0xfb, 0x34, 0x90, 0xe7, 0xdb, 0x47, 0xc7, 0xa3, 0x06,
-	0x12, 0x98, 0x24, 0x1a, 0xf3, 0xa1, 0x0e, 0x80, 0xdb, 0xbb, 0x8e, 0xcd, 0x70, 0x1d, 0x87, 0x06,
-	0x4f, 0xcc, 0xeb, 0x6a, 0x0f, 0xae, 0xc4, 0x74, 0x56, 0x2d, 0x26, 0xfc, 0x72, 0xb5, 0x98, 0xa0,
-	0xe8, 0x03, 0x80, 0xa1, 0x61, 0x3b, 0x4c, 0x8e, 0x67, 0xe1, 0xfa, 0xb4, 0x25, 0x65, 0x3d, 0xe6,
-	0x64, 0xda, 0x13, 0x49, 0x59, 0x7b, 0x82, 0x92, 0x9a, 0x8e, 0xd9, 0x0a, 0xea, 0x05, 0x1a, 0xa5,
-	0x2b, 0xd3, 0x54, 0x73, 0xb5, 0x4b, 0xa4, 0xae, 0xe3, 0x22, 0x92, 0x4e, 0xa1, 0x85, 0x0c, 0xdb,
-	0xc0, 0xde, 0xc2, 0xa4, 0xa2, 0xa7, 0xf9, 0x37, 0x1f, 0x36, 0x81, 0xc9, 0xc3, 0x26, 0x30, 0xf4,
-	0x32, 0x80, 0x11, 0xae, 0xbb, 0x41, 0x78, 0xc5, 0x31, 0x31, 0xcd, 0xab, 0x4b, 0xac, 0xf9, 0x09,
-	0x2a, 0x37, 0x3f, 0x41, 0xd1, 0x6b, 0x50, 0xf1, 0xf8, 0x56, 0xd1, 0x1b, 0x60, 0x9a, 0x37, 0x97,
-	0x68, 0xe9, 0xb9, 0x24, 0xc1, 0x92, 0xac, 0xcc, 0x8d, 0xde, 0x82, 0xaa, 0xe9, 0x3a, 0x66, 0xe4,
-	0xfb, 0xd8, 0x31, 0xf7, 0x37, 0x8c, 0x2d, 0x4c, 0x73, 0xe4, 0x12, 0x9b, 0x2a, 0x29, 0x92, 0x3c,
-	0x55, 0x52, 0x24, 0xf4, 0x22, 0x94, 0x03, 0x73, 0x1b, 0x5b, 0xd1, 0x00, 0xfb, 0x34, 0x0d, 0x2e,
-	0xf3, 0x72, 0x55, 0x80, 0x92, 0x70, 0xc2, 0xa9, 0xff, 0x41, 0x83, 0xc5, 0x2c, 0xd7, 0xa5, 0xa6,
-	0x91, 0x76, 0x4f, 0xa6, 0xd1, 0xbb, 0x50, 0xf2, 0x5c, 0xab, 0x1b, 0x78, 0xd8, 0xe4, 0x2b, 0x45,
-	0x6a, 0x12, 0x5d, 0x75, 0xad, 0x0d, 0x0f, 0x9b, 0xdf, 0xb5, 0xc3, 0xed, 0xd5, 0x5d, 0xd7, 0xb6,
-	0x2e, 0xd9, 0x01, 0xf7, 0xb6, 0xc7, 0x28, 0xca, 0x3e, 0x5d, 0xe4, 0x60, 0xbb, 0x04, 0x05, 0x66,
-	0x45, 0xff, 0x63, 0x1e, 0x6a, 0xe9, 0xe9, 0xf2, 0xff, 0xd4, 0x15, 0xf4, 0x1e, 0x14, 0x6d, 0x96,
-	0x50, 0xf2, 0x9d, 0xfb, 0x5b, 0xd2, 0x5a, 0xda, 0x4c, 0x8e, 0xb4, 0x9a, 0xbb, 0xcf, 0x35, 0x79,
-	0xe6, 0x49, 0x87, 0x80, 0x6a, 0xe6, 0x92, 0xaa, 0x66, 0x0e, 0xa2, 0x0e, 0x14, 0x03, 0xec, 0xef,
-	0xda, 0x26, 0xe6, 0x8b, 0x42, 0x43, 0xd6, 0x6c, 0xba, 0x3e, 0x26, 0x3a, 0x37, 0x18, 0x4b, 0xa2,
-	0x93, 0xcb, 0xa8, 0x3a, 0x39, 0x88, 0xde, 0x85, 0xb2, 0xe9, 0x3a, 0x5b, 0x76, 0x7f, 0xdd, 0xf0,
-	0xf8, 0xb2, 0x70, 0x22, 0x4b, 0xeb, 0x59, 0xc1, 0xc4, 0x4b, 0x74, 0xf1, 0x99, 0x2a, 0xd1, 0x63,
-	0xae, 0xc4, 0xa1, 0x7f, 0x9f, 0x01, 0x48, 0x9c, 0x83, 0x5e, 0x81, 0x0a, 0xde, 0xc3, 0x66, 0x14,
-	0xba, 0xbe, 0x58, 0x9f, 0xf9, 0x89, 0x97, 0x80, 0x95, 0x05, 0x15, 0x12, 0x94, 0x04, 0x88, 0x63,
-	0x0c, 0x71, 0xe0, 0x19, 0xa6, 0x38, 0x2a, 0xa3, 0x8d, 0x89, 0x41, 0x39, 0x40, 0x62, 0x10, 0x7d,
-	0x1b, 0x66, 0xe8, 0xe1, 0x1a, 0x3b, 0x25, 0x43, 0xe3, 0x51, 0x63, 0xc1, 0x51, 0x8f, 0xd5, 0x28,
-	0x1d, 0xbd, 0x01, 0xf3, 0x3b, 0xf1, 0xc4, 0x23, 0x6d, 0x9b, 0xa1, 0x02, 0x34, 0xa5, 0x4a, 0x08,
-	0x4a, 0xeb, 0xe6, 0x64, 0x1c, 0x6d, 0x41, 0xc5, 0x70, 0x1c, 0x37, 0xa4, 0x6b, 0xbf, 0x38, 0x39,
-	0x7b, 0x72, 0xda, 0x34, 0x6d, 0xae, 0x26, 0xbc, 0x2c, 0x3b, 0xa1, 0x2b, 0x8e, 0xa4, 0x41, 0x5e,
-	0x71, 0x24, 0x18, 0x75, 0xa0, 0x30, 0x30, 0x7a, 0x78, 0x20, 0x16, 0xdb, 0xc7, 0xa7, 0x9a, 0xb8,
-	0x44, 0xd9, 0x98, 0x76, 0xba, 0xd5, 0x32, 0x39, 0x79, 0xab, 0x65, 0xc8, 0xf2, 0x16, 0xd4, 0xd2,
-	0xed, 0x39, 0x58, 0xe2, 0xf0, 0xa4, 0x9c, 0x38, 0x94, 0x6f, 0x9b, 0xaa, 0x18, 0x50, 0x91, 0x1a,
-	0x75, 0x3f, 0x4c, 0xe8, 0xbf, 0xd2, 0x60, 0x31, 0x2b, 0x76, 0xd1, 0xba, 0x14, 0xf1, 0x1a, 0x3f,
-	0x01, 0xc8, 0x98, 0xea, 0x5c, 0x76, 0x4a, 0xa8, 0x27, 0x81, 0xde, 0x86, 0x05, 0xc7, 0xb5, 0x70,
-	0xd7, 0x20, 0x06, 0x06, 0x76, 0x10, 0xd6, 0x73, 0xf4, 0x64, 0x95, 0x9e, 0x1c, 0x10, 0xca, 0xaa,
-	0x20, 0x48, 0xd2, 0xf3, 0x0a, 0x41, 0xff, 0xb1, 0x06, 0xd5, 0xd4, 0xc1, 0xde, 0x5d, 0x27, 0x2f,
-	0x72, 0xca, 0x91, 0x3b, 0x58, 0xca, 0xa1, 0x9f, 0x07, 0x34, 0x79, 0xbe, 0xa8, 0x68, 0xd2, 0x0e,
-	0xa8, 0xe9, 0x13, 0x0d, 0x6a, 0xe9, 0x63, 0xc3, 0x07, 0xd2, 0xa5, 0xb7, 0xa1, 0x1c, 0x1f, 0x01,
-	0xde, 0x6d, 0x03, 0xf4, 0x6b, 0x30, 0xc7, 0xc6, 0xe4, 0x4d, 0x7b, 0x10, 0x62, 0x1f, 0x9d, 0x83,
-	0x42, 0x10, 0x1a, 0x21, 0x0e, 0xea, 0xda, 0xc9, 0xfc, 0xe9, 0x85, 0x33, 0x47, 0x27, 0xcf, 0xef,
-	0x08, 0x99, 0x05, 0x1d, 0xe3, 0x94, 0x83, 0x8e, 0x21, 0x44, 0xab, 0x7c, 0x4a, 0x79, 0x8f, 0xb4,
-	0x5e, 0x16, 0x5a, 0x07, 0xf7, 0x64, 0xf0, 0xf5, 0xdf, 0x6a, 0xac, 0xf3, 0xf1, 0x11, 0xd4, 0xdd,
-	0x7a, 0xb3, 0x9f, 0x54, 0xb8, 0xa4, 0x14, 0x0d, 0x68, 0xdc, 0x1c, 0xb4, 0xc2, 0xa5, 0xd1, 0xa5,
-	0x88, 0xcb, 0xd1, 0xa5, 0x10, 0xf4, 0x7f, 0xb2, 0x96, 0x27, 0xc7, 0x8d, 0x0f, 0xba, 0xb6, 0x4f,
+	0x40, 0x0e, 0x2d, 0xd0, 0xa6, 0xb7, 0xc6, 0x87, 0x1e, 0x0a, 0xf4, 0x90, 0x5e, 0x1b, 0xa0, 0xb7,
+	0xa2, 0x3d, 0xf7, 0x96, 0x02, 0x45, 0x91, 0xde, 0x7a, 0x62, 0x8b, 0x04, 0xbd, 0xf0, 0xd0, 0x73,
+	0xdb, 0x53, 0x31, 0xaf, 0xdd, 0x99, 0xe5, 0xd2, 0x56, 0xfd, 0xa8, 0x53, 0xf8, 0x24, 0xed, 0xf7,
+	0xbf, 0x66, 0xe6, 0x9f, 0x7f, 0xe6, 0xff, 0x67, 0x86, 0x70, 0xc2, 0xdb, 0xe9, 0xb7, 0x0c, 0x7f,
+	0x68, 0x58, 0x06, 0xde, 0xc5, 0x4e, 0x18, 0xb4, 0xd8, 0x9f, 0xa6, 0xe7, 0xbb, 0xa1, 0x8b, 0xe6,
+	0x64, 0xd2, 0xb2, 0xbe, 0xf3, 0x72, 0xd0, 0xb4, 0xdd, 0x96, 0xe1, 0xd9, 0x2d, 0xd3, 0xf5, 0x71,
+	0x6b, 0xf7, 0xb9, 0x56, 0x1f, 0x3b, 0xd8, 0x37, 0x42, 0x6c, 0x31, 0x89, 0xe5, 0xd3, 0x12, 0x8f,
+	0x83, 0xc3, 0x1b, 0xae, 0xbf, 0x63, 0x3b, 0xfd, 0x2c, 0xce, 0x46, 0xdf, 0x75, 0xfb, 0x03, 0xdc,
+	0xa2, 0x5f, 0xbd, 0x68, 0xab, 0x15, 0xda, 0x43, 0x1c, 0x84, 0xc6, 0xd0, 0xe3, 0x0c, 0x2f, 0x24,
+	0xaa, 0x86, 0x86, 0xb9, 0x6d, 0x3b, 0xd8, 0xdf, 0x6f, 0xd1, 0xf6, 0x7a, 0x76, 0xcb, 0xc7, 0x81,
+	0x1b, 0xf9, 0x26, 0x9e, 0x50, 0xfb, 0x4c, 0xdf, 0x0e, 0xb7, 0xa3, 0x5e, 0xd3, 0x74, 0x87, 0xad,
+	0xbe, 0xdb, 0x77, 0x13, 0xfd, 0xe4, 0x8b, 0x7e, 0xd0, 0xff, 0x18, 0xbb, 0xfe, 0xdb, 0x23, 0x30,
+	0xbf, 0x46, 0xba, 0xb7, 0x81, 0x3f, 0x8a, 0xb0, 0x63, 0x62, 0xf4, 0x24, 0xcc, 0x7e, 0x14, 0xe1,
+	0x08, 0xd7, 0xb5, 0x93, 0xda, 0xe9, 0x72, 0xfb, 0xc8, 0x78, 0xd4, 0xa8, 0x52, 0xe0, 0x69, 0x77,
+	0x68, 0x87, 0x78, 0xe8, 0x85, 0xfb, 0x1d, 0xc6, 0x81, 0x5e, 0x85, 0xb9, 0xeb, 0x6e, 0xaf, 0x1b,
+	0xe0, 0xb0, 0xeb, 0x18, 0x43, 0x5c, 0xcf, 0x51, 0x89, 0xfa, 0x78, 0xd4, 0x58, 0xbc, 0xee, 0xf6,
+	0x36, 0x70, 0x78, 0xd9, 0x18, 0xca, 0x62, 0x90, 0xa0, 0xe8, 0x19, 0x28, 0x46, 0x01, 0xf6, 0xbb,
+	0xb6, 0x55, 0xcf, 0x53, 0xb1, 0xc5, 0xf1, 0xa8, 0x51, 0x23, 0xd0, 0x05, 0x4b, 0x12, 0x29, 0x30,
+	0x04, 0x3d, 0x0d, 0x85, 0xbe, 0xef, 0x46, 0x5e, 0x50, 0x9f, 0x39, 0x99, 0x17, 0xdc, 0x0c, 0x91,
+	0xb9, 0x19, 0x82, 0xae, 0x40, 0x81, 0xf9, 0xac, 0x3e, 0x7b, 0x32, 0x7f, 0xba, 0x72, 0xe6, 0xb1,
+	0xa6, 0xec, 0xc8, 0xa6, 0xd2, 0x61, 0xf6, 0xc5, 0x14, 0x32, 0xba, 0xac, 0x90, 0xbb, 0xfe, 0xd3,
+	0xc3, 0x30, 0x4b, 0xf9, 0xd0, 0x15, 0x28, 0x9a, 0x3e, 0x26, 0x03, 0x5e, 0x47, 0x27, 0xb5, 0xd3,
+	0x95, 0x33, 0xcb, 0x4d, 0xe6, 0xc8, 0xa6, 0x18, 0xe8, 0xe6, 0x35, 0xe1, 0xc8, 0xf6, 0xb1, 0xf1,
+	0xa8, 0x71, 0x98, 0xb3, 0x27, 0x5a, 0x6f, 0xfe, 0xb5, 0xa1, 0x75, 0x84, 0x16, 0x74, 0x15, 0xca,
+	0x41, 0xd4, 0x1b, 0xda, 0xe1, 0x45, 0xb7, 0x47, 0xc7, 0xbc, 0x72, 0xe6, 0x11, 0xb5, 0xb9, 0x1b,
+	0x82, 0xdc, 0x7e, 0x64, 0x3c, 0x6a, 0x1c, 0x89, 0xb9, 0x13, 0x8d, 0xe7, 0x0f, 0x75, 0x12, 0x25,
+	0x68, 0x1b, 0xaa, 0x3e, 0xf6, 0x7c, 0xdb, 0xf5, 0xed, 0xd0, 0x0e, 0x30, 0xd1, 0x9b, 0xa3, 0x7a,
+	0x4f, 0xa8, 0x7a, 0x3b, 0x2a, 0x53, 0xfb, 0xc4, 0x78, 0xd4, 0x38, 0x96, 0x92, 0x54, 0x6c, 0xa4,
+	0xd5, 0xa2, 0x10, 0x50, 0x0a, 0xda, 0xc0, 0x21, 0xf5, 0x67, 0xe5, 0xcc, 0xc9, 0x5b, 0x1a, 0xdb,
+	0xc0, 0x61, 0xfb, 0xe4, 0x78, 0xd4, 0x38, 0x3e, 0x29, 0xaf, 0x98, 0xcc, 0xd0, 0x8f, 0x06, 0x50,
+	0x93, 0x51, 0x8b, 0x74, 0x70, 0x86, 0xda, 0x5c, 0x99, 0x6e, 0x93, 0x70, 0xb5, 0x57, 0xc6, 0xa3,
+	0xc6, 0x72, 0x5a, 0x56, 0xb1, 0x37, 0xa1, 0x99, 0xf8, 0xc7, 0x34, 0x1c, 0x13, 0x0f, 0x88, 0x99,
+	0xd9, 0x2c, 0xff, 0x9c, 0x15, 0x64, 0xe6, 0x9f, 0x98, 0x5b, 0xf5, 0x4f, 0x0c, 0xa3, 0x0f, 0x60,
+	0x2e, 0xfe, 0x20, 0xe3, 0x55, 0xe0, 0xf3, 0x28, 0x5b, 0x29, 0x19, 0xa9, 0xe5, 0xf1, 0xa8, 0x71,
+	0x54, 0x96, 0x51, 0x54, 0x2b, 0xda, 0x12, 0xed, 0x03, 0x36, 0x32, 0xc5, 0xe9, 0xda, 0x19, 0x87,
+	0xac, 0x7d, 0x30, 0x39, 0x22, 0x8a, 0x36, 0xa2, 0x9d, 0x04, 0x71, 0x64, 0x9a, 0x18, 0x5b, 0xd8,
+	0xaa, 0x97, 0xb2, 0xb4, 0x5f, 0x94, 0x38, 0x98, 0x76, 0x59, 0x46, 0xd5, 0x2e, 0x53, 0xc8, 0x58,
+	0x5f, 0x77, 0x7b, 0x6b, 0xbe, 0xef, 0xfa, 0x41, 0xbd, 0x9c, 0x35, 0xd6, 0x17, 0x05, 0x99, 0x8d,
+	0x75, 0xcc, 0xad, 0x8e, 0x75, 0x0c, 0xf3, 0xf6, 0x76, 0x22, 0xe7, 0x12, 0x36, 0x02, 0x6c, 0xd5,
+	0x61, 0x4a, 0x7b, 0x63, 0x8e, 0xb8, 0xbd, 0x31, 0x32, 0xd1, 0xde, 0x98, 0x82, 0x2c, 0x58, 0x60,
+	0xdf, 0xab, 0x41, 0x60, 0xf7, 0x1d, 0x6c, 0xd5, 0x2b, 0x54, 0xff, 0xf1, 0x2c, 0xfd, 0x82, 0xa7,
+	0x7d, 0x7c, 0x3c, 0x6a, 0xd4, 0x55, 0x39, 0xc5, 0x46, 0x4a, 0x27, 0xfa, 0x10, 0xe6, 0x19, 0xd2,
+	0x89, 0x1c, 0xc7, 0x76, 0xfa, 0xf5, 0x39, 0x6a, 0xe4, 0xd1, 0x2c, 0x23, 0x9c, 0xa5, 0xfd, 0xe8,
+	0x78, 0xd4, 0x78, 0x44, 0x91, 0x52, 0x4c, 0xa8, 0x0a, 0xc9, 0x8a, 0xc1, 0x80, 0xc4, 0xb1, 0xf3,
+	0x59, 0x2b, 0xc6, 0x45, 0x95, 0x89, 0xad, 0x18, 0x29, 0x49, 0x75, 0xc5, 0x48, 0x11, 0x13, 0x7f,
+	0x70, 0x27, 0x2f, 0x4c, 0xf7, 0x07, 0xf7, 0xb3, 0xe4, 0x8f, 0x0c, 0x57, 0x2b, 0xda, 0xd0, 0xc7,
+	0x40, 0x36, 0x9e, 0x73, 0x91, 0x37, 0xb0, 0x4d, 0x23, 0xc4, 0xe7, 0x70, 0x88, 0x4d, 0xb2, 0x52,
+	0x57, 0xa9, 0x15, 0x7d, 0xc2, 0xca, 0x04, 0x67, 0x5b, 0x1f, 0x8f, 0x1a, 0x2b, 0x59, 0x3a, 0x14,
+	0xab, 0x99, 0x56, 0xd0, 0x0f, 0x34, 0x58, 0x0a, 0x42, 0xc3, 0xb1, 0x8c, 0x81, 0xeb, 0xe0, 0x0b,
+	0x4e, 0xdf, 0xc7, 0x41, 0x70, 0xc1, 0xd9, 0x72, 0xeb, 0x35, 0x6a, 0xff, 0x54, 0x6a, 0x59, 0xcf,
+	0x62, 0x6d, 0x9f, 0x1a, 0x8f, 0x1a, 0x8d, 0x4c, 0x2d, 0x4a, 0x0b, 0xb2, 0x0d, 0xa1, 0x3d, 0x38,
+	0x22, 0x32, 0x83, 0xcd, 0xd0, 0x1e, 0xd8, 0x81, 0x11, 0xda, 0xae, 0x53, 0x3f, 0x4c, 0xed, 0x3f,
+	0x96, 0x5e, 0x1d, 0x27, 0x18, 0xdb, 0x8f, 0x8d, 0x47, 0x8d, 0x13, 0x19, 0x1a, 0x14, 0xdb, 0x59,
+	0x26, 0x92, 0x29, 0x74, 0xd5, 0xc7, 0x84, 0x11, 0x5b, 0xf5, 0x23, 0xd3, 0xa7, 0x50, 0xcc, 0x24,
+	0x4f, 0xa1, 0x18, 0xcc, 0x9a, 0x42, 0x31, 0x91, 0x58, 0xf2, 0x0c, 0x3f, 0xb4, 0x89, 0xd9, 0x75,
+	0xc3, 0xdf, 0xc1, 0x7e, 0x7d, 0x31, 0xcb, 0xd2, 0x55, 0x95, 0x89, 0x59, 0x4a, 0x49, 0xaa, 0x96,
+	0x52, 0x44, 0x74, 0x53, 0x03, 0xb5, 0x69, 0xb6, 0xeb, 0x74, 0x48, 0xda, 0x10, 0x90, 0xee, 0x2d,
+	0x51, 0xa3, 0x4f, 0xdc, 0xa2, 0x7b, 0x32, 0x7b, 0xfb, 0x89, 0xf1, 0xa8, 0x71, 0x6a, 0xaa, 0x36,
+	0xa5, 0x21, 0xd3, 0x8d, 0xb6, 0x8b, 0x30, 0x4b, 0x2d, 0xe9, 0xe3, 0x02, 0x1c, 0xc9, 0xf0, 0x20,
+	0x7a, 0x1d, 0x0a, 0x7e, 0xe4, 0x90, 0xb4, 0x8a, 0xe5, 0x12, 0x48, 0x6d, 0xdf, 0x66, 0x64, 0x5b,
+	0x2c, 0xa7, 0xf3, 0x23, 0x47, 0xc9, 0xb4, 0x66, 0x29, 0x40, 0xe4, 0x49, 0x4e, 0x67, 0x5b, 0x3c,
+	0x67, 0x98, 0x2a, 0x7f, 0xdd, 0xed, 0xa9, 0xf2, 0x14, 0x40, 0x18, 0xe6, 0xc5, 0xf4, 0xe8, 0xda,
+	0x64, 0xee, 0xb3, 0x6c, 0xe0, 0x71, 0x55, 0xcd, 0xdb, 0x51, 0x0f, 0xfb, 0x0e, 0x0e, 0x71, 0x20,
+	0xfa, 0x40, 0x27, 0x3f, 0x8d, 0x75, 0x5f, 0x42, 0x24, 0xfd, 0x73, 0x32, 0x8e, 0x7e, 0xa6, 0x41,
+	0x7d, 0x68, 0xec, 0x75, 0x05, 0x18, 0x74, 0xb7, 0x5c, 0xbf, 0xeb, 0x61, 0xdf, 0x76, 0x2d, 0x9a,
+	0x22, 0x56, 0xce, 0x7c, 0xe7, 0xb6, 0xd3, 0xbd, 0xb9, 0x6e, 0xec, 0x09, 0x38, 0x78, 0xd3, 0xf5,
+	0xaf, 0x52, 0xf1, 0x35, 0x27, 0xf4, 0xf7, 0xdb, 0x27, 0xbe, 0x18, 0x35, 0x0e, 0x8d, 0x47, 0x8d,
+	0xa5, 0x61, 0x16, 0x4f, 0x27, 0x1b, 0x46, 0x9f, 0x6a, 0x70, 0x34, 0x74, 0x43, 0x63, 0xd0, 0x35,
+	0xa3, 0x61, 0x34, 0x30, 0x42, 0x7b, 0x17, 0x77, 0xa3, 0xc0, 0xe8, 0x63, 0x9e, 0x89, 0xbe, 0x76,
+	0xfb, 0x46, 0x5d, 0x23, 0xf2, 0x67, 0x63, 0xf1, 0x4d, 0x22, 0xcd, 0xda, 0x74, 0x9c, 0xb7, 0x69,
+	0x31, 0xcc, 0x60, 0xe9, 0x64, 0xa2, 0xcb, 0xbf, 0xd4, 0x60, 0x79, 0x7a, 0x37, 0xd1, 0x29, 0xc8,
+	0xef, 0xe0, 0x7d, 0x9e, 0xeb, 0x1f, 0x1e, 0x8f, 0x1a, 0xf3, 0x3b, 0x78, 0x5f, 0x1a, 0x75, 0x42,
+	0x45, 0xdf, 0x83, 0xd9, 0x5d, 0x63, 0x10, 0x61, 0x3e, 0x25, 0x9a, 0x4d, 0x56, 0x99, 0x34, 0xe5,
+	0xca, 0xa4, 0xe9, 0xed, 0xf4, 0x09, 0xd0, 0x14, 0x1e, 0x69, 0xbe, 0x13, 0x19, 0x4e, 0x68, 0x87,
+	0xfb, 0x6c, 0xba, 0x50, 0x05, 0xf2, 0x74, 0xa1, 0xc0, 0xab, 0xb9, 0x97, 0xb5, 0xe5, 0xcf, 0x34,
+	0x38, 0x36, 0xb5, 0xd3, 0xdf, 0x84, 0x16, 0xea, 0x5d, 0x98, 0x21, 0x13, 0x9f, 0x54, 0x21, 0xdb,
+	0x76, 0x7f, 0xfb, 0xa5, 0x17, 0x68, 0x73, 0x0a, 0xac, 0x68, 0x60, 0x88, 0x5c, 0x34, 0x30, 0x84,
+	0x54, 0x52, 0x03, 0xf7, 0xc6, 0x4b, 0x2f, 0xd0, 0x46, 0x15, 0x98, 0x11, 0x0a, 0xc8, 0x46, 0x28,
+	0xa0, 0xff, 0xa6, 0x00, 0xe5, 0x38, 0xcd, 0x97, 0x62, 0x50, 0xbb, 0xa3, 0x18, 0x3c, 0x0f, 0x35,
+	0x0b, 0x5b, 0x7c, 0x7f, 0xb2, 0x5d, 0x47, 0x44, 0x73, 0x99, 0xad, 0x81, 0x0a, 0x4d, 0x91, 0xaf,
+	0xa6, 0x48, 0xe8, 0x0c, 0x94, 0x78, 0x3a, 0xbc, 0x4f, 0x03, 0x79, 0xbe, 0x7d, 0x74, 0x3c, 0x6a,
+	0x20, 0x81, 0x49, 0xa2, 0x31, 0x1f, 0xea, 0x00, 0xb8, 0xbd, 0xeb, 0xd8, 0x0c, 0xd7, 0x71, 0x68,
+	0xf0, 0xc4, 0xbc, 0xae, 0xf6, 0xe0, 0x4a, 0x4c, 0x67, 0xd5, 0x62, 0xc2, 0x2f, 0x57, 0x8b, 0x09,
+	0x8a, 0x3e, 0x00, 0x18, 0x1a, 0xb6, 0xc3, 0xe4, 0x78, 0x16, 0xae, 0x4f, 0x5b, 0x52, 0xd6, 0x63,
+	0x4e, 0xa6, 0x3d, 0x91, 0x94, 0xb5, 0x27, 0x28, 0xa9, 0xe9, 0x98, 0xad, 0xa0, 0x5e, 0xa0, 0x51,
+	0xba, 0x32, 0x4d, 0x35, 0x57, 0xbb, 0x44, 0xea, 0x3a, 0x2e, 0x22, 0xe9, 0x14, 0x5a, 0xc8, 0xb0,
+	0x0d, 0xec, 0x2d, 0x4c, 0x2a, 0x7a, 0x9a, 0x7f, 0xf3, 0x61, 0x13, 0x98, 0x3c, 0x6c, 0x02, 0x43,
+	0x2f, 0x03, 0x18, 0xe1, 0xba, 0x1b, 0x84, 0x57, 0x1c, 0x13, 0xd3, 0xbc, 0xba, 0xc4, 0x9a, 0x9f,
+	0xa0, 0x72, 0xf3, 0x13, 0x14, 0xbd, 0x06, 0x15, 0x8f, 0x6f, 0x15, 0xbd, 0x01, 0xa6, 0x79, 0x73,
+	0x89, 0x96, 0x9e, 0x4b, 0x12, 0x2c, 0xc9, 0xca, 0xdc, 0xe8, 0x2d, 0xa8, 0x9a, 0xae, 0x63, 0x46,
+	0xbe, 0x8f, 0x1d, 0x73, 0x7f, 0xc3, 0xd8, 0xc2, 0x34, 0x47, 0x2e, 0xb1, 0xa9, 0x92, 0x22, 0xc9,
+	0x53, 0x25, 0x45, 0x42, 0x2f, 0x42, 0x39, 0x30, 0xb7, 0xb1, 0x15, 0x0d, 0xb0, 0x4f, 0xd3, 0xe0,
+	0x32, 0x2f, 0x57, 0x05, 0x28, 0x09, 0x27, 0x9c, 0xa4, 0xf1, 0x76, 0x10, 0xe7, 0x52, 0x34, 0xb5,
+	0xe5, 0x8d, 0x97, 0x60, 0xb9, 0xf1, 0x12, 0xac, 0xff, 0x51, 0x83, 0xc5, 0x2c, 0xbf, 0xa7, 0xe6,
+	0xa0, 0x76, 0x4f, 0xe6, 0xe0, 0xbb, 0x50, 0xf2, 0x5c, 0xab, 0x1b, 0x78, 0xd8, 0xe4, 0xcb, 0x4c,
+	0x6a, 0x06, 0x5e, 0x75, 0xad, 0x0d, 0x0f, 0x9b, 0xdf, 0xb5, 0xc3, 0xed, 0xd5, 0x5d, 0xd7, 0xb6,
+	0x2e, 0xd9, 0x01, 0x9f, 0x2a, 0x1e, 0xa3, 0x28, 0x9b, 0x7c, 0x91, 0x83, 0xed, 0x12, 0x14, 0x98,
+	0x15, 0xfd, 0x4f, 0x79, 0xa8, 0xa5, 0xe7, 0xda, 0xff, 0x53, 0x57, 0xd0, 0x7b, 0x50, 0xb4, 0x59,
+	0x36, 0xca, 0xb7, 0xfd, 0x6f, 0x49, 0x0b, 0x71, 0x33, 0x39, 0x0f, 0x6b, 0xee, 0x3e, 0xd7, 0xe4,
+	0x69, 0x2b, 0x1d, 0x02, 0xaa, 0x99, 0x4b, 0xaa, 0x9a, 0x39, 0x88, 0x3a, 0x50, 0x0c, 0xb0, 0xbf,
+	0x6b, 0x9b, 0x98, 0xaf, 0x28, 0x0d, 0x59, 0xb3, 0xe9, 0xfa, 0x98, 0xe8, 0xdc, 0x60, 0x2c, 0x89,
+	0x4e, 0x2e, 0xa3, 0xea, 0xe4, 0x20, 0x7a, 0x17, 0xca, 0xa6, 0xeb, 0x6c, 0xd9, 0xfd, 0x75, 0xc3,
+	0xe3, 0x6b, 0xca, 0x89, 0x2c, 0xad, 0x67, 0x05, 0x13, 0xaf, 0xef, 0xc5, 0x67, 0xaa, 0xbe, 0x8f,
+	0xb9, 0x12, 0x87, 0xfe, 0x63, 0x06, 0x20, 0x71, 0x0e, 0x7a, 0x05, 0x2a, 0x78, 0x0f, 0x9b, 0x51,
+	0xe8, 0xfa, 0x62, 0x71, 0xe7, 0xc7, 0x65, 0x02, 0x56, 0x56, 0x63, 0x48, 0x50, 0x12, 0x5d, 0x8e,
+	0x31, 0xc4, 0x81, 0x67, 0x98, 0xe2, 0x9c, 0x8d, 0x36, 0x26, 0x06, 0xe5, 0xe8, 0x8a, 0x41, 0xf4,
+	0x6d, 0x98, 0xa1, 0x27, 0x73, 0xec, 0x88, 0x0d, 0x8d, 0x47, 0x8d, 0x05, 0x47, 0x3d, 0x93, 0xa3,
+	0x74, 0xf4, 0x06, 0xcc, 0xef, 0xc4, 0x13, 0x8f, 0xb4, 0x6d, 0x86, 0x0a, 0xd0, 0x7c, 0x2c, 0x21,
+	0x28, 0xad, 0x9b, 0x93, 0x71, 0xb4, 0x05, 0x15, 0xc3, 0x71, 0xdc, 0x90, 0x6e, 0x1c, 0xe2, 0xd8,
+	0xed, 0xc9, 0x69, 0xd3, 0xb4, 0xb9, 0x9a, 0xf0, 0xb2, 0xd4, 0x86, 0x46, 0xbc, 0xa4, 0x41, 0x8e,
+	0x78, 0x09, 0x46, 0x1d, 0x28, 0x0c, 0x8c, 0x1e, 0x1e, 0x88, 0x95, 0xfa, 0xf1, 0xa9, 0x26, 0x2e,
+	0x51, 0x36, 0xa6, 0x9d, 0xee, 0xd3, 0x4c, 0x4e, 0xde, 0xa7, 0x19, 0xb2, 0xbc, 0x05, 0xb5, 0x74,
+	0x7b, 0x0e, 0x96, 0x75, 0x3c, 0x29, 0x67, 0x1d, 0xe5, 0xdb, 0xe6, 0x39, 0x06, 0x54, 0xa4, 0x46,
+	0xdd, 0x0f, 0x13, 0xfa, 0xaf, 0x34, 0x58, 0xcc, 0x8a, 0x5d, 0xb4, 0x2e, 0x45, 0xbc, 0xc6, 0x8f,
+	0x0f, 0x32, 0xa6, 0x3a, 0x97, 0x9d, 0x12, 0xea, 0x49, 0xa0, 0xb7, 0x61, 0xc1, 0x71, 0x2d, 0xdc,
+	0x35, 0x88, 0x81, 0x81, 0x1d, 0x84, 0xf5, 0x1c, 0x3d, 0x96, 0xa5, 0xc7, 0x0e, 0x84, 0xb2, 0x2a,
+	0x08, 0x92, 0xf4, 0xbc, 0x42, 0xd0, 0x7f, 0xac, 0x41, 0x35, 0x75, 0x2a, 0x78, 0xd7, 0x99, 0x8f,
+	0x9c, 0xaf, 0xe4, 0x0e, 0x96, 0xaf, 0xe8, 0xe7, 0x01, 0x4d, 0x1e, 0x4e, 0x2a, 0x9a, 0xb4, 0x03,
+	0x6a, 0xfa, 0x44, 0x83, 0x5a, 0xfa, 0xcc, 0xf1, 0x81, 0x74, 0xe9, 0x6d, 0x28, 0xc7, 0xe7, 0x87,
+	0x77, 0xdb, 0x00, 0xfd, 0x1a, 0xcc, 0xb1, 0x31, 0x79, 0xd3, 0x1e, 0x84, 0xd8, 0x47, 0xe7, 0xa0,
+	0x10, 0x84, 0x46, 0x88, 0x83, 0xba, 0x76, 0x32, 0x7f, 0x7a, 0xe1, 0xcc, 0xd1, 0xc9, 0xc3, 0x3f,
+	0x42, 0x66, 0x41, 0xc7, 0x38, 0xe5, 0xa0, 0x63, 0x08, 0xd1, 0x2a, 0x1f, 0x71, 0xde, 0x23, 0xad,
+	0x97, 0x85, 0xd6, 0xc1, 0x3d, 0x19, 0x7c, 0xfd, 0x77, 0x1a, 0xeb, 0x7c, 0x7c, 0x7e, 0x75, 0xb7,
+	0xde, 0xec, 0x27, 0xe5, 0x31, 0xa9, 0x63, 0x03, 0x1a, 0x37, 0x07, 0x2d, 0x8f, 0x69, 0x74, 0x29,
+	0xe2, 0x72, 0x74, 0x29, 0x04, 0xfd, 0x9f, 0xac, 0xe5, 0xc9, 0x59, 0xe5, 0x83, 0x3e, 0x18, 0x48,
 	0x6d, 0x7e, 0xf9, 0xff, 0x62, 0xf3, 0x7b, 0x06, 0x8a, 0x74, 0xb5, 0x89, 0xf7, 0x25, 0x3a, 0x09,
-	0x08, 0xa4, 0x5e, 0xf7, 0x30, 0x44, 0xff, 0x97, 0x06, 0x0b, 0xea, 0xa9, 0xe9, 0x03, 0xef, 0xfc,
-	0x84, 0xdb, 0xf3, 0xf7, 0xcf, 0xed, 0xf3, 0xca, 0x61, 0xee, 0xc3, 0xd3, 0xf5, 0x9f, 0xe7, 0xe0,
-	0x68, 0xb6, 0x9a, 0xfb, 0x92, 0x43, 0x9f, 0x07, 0xb2, 0x1b, 0xd2, 0x13, 0x5a, 0x36, 0x30, 0x4b,
-	0x13, 0x29, 0x34, 0xed, 0x82, 0xd8, 0x4a, 0x27, 0x4e, 0x61, 0x85, 0x38, 0x7a, 0x0f, 0x2a, 0xb6,
-	0x74, 0xde, 0xcb, 0x32, 0xe7, 0x63, 0xaa, 0x36, 0xf9, 0x94, 0x97, 0xe6, 0x4a, 0xf6, 0x94, 0xb3,
-	0x5d, 0x59, 0x55, 0xbb, 0x00, 0x33, 0xb6, 0xb3, 0xe5, 0xea, 0xbb, 0x50, 0xe4, 0xcd, 0x41, 0xcf,
-	0x43, 0x99, 0xc6, 0x12, 0x4d, 0x0b, 0x59, 0xee, 0x41, 0xf7, 0x13, 0x02, 0xa6, 0x6e, 0x5c, 0x4b,
-	0x02, 0x43, 0x2f, 0x01, 0x90, 0xec, 0xc1, 0x89, 0x86, 0x3d, 0xec, 0xd3, 0xee, 0xce, 0xb2, 0xf4,
-	0xd3, 0x73, 0xad, 0xcb, 0x14, 0x94, 0xd3, 0xcf, 0x18, 0xd4, 0x7f, 0x9d, 0x83, 0x8a, 0x7c, 0xc2,
-	0x7c, 0x47, 0xc6, 0x3f, 0x06, 0x51, 0x1a, 0x74, 0x0d, 0xcb, 0x22, 0x7f, 0xb1, 0x58, 0x36, 0x5b,
-	0x53, 0x07, 0x49, 0xfc, 0xbf, 0x2a, 0x24, 0x58, 0x22, 0x48, 0xef, 0xf0, 0xec, 0x14, 0x49, 0xb2,
-	0x5a, 0x4b, 0xd3, 0x96, 0x77, 0x60, 0x29, 0x53, 0x95, 0x9c, 0xbe, 0xcd, 0xde, 0xab, 0xf4, 0xed,
-	0x77, 0xb3, 0xb0, 0x94, 0x79, 0xb2, 0xff, 0xc0, 0xa3, 0x58, 0x8d, 0xa0, 0xfc, 0x3d, 0x89, 0xa0,
-	0x4f, 0xb4, 0x2c, 0xcf, 0xb2, 0xf3, 0xd7, 0x57, 0x0e, 0x70, 0xdd, 0x71, 0xaf, 0x7c, 0xac, 0x4e,
-	0xcb, 0xd9, 0x3b, 0x8a, 0x89, 0xc2, 0x41, 0x63, 0x02, 0x3d, 0xcb, 0x32, 0x71, 0x6a, 0xab, 0x48,
-	0x6d, 0x89, 0x15, 0x22, 0x65, 0xaa, 0xc8, 0x21, 0x52, 0x9c, 0x09, 0x09, 0x56, 0xff, 0x95, 0x92,
-	0xe2, 0x8c, 0xf3, 0xa4, 0x4b, 0xc0, 0x39, 0x19, 0xff, 0xdf, 0xce, 0xe1, 0x7f, 0x6b, 0x50, 0x4d,
-	0x5d, 0xf5, 0x3d, 0x3c, 0x7b, 0xd0, 0x4f, 0x35, 0x28, 0xc7, 0xb7, 0xcc, 0x77, 0x9d, 0x2c, 0xae,
-	0x42, 0x01, 0xb3, 0x9b, 0x4e, 0xb6, 0xdc, 0x1d, 0x49, 0xbd, 0x44, 0x21, 0x34, 0xfe, 0xf6, 0x24,
-	0x75, 0xb9, 0xd9, 0xe1, 0x82, 0xfa, 0x9f, 0xe2, 0x34, 0x30, 0x69, 0xd3, 0x03, 0x75, 0x45, 0xd2,
-	0xa7, 0xfc, 0x9d, 0xf6, 0xe9, 0xf7, 0x25, 0x98, 0xa5, 0x7c, 0xa4, 0x36, 0x0a, 0xb1, 0x3f, 0xb4,
-	0x1d, 0x63, 0x40, 0xbb, 0x53, 0x62, 0x71, 0x2b, 0x30, 0x39, 0x6e, 0x05, 0x86, 0xb6, 0xa1, 0x9a,
-	0x9c, 0x5c, 0x50, 0x35, 0xd9, 0x0f, 0x5c, 0xde, 0x56, 0x99, 0xd8, 0x91, 0x66, 0x4a, 0x52, 0xbd,
-	0x01, 0x4c, 0x11, 0x91, 0x05, 0x0b, 0xa6, 0xeb, 0x84, 0x86, 0xed, 0x60, 0x9f, 0x19, 0xca, 0x67,
-	0x5d, 0xf0, 0x9f, 0x55, 0x78, 0xd8, 0x05, 0xbf, 0x2a, 0xa7, 0x5e, 0xf0, 0xab, 0x34, 0xf4, 0x21,
-	0xcc, 0x8b, 0x54, 0x99, 0x19, 0x99, 0xc9, 0xba, 0xe0, 0x5f, 0x93, 0x59, 0xd8, 0x94, 0x56, 0xa4,
-	0xd4, 0x0b, 0x7e, 0x85, 0x84, 0x06, 0x50, 0xf3, 0x5c, 0x6b, 0xd3, 0xe1, 0xe7, 0xae, 0x46, 0x6f,
-	0x80, 0xf9, 0x71, 0xd9, 0xca, 0x44, 0xca, 0xa3, 0x70, 0xb1, 0xa5, 0x38, 0x2d, 0xab, 0x3e, 0x99,
-	0x49, 0x53, 0xd1, 0x07, 0x30, 0x37, 0x20, 0x15, 0xcb, 0xda, 0x9e, 0x67, 0xfb, 0xd8, 0xca, 0x7e,
-	0xe0, 0x72, 0x49, 0xe2, 0x60, 0x0b, 0xa1, 0x2c, 0xa3, 0x5e, 0xf2, 0xcb, 0x14, 0xe2, 0xfd, 0xa1,
-	0xb1, 0xd7, 0x89, 0x9c, 0x60, 0x6d, 0x8f, 0x3f, 0x56, 0x28, 0x66, 0x79, 0x7f, 0x5d, 0x65, 0x62,
-	0xde, 0x4f, 0x49, 0xaa, 0xde, 0x4f, 0x11, 0xd1, 0x25, 0xba, 0xce, 0x33, 0x97, 0xb0, 0x87, 0x2e,
+	0x08, 0xa4, 0xde, 0x15, 0x31, 0x44, 0xff, 0x97, 0x06, 0x0b, 0xea, 0x91, 0xeb, 0x03, 0xef, 0xfc,
+	0x84, 0xdb, 0xf3, 0xf7, 0xcf, 0xed, 0xf3, 0xca, 0x49, 0xf0, 0xc3, 0xd3, 0xf5, 0x9f, 0xe7, 0xe0,
+	0x68, 0xb6, 0x9a, 0xfb, 0x92, 0x43, 0x9f, 0x07, 0xb2, 0x1b, 0xd2, 0xe3, 0x5d, 0x36, 0x30, 0x4b,
+	0x13, 0x29, 0x34, 0xed, 0x82, 0xd8, 0x4a, 0x27, 0x8e, 0x70, 0x85, 0x38, 0x7a, 0x0f, 0x2a, 0xb6,
+	0x74, 0x58, 0xcc, 0x32, 0xe7, 0x63, 0xaa, 0x36, 0xf9, 0x88, 0x98, 0x55, 0x47, 0x53, 0x0e, 0x86,
+	0x65, 0x55, 0xed, 0x02, 0xcc, 0xd8, 0xce, 0x96, 0xab, 0xef, 0x42, 0x91, 0x37, 0x07, 0x3d, 0x0f,
+	0x65, 0x1a, 0x4b, 0x34, 0x2d, 0x64, 0xb9, 0x07, 0xdd, 0x4f, 0x08, 0x98, 0xba, 0xae, 0x2d, 0x09,
+	0x0c, 0xbd, 0x04, 0x40, 0xb2, 0x07, 0x27, 0x1a, 0xf6, 0xb0, 0x4f, 0xbb, 0x3b, 0xcb, 0xd2, 0x4f,
+	0xcf, 0xb5, 0x2e, 0x53, 0x50, 0x4e, 0x3f, 0x63, 0x50, 0xff, 0x75, 0x0e, 0x2a, 0xf2, 0xf1, 0xf4,
+	0x1d, 0x19, 0xff, 0x18, 0x44, 0x69, 0xd0, 0x35, 0x2c, 0x8b, 0xfc, 0xc5, 0x62, 0xd9, 0x6c, 0x4d,
+	0x1d, 0x24, 0xf1, 0xff, 0xaa, 0x90, 0x60, 0x89, 0x20, 0xbd, 0x00, 0xb4, 0x53, 0x24, 0xc9, 0x6a,
+	0x2d, 0x4d, 0x5b, 0xde, 0x81, 0xa5, 0x4c, 0x55, 0x72, 0xfa, 0x36, 0x7b, 0xaf, 0xd2, 0xb7, 0xdf,
+	0xcf, 0xc2, 0x52, 0xe6, 0xb5, 0xc0, 0x03, 0x8f, 0x62, 0x35, 0x82, 0xf2, 0xf7, 0x24, 0x82, 0x3e,
+	0xd1, 0xb2, 0x3c, 0xcb, 0x0e, 0x6f, 0x5f, 0x39, 0xc0, 0x5d, 0xc9, 0xbd, 0xf2, 0xb1, 0x3a, 0x2d,
+	0x67, 0xef, 0x28, 0x26, 0x0a, 0x07, 0x8d, 0x09, 0xf4, 0x2c, 0xcb, 0xc4, 0xa9, 0xad, 0x22, 0xb5,
+	0x25, 0x56, 0x88, 0x94, 0xa9, 0x22, 0x87, 0x48, 0x71, 0x26, 0x24, 0x58, 0xfd, 0x57, 0x4a, 0x8a,
+	0x33, 0xce, 0x93, 0x2e, 0x01, 0xe7, 0x64, 0xfc, 0x7f, 0x3b, 0x87, 0xff, 0xad, 0x41, 0x35, 0x75,
+	0x4f, 0xf8, 0xf0, 0xec, 0x41, 0x3f, 0xd5, 0xa0, 0x1c, 0x5f, 0x51, 0xdf, 0x75, 0xb2, 0xb8, 0x0a,
+	0x05, 0xcc, 0xae, 0x49, 0xd9, 0x72, 0x77, 0x24, 0xf5, 0x8c, 0x85, 0xd0, 0xf8, 0xc3, 0x95, 0xd4,
+	0xcd, 0x68, 0x87, 0x0b, 0xea, 0x7f, 0x8e, 0xd3, 0xc0, 0xa4, 0x4d, 0x0f, 0xd4, 0x15, 0x49, 0x9f,
+	0xf2, 0x77, 0xda, 0xa7, 0x3f, 0x94, 0x60, 0x96, 0xf2, 0x91, 0xda, 0x28, 0xc4, 0xfe, 0xd0, 0x76,
+	0x8c, 0x01, 0xed, 0x4e, 0x89, 0xc5, 0xad, 0xc0, 0xe4, 0xb8, 0x15, 0x18, 0xda, 0x86, 0x6a, 0x72,
+	0x72, 0x41, 0xd5, 0x64, 0xbf, 0x8e, 0x79, 0x5b, 0x65, 0x62, 0xe7, 0xa1, 0x29, 0x49, 0xf5, 0xfa,
+	0x30, 0x45, 0x44, 0x16, 0x2c, 0x98, 0xae, 0x13, 0x1a, 0xb6, 0x83, 0x7d, 0x66, 0x28, 0x9f, 0xf5,
+	0x3a, 0xe0, 0xac, 0xc2, 0xc3, 0x5e, 0x07, 0xa8, 0x72, 0xea, 0xeb, 0x00, 0x95, 0x86, 0x3e, 0x84,
+	0x79, 0x91, 0x2a, 0x33, 0x23, 0x33, 0x59, 0xaf, 0x03, 0xd6, 0x64, 0x16, 0x36, 0xa5, 0x15, 0x29,
+	0xf5, 0x75, 0x80, 0x42, 0x42, 0x03, 0xa8, 0x79, 0xae, 0xb5, 0xe9, 0xf0, 0x43, 0x5b, 0xa3, 0x37,
+	0xc0, 0xfc, 0xb8, 0x6c, 0x65, 0x22, 0xe5, 0x51, 0xb8, 0xd8, 0x52, 0x9c, 0x96, 0x55, 0xdf, 0xdb,
+	0xa4, 0xa9, 0xe8, 0x03, 0x98, 0x1b, 0x90, 0x8a, 0x65, 0x6d, 0xcf, 0xb3, 0x7d, 0x6c, 0x65, 0xbf,
+	0x8e, 0xb9, 0x24, 0x71, 0xb0, 0x85, 0x50, 0x96, 0x51, 0x5f, 0x08, 0xc8, 0x14, 0xe2, 0xfd, 0xa1,
+	0xb1, 0xd7, 0x89, 0x9c, 0x60, 0x6d, 0x8f, 0xbf, 0x74, 0x28, 0x66, 0x79, 0x7f, 0x5d, 0x65, 0x62,
+	0xde, 0x4f, 0x49, 0xaa, 0xde, 0x4f, 0x11, 0xd1, 0x25, 0xba, 0xce, 0x33, 0x97, 0xb0, 0x57, 0x32,
 	0x47, 0x27, 0x46, 0x8b, 0x79, 0x83, 0xd5, 0xf3, 0xfc, 0x4b, 0x51, 0x1a, 0x6b, 0xe0, 0x3e, 0xa0,
-	0xdd, 0xee, 0xe0, 0x30, 0xf2, 0x1d, 0x6c, 0xf1, 0x37, 0x2e, 0x93, 0x3e, 0x50, 0xb8, 0x62, 0x1f,
-	0x28, 0xe8, 0x84, 0x0f, 0x14, 0x2a, 0x99, 0x53, 0x9e, 0x6b, 0x5d, 0x63, 0x21, 0x13, 0xc6, 0x2f,
-	0x5f, 0x1e, 0x9d, 0x30, 0x95, 0xb0, 0xb0, 0x39, 0xa5, 0x48, 0xa9, 0x73, 0x4a, 0x21, 0xf1, 0xc7,
-	0x16, 0xf2, 0xd5, 0x3c, 0x1b, 0xa9, 0xca, 0x94, 0xc7, 0x16, 0x13, 0x9c, 0xf1, 0x63, 0x8b, 0x09,
-	0xca, 0xc4, 0x63, 0x8b, 0x49, 0xd9, 0x12, 0x14, 0x7c, 0x6c, 0x04, 0xae, 0xa3, 0x7f, 0xa6, 0x41,
-	0x35, 0x15, 0xe9, 0xe8, 0x75, 0x88, 0xaf, 0x8b, 0xaf, 0xed, 0x7b, 0x22, 0x51, 0x55, 0xae, 0x97,
-	0x09, 0x9e, 0x75, 0xbd, 0x4c, 0x70, 0x74, 0x09, 0x20, 0xde, 0x15, 0x6e, 0xb5, 0x4c, 0xd2, 0x2c,
+	0xdd, 0xee, 0xe0, 0x30, 0xf2, 0x1d, 0x6c, 0xf1, 0x07, 0x32, 0x93, 0x3e, 0x50, 0xb8, 0x62, 0x1f,
+	0x28, 0xe8, 0x84, 0x0f, 0x14, 0x2a, 0x99, 0x53, 0x9e, 0x6b, 0x5d, 0x63, 0x21, 0x13, 0xc6, 0xcf,
+	0x66, 0x1e, 0x9d, 0x30, 0x95, 0xb0, 0xb0, 0x39, 0xa5, 0x48, 0xa9, 0x73, 0x4a, 0x21, 0xf1, 0x97,
+	0x1a, 0xf2, 0xbd, 0x3e, 0x1b, 0xa9, 0xca, 0x94, 0x97, 0x1a, 0x13, 0x9c, 0xf1, 0x4b, 0x8d, 0x09,
+	0xca, 0xc4, 0x4b, 0x8d, 0x49, 0xd9, 0x12, 0x14, 0x7c, 0x6c, 0x04, 0xae, 0xa3, 0x7f, 0xa6, 0x41,
+	0x35, 0x15, 0xe9, 0xe8, 0x75, 0x88, 0xef, 0x9a, 0xaf, 0xed, 0x7b, 0x22, 0x51, 0x55, 0xee, 0xa6,
+	0x09, 0x9e, 0x75, 0x37, 0x4d, 0x70, 0x74, 0x09, 0x20, 0xde, 0x15, 0x6e, 0xb5, 0x4c, 0xd2, 0x2c,
 	0x29, 0xe1, 0x94, 0xb3, 0xa4, 0x04, 0xd5, 0xbf, 0xcc, 0x43, 0x49, 0x4c, 0x95, 0xfb, 0x52, 0xc8,
-	0xb4, 0xa0, 0x38, 0xc4, 0x01, 0xbd, 0x66, 0xce, 0x25, 0xf9, 0x08, 0x87, 0xe4, 0x7c, 0x84, 0x43,
-	0x6a, 0xba, 0x94, 0xbf, 0xa3, 0x74, 0x69, 0xe6, 0xc0, 0xe9, 0x12, 0xa6, 0x57, 0x4c, 0xd2, 0x82,
-	0x27, 0x0e, 0x97, 0x6f, 0xbd, 0x8a, 0x8a, 0x0b, 0x28, 0x59, 0x30, 0x75, 0x01, 0x25, 0x93, 0xd0,
-	0x0e, 0x1c, 0x96, 0x0e, 0xc0, 0xd9, 0xe4, 0xa0, 0x4b, 0xcf, 0xc2, 0xf4, 0xfb, 0xbc, 0x0e, 0xe5,
-	0x62, 0x01, 0xb6, 0x93, 0x42, 0xe5, 0x7c, 0x33, 0x4d, 0xd3, 0xff, 0x96, 0x83, 0x05, 0xb5, 0xbd,
+	0xb4, 0xa0, 0x38, 0xc4, 0x01, 0xbd, 0xa3, 0xce, 0x25, 0xf9, 0x08, 0x87, 0xe4, 0x7c, 0x84, 0x43,
+	0x6a, 0xba, 0x94, 0xbf, 0xa3, 0x74, 0x69, 0xe6, 0xc0, 0xe9, 0x12, 0xa6, 0xf7, 0x53, 0xd2, 0x82,
+	0x27, 0x0e, 0x97, 0x6f, 0xbd, 0x8a, 0x8a, 0xdb, 0x2b, 0x59, 0x30, 0x75, 0x7b, 0x25, 0x93, 0xd0,
+	0x0e, 0x1c, 0x96, 0x0e, 0xc0, 0xd9, 0xe4, 0xa0, 0x4b, 0xcf, 0xc2, 0xf4, 0xcb, 0xc0, 0x0e, 0xe5,
+	0x62, 0x01, 0xb6, 0x93, 0x42, 0xe5, 0x7c, 0x33, 0x4d, 0xd3, 0xff, 0x9e, 0x83, 0x05, 0xb5, 0xbd,
 	0xf7, 0xc5, 0xb1, 0xcf, 0x43, 0x19, 0xef, 0xd9, 0x61, 0xd7, 0x74, 0x2d, 0xcc, 0x8b, 0x36, 0xea,
 	0x27, 0x02, 0x9e, 0x75, 0x2d, 0xc5, 0x4f, 0x02, 0x93, 0x67, 0x43, 0xfe, 0x40, 0xb3, 0xe1, 0x69,
 	0x11, 0x4b, 0xf2, 0xd9, 0x8c, 0x9f, 0x1e, 0x04, 0xce, 0x93, 0x3d, 0xce, 0xe5, 0xfb, 0x34, 0xce,
 	0x37, 0x73, 0x50, 0x4b, 0xaf, 0x87, 0xdf, 0x8c, 0x10, 0x52, 0xa3, 0x21, 0x7f, 0xe0, 0x68, 0x78,
-	0x03, 0xe6, 0x49, 0xf6, 0x66, 0x84, 0x21, 0x7f, 0x26, 0x35, 0x43, 0xb3, 0x1e, 0xb6, 0x36, 0x45,
+	0x03, 0xe6, 0x49, 0xf6, 0x66, 0x84, 0x21, 0x7f, 0x63, 0x35, 0x43, 0xb3, 0x1e, 0xb6, 0x36, 0x45,
 	0xce, 0xaa, 0xc0, 0x95, 0xb5, 0x49, 0xc2, 0xf5, 0x1f, 0xe6, 0x60, 0x5e, 0x59, 0xb7, 0x1f, 0xbe,
 	0x25, 0x45, 0xaf, 0xc2, 0xbc, 0x92, 0x0e, 0xe9, 0x3f, 0x62, 0xf3, 0x44, 0xcd, 0x43, 0x1e, 0xbe,
 	0x71, 0x59, 0x80, 0x39, 0x39, 0xaf, 0xd2, 0x0f, 0x43, 0x35, 0x95, 0x06, 0xe9, 0x47, 0x61, 0x31,
-	0x6b, 0x33, 0xd6, 0x3f, 0xd7, 0x28, 0x61, 0xf2, 0x59, 0xe3, 0x79, 0x00, 0x07, 0xdf, 0xe8, 0xde,
+	0x6b, 0x33, 0xd6, 0x3f, 0xd7, 0x28, 0x61, 0xf2, 0x4d, 0xe4, 0x79, 0x00, 0x07, 0xdf, 0xe8, 0xde,
 	0xb6, 0x0c, 0x62, 0xbd, 0xc2, 0x37, 0x2e, 0xa6, 0xaa, 0x86, 0x92, 0xc0, 0x88, 0x26, 0x77, 0x60,
 	0x75, 0x6f, 0x5b, 0x7c, 0x50, 0x4d, 0xee, 0xc0, 0x9a, 0xd0, 0x24, 0x30, 0xfd, 0x27, 0x79, 0x51,
-	0xa1, 0x26, 0xef, 0x02, 0xdf, 0x87, 0x9a, 0x27, 0x3e, 0x6e, 0xdf, 0x5a, 0x9a, 0xa3, 0xc7, 0xfc,
+	0xa1, 0x26, 0x8f, 0x0a, 0xdf, 0x87, 0x9a, 0x27, 0x3e, 0x6e, 0xdf, 0x5a, 0x9a, 0xa3, 0xc7, 0xfc,
 	0x69, 0x4b, 0x0b, 0x2a, 0x45, 0xd5, 0xcd, 0x8b, 0xaf, 0xdc, 0x01, 0x75, 0x77, 0x52, 0x55, 0xd8,
-	0x82, 0x4a, 0x41, 0xdf, 0x87, 0xc3, 0xe2, 0x41, 0xc6, 0x2e, 0x16, 0x0d, 0xcf, 0x4f, 0x55, 0xce,
-	0x9e, 0x31, 0xc6, 0x02, 0xe9, 0x96, 0x57, 0x53, 0xa4, 0x94, 0x7a, 0xde, 0xf6, 0x99, 0x83, 0xaa,
-	0x4f, 0x37, 0xbe, 0x9a, 0x22, 0x91, 0x72, 0xb9, 0x9a, 0x7a, 0x69, 0x89, 0xce, 0x41, 0x89, 0xfe,
-	0x10, 0xe3, 0xd6, 0x1e, 0xa0, 0x81, 0x43, 0xf9, 0x14, 0x0b, 0x45, 0x0e, 0xa1, 0x17, 0xa1, 0x1c,
-	0x3f, 0xc8, 0xe4, 0xd7, 0x66, 0x2c, 0x04, 0x04, 0xa8, 0x84, 0x80, 0x00, 0xf5, 0x5f, 0x68, 0x70,
-	0x6c, 0xea, 0x2b, 0xcc, 0x07, 0x5d, 0x3b, 0x3f, 0xf5, 0x2c, 0x94, 0xc4, 0x3d, 0x18, 0x02, 0x28,
+	0x82, 0x4a, 0x41, 0xdf, 0x87, 0xc3, 0xe2, 0x35, 0xc7, 0x2e, 0x16, 0x0d, 0xcf, 0x4f, 0x55, 0xce,
+	0xde, 0x40, 0xc6, 0x02, 0xe9, 0x96, 0x57, 0x53, 0xa4, 0x94, 0x7a, 0xde, 0xf6, 0x99, 0x83, 0xaa,
+	0x4f, 0x37, 0xbe, 0x9a, 0x22, 0x91, 0x72, 0xb9, 0x9a, 0x7a, 0xa6, 0x89, 0xce, 0x41, 0x89, 0xfe,
+	0x8a, 0xe3, 0xd6, 0x1e, 0xa0, 0x81, 0x43, 0xf9, 0x14, 0x0b, 0x45, 0x0e, 0xa1, 0x17, 0xa1, 0x1c,
+	0xbf, 0xe6, 0xe4, 0xd7, 0x66, 0x2c, 0x04, 0x04, 0xa8, 0x84, 0x80, 0x00, 0xf5, 0x5f, 0x68, 0x70,
+	0x6c, 0xea, 0x13, 0xce, 0x07, 0x5d, 0x3b, 0x3f, 0xf5, 0x2c, 0x94, 0xc4, 0x3d, 0x18, 0x02, 0x28,
 	0xbc, 0xb3, 0xb9, 0xb6, 0xb9, 0x76, 0xae, 0x76, 0x08, 0x55, 0xa0, 0x78, 0x75, 0xed, 0xf2, 0xb9,
 	0x0b, 0x97, 0xdf, 0xaa, 0x69, 0xe4, 0xa3, 0xb3, 0x79, 0xf9, 0x32, 0xf9, 0xc8, 0x3d, 0x75, 0x49,
 	0x7e, 0x50, 0xc2, 0x76, 0x45, 0x34, 0x07, 0xa5, 0x55, 0xcf, 0xa3, 0x71, 0xcb, 0x64, 0xd7, 0x76,
 	0x6d, 0x12, 0xab, 0x35, 0x0d, 0x15, 0x21, 0x7f, 0xe5, 0xca, 0x7a, 0x2d, 0x87, 0x16, 0xa1, 0x76,
 	0x0e, 0x1b, 0xd6, 0xc0, 0x76, 0xb0, 0x88, 0xfd, 0x5a, 0xbe, 0x7d, 0xfd, 0x8b, 0xaf, 0x56, 0xb4,
-	0x2f, 0xbf, 0x5a, 0xd1, 0xfe, 0xfa, 0xd5, 0x8a, 0x76, 0xf3, 0xeb, 0x95, 0x43, 0x5f, 0x7e, 0xbd,
-	0x72, 0xe8, 0xcf, 0x5f, 0xaf, 0x1c, 0x7a, 0xff, 0x59, 0xe9, 0x87, 0x43, 0xac, 0x4f, 0x9e, 0xef,
-	0x92, 0x65, 0x8f, 0x7f, 0xb5, 0xd2, 0x3f, 0x95, 0xfa, 0x3c, 0x77, 0x62, 0x95, 0x7e, 0x5e, 0x65,
-	0x7c, 0xcd, 0x0b, 0x6e, 0x93, 0x01, 0xf4, 0x97, 0x32, 0x41, 0xaf, 0x40, 0x7f, 0x11, 0xf3, 0xfc,
-	0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x15, 0xfd, 0x0f, 0x2c, 0x65, 0x35, 0x00, 0x00,
+	0x2f, 0xbf, 0x5a, 0xd1, 0xfe, 0xf6, 0xd5, 0x8a, 0x76, 0xf3, 0xeb, 0x95, 0x43, 0x5f, 0x7e, 0xbd,
+	0x72, 0xe8, 0x2f, 0x5f, 0xaf, 0x1c, 0x7a, 0xff, 0x59, 0xe9, 0x57, 0x47, 0xac, 0x4f, 0x9e, 0xef,
+	0x92, 0x65, 0x8f, 0x7f, 0xb5, 0xd2, 0xbf, 0xb3, 0xfa, 0x3c, 0x77, 0x62, 0x95, 0x7e, 0x5e, 0x65,
+	0x7c, 0xcd, 0x0b, 0x6e, 0x93, 0x01, 0xf4, 0x67, 0x36, 0x41, 0xaf, 0x40, 0x7f, 0x4e, 0xf3, 0xfc,
+	0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xcb, 0xad, 0xb1, 0xc8, 0xa2, 0x35, 0x00, 0x00,
 }
 
 func (m *EventSequence) Marshal() (dAtA []byte, err error) {
@@ -4206,6 +4216,16 @@ func (m *SubmitJob) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	if m.IsDuplicate {
+		i--
+		if m.IsDuplicate {
+			dAtA[i] = 1
+		} else {
+			dAtA[i] = 0
+		}
+		i--
+		dAtA[i] = 0x60
+	}
 	if len(m.Scheduler) > 0 {
 		i -= len(m.Scheduler)
 		copy(dAtA[i:], m.Scheduler)
@@ -6861,6 +6881,9 @@ func (m *SubmitJob) Size() (n int) {
 	if l > 0 {
 		n += 1 + l + sovEvents(uint64(l))
 	}
+	if m.IsDuplicate {
+		n += 2
+	}
 	return n
 }
 
@@ -9611,6 +9634,26 @@ func (m *SubmitJob) Unmarshal(dAtA []byte) error {
 			}
 			m.Scheduler = string(dAtA[iNdEx:postIndex])
 			iNdEx = postIndex
+		case 12:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field IsDuplicate", wireType)
+			}
+			var v int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowEvents
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				v |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			m.IsDuplicate = bool(v != 0)
 		default:
 			iNdEx = preIndex
 			skippy, err := skipEvents(dAtA[iNdEx:])
diff --git a/pkg/armadaevents/events.proto b/pkg/armadaevents/events.proto
index eb0c29f2..74d13208 100644
--- a/pkg/armadaevents/events.proto
+++ b/pkg/armadaevents/events.proto
@@ -160,6 +160,8 @@ message SubmitJob {
     // Indicates which scheduler should manage this job.
     // If empty, the default scheduler is used.
     string scheduler = 11;
+    // Indicates whether job is a duplicate
+    bool isDuplicate = 12;
 }
 
 // Kubernetes objects that can serve as main objects for an Armada job.


Test patch:
diff --git a/internal/common/ingest/testfixtures/event.go b/internal/common/ingest/testfixtures/event.go
index 81ff9af2..b1ec9c19 100644
--- a/internal/common/ingest/testfixtures/event.go
+++ b/internal/common/ingest/testfixtures/event.go
@@ -104,6 +104,53 @@ var Submit = &armadaevents.EventSequence_Event{
 	},
 }
 
+var SubmitDuplicate = &armadaevents.EventSequence_Event{
+	Created: &BaseTime,
+	Event: &armadaevents.EventSequence_Event_SubmitJob{
+		SubmitJob: &armadaevents.SubmitJob{
+			IsDuplicate:     true,
+			JobId:           JobIdProto,
+			Priority:        Priority,
+			AtMostOnce:      true,
+			Preemptible:     true,
+			ConcurrencySafe: true,
+			ObjectMeta: &armadaevents.ObjectMeta{
+				Namespace: Namespace,
+				Name:      "test-job",
+			},
+			MainObject: &armadaevents.KubernetesMainObject{
+				Object: &armadaevents.KubernetesMainObject_PodSpec{
+					PodSpec: &armadaevents.PodSpecWithAvoidList{
+						PodSpec: &v1.PodSpec{
+							NodeSelector:      NodeSelector,
+							Tolerations:       Tolerations,
+							PriorityClassName: PriorityClassName,
+							Containers: []v1.Container{
+								{
+									Name:    "container1",
+									Image:   "alpine:latest",
+									Command: []string{"myprogram.sh"},
+									Args:    []string{"foo", "bar"},
+									Resources: v1.ResourceRequirements{
+										Limits: map[v1.ResourceName]resource.Quantity{
+											"memory": resource.MustParse("64Mi"),
+											"cpu":    resource.MustParse("150m"),
+										},
+										Requests: map[v1.ResourceName]resource.Quantity{
+											"memory": resource.MustParse("64Mi"),
+											"cpu":    resource.MustParse("150m"),
+										},
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	},
+}
+
 var Assigned = &armadaevents.EventSequence_Event{
 	Created: &BaseTime,
 	Event: &armadaevents.EventSequence_Event_JobRunAssigned{
diff --git a/internal/lookoutingester/instructions/instructions_test.go b/internal/lookoutingester/instructions/instructions_test.go
index 57e5474e..c533be17 100644
--- a/internal/lookoutingester/instructions/instructions_test.go
+++ b/internal/lookoutingester/instructions/instructions_test.go
@@ -16,6 +16,7 @@ import (
 	"github.com/armadaproject/armada/internal/common/compress"
 	"github.com/armadaproject/armada/internal/common/eventutil"
 	"github.com/armadaproject/armada/internal/common/ingest"
+	"github.com/armadaproject/armada/internal/common/ingest/testfixtures"
 	"github.com/armadaproject/armada/internal/common/pulsarutils"
 	"github.com/armadaproject/armada/internal/lookout/repository"
 	"github.com/armadaproject/armada/internal/lookoutingester/metrics"
@@ -346,6 +347,17 @@ func TestSubmit(t *testing.T) {
 	assert.Equal(t, expected, instructions)
 }
 
+// Single duplicate submit message is ignored
+func TestDuplicate(t *testing.T) {
+	svc := SimpleInstructionConverter()
+	msg := NewMsg(testfixtures.SubmitDuplicate)
+	instructions := svc.Convert(context.Background(), msg)
+	expected := &model.InstructionSet{
+		MessageIds: msg.MessageIds,
+	}
+	assert.Equal(t, expected, instructions)
+}
+
 // Happy path of submit -> assigned -> running -> succeeded
 // All in a single update
 // Single submit message
diff --git a/internal/lookoutingesterv2/instructions/instructions_test.go b/internal/lookoutingesterv2/instructions/instructions_test.go
index 550d1dfd..45bb234e 100644
--- a/internal/lookoutingesterv2/instructions/instructions_test.go
+++ b/internal/lookoutingesterv2/instructions/instructions_test.go
@@ -320,6 +320,15 @@ func TestConvert(t *testing.T) {
 				MessageIds:      []pulsar.MessageID{pulsarutils.NewMessageId(1)},
 			},
 		},
+		"duplicate submit is ignored": {
+			events: &ingest.EventSequencesWithIds{
+				EventSequences: []*armadaevents.EventSequence{testfixtures.NewEventSequence(testfixtures.SubmitDuplicate)},
+				MessageIds:     []pulsar.MessageID{pulsarutils.NewMessageId(1)},
+			},
+			expected: &model.InstructionSet{
+				MessageIds: []pulsar.MessageID{pulsarutils.NewMessageId(1)},
+			},
+		},
 		"preempted": {
 			events: &ingest.EventSequencesWithIds{
 				EventSequences: []*armadaevents.EventSequence{testfixtures.NewEventSequence(testfixtures.JobPreempted)},
diff --git a/internal/lookoutingesterv2/lookoutdb/insertion_test.go b/internal/lookoutingesterv2/lookoutdb/insertion_test.go
index 4b7c2ab2..9f7e8545 100644
--- a/internal/lookoutingesterv2/lookoutdb/insertion_test.go
+++ b/internal/lookoutingesterv2/lookoutdb/insertion_test.go
@@ -623,7 +623,9 @@ func TestCreateUserAnnotationsBatch(t *testing.T) {
 func TestStoreWithEmptyInstructionSet(t *testing.T) {
 	err := lookout.WithLookoutDb(func(db *pgxpool.Pool) error {
 		ldb := NewLookoutDb(db, m, 2, 10)
-		err := ldb.Store(ctx.Background(), &model.InstructionSet{})
+		err := ldb.Store(ctx.Background(), &model.InstructionSet{
+			MessageIds: []pulsar.MessageID{pulsarutils.NewMessageId(1)},
+		})
 		assert.NoError(t, err)
 		assertNoRows(t, ldb.db, "job")
 		assertNoRows(t, ldb.db, "job_run")
@@ -767,6 +769,27 @@ func TestConflateJobUpdatesWithPreempted(t *testing.T) {
 	assert.Equal(t, expected, updates)
 }
 
+func TestConflateJobUpdatesWithNullState(t *testing.T) {
+	updates := conflateJobUpdates([]*model.UpdateJobInstruction{
+		{JobId: jobIdString, State: pointer.Int32(lookout.JobFailedOrdinal)},
+		{JobId: jobIdString, LatestRunId: pointer.String("test-id")},
+	})
+
+	// Ignored because terminal event received
+	expected := []*model.UpdateJobInstruction{
+		{JobId: jobIdString, State: pointer.Int32(lookout.JobFailedOrdinal)},
+	}
+
+	sort.Slice(updates, func(i, j int) bool {
+		return updates[i].JobId < updates[j].JobId
+	})
+
+	sort.Slice(expected, func(i, j int) bool {
+		return expected[i].JobId < expected[j].JobId
+	})
+	assert.Equal(t, expected, updates)
+}
+
 func TestConflateJobRunUpdates(t *testing.T) {
 	// Empty
 	updates := conflateJobRunUpdates([]*model.UpdateJobRunInstruction{})
diff --git a/internal/scheduleringester/instructions_test.go b/internal/scheduleringester/instructions_test.go
index 2f71c17c..ae174f4c 100644
--- a/internal/scheduleringester/instructions_test.go
+++ b/internal/scheduleringester/instructions_test.go
@@ -70,6 +70,10 @@ func TestConvertSequence(t *testing.T) {
 				}),
 			}}},
 		},
+		"ignores duplicate submit": {
+			events:   []*armadaevents.EventSequence_Event{f.SubmitDuplicate},
+			expected: []DbOperation{},
+		},
 		"job run leased": {
 			events: []*armadaevents.EventSequence_Event{f.Leased},
 			expected: []DbOperation{InsertRuns{f.RunIdUuid: &schedulerdb.Run{