diff --git a/prover/zkevm/prover/common/flatten_column.go b/prover/zkevm/prover/common/flatten_column.go new file mode 100644 index 00000000000..abba73be652 --- /dev/null +++ b/prover/zkevm/prover/common/flatten_column.go @@ -0,0 +1,245 @@ +package common + +import ( + "github.com/consensys/linea-monorepo/prover/maths/common/smartvectors" + "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/column" + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/projection" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/utils" +) + +const ( + // NbLimbU32 represents the number of 16-bit limbs for a 32-bit integer. + NbLimbU32 = 2 + // NbLimbU64 represents the number of 16-bit limbs for a 64-bit integer. + NbLimbU64 = 4 + // NbLimbEthAddress represents the number of 16-bit limbs for an Ethereum address (160 bits). + NbLimbEthAddress = 10 + // NbLimbU128 represents the number of 16-bit limbs for a 128-bit integer. + NbLimbU128 = 8 + // NbLimbU256 represents the number of 16-bit limbs for a 256-bit integer. + NbLimbU256 = 16 +) + +// FlattenColumn flattens multiple limb columns and an accompanying mask into single columns, +// provides consistency checks via a precomputed projection mask. +type FlattenColumn struct { + // originalLimbs holds the original limb columns to flatten. + originalLimbs []ifaces.Column + // originalMask holds the original mask column that selects elements for gnark circuit. + originalMask ifaces.Column + + // limbs is the row-wise concatenation of all limb columns. + limbs ifaces.Column + // mask is the row-wise concatenation of the original mask column. + mask ifaces.Column + // auxProjectionMask selects flattenLimbs's positions to validate flattening consistency. + auxProjectionMask ifaces.Column + // onesColumn selects elements from the original limbs. This is always a column of 1s. + onesColumn ifaces.Column + + // nbLimbsCols is the number of limb columns to flatten. + nbLimbsCols int + // size is the length of the produced flattened column. + size int + // isDuplicated indicates if this FlattenColumn is already registered by other circuit, + // so we don't need to commit to a new one. + isDuplicated bool +} + +// NewFlattenColumn initializes a FlattenColumn with: +// - size: length of the original limbs columns +// - nbLimbsCols: number of limb columns to flatten +// - limbs: original limb columns to flatten +// - mask: original mask column for original limbs +// +// It commits placeholders for flattened limbs and mask, and precomputes the projection mask. +func NewFlattenColumn(comp *wizard.CompiledIOP, nbLimbsCols int, limbs []ifaces.Column, mask ifaces.Column) *FlattenColumn { + onesColumnID := ifaces.ColIDf("%s_FLATTEN_ORIG_LIMBS_MASK", limbs[0].GetColID()) + + initialSize := mask.Size() + + // If the column already exists, we assume it is already registered by another circuit. + var isDuplicated bool + var onesColumn ifaces.Column + if comp.Columns.Exists(onesColumnID) { + onesColumn = comp.Columns.GetHandle(onesColumnID) + } else { + onesColumn = comp.InsertPrecomputed(onesColumnID, smartvectors.NewConstant(field.One(), initialSize)) + } + + flattenSize := utils.NextPowerOfTwo(initialSize * nbLimbsCols) + res := &FlattenColumn{ + size: flattenSize, + originalMask: mask, + originalLimbs: limbs, + nbLimbsCols: nbLimbsCols, + onesColumn: onesColumn, + isDuplicated: isDuplicated, + } + + res.initColumns(comp) + res.mask = comp.InsertCommit(0, res.MaskColID(), flattenSize) + + return res +} + +// Limbs returns the flattened limbs column. +func (l *FlattenColumn) Limbs() ifaces.Column { + return l.limbs +} + +// Mask returns the flattened mask column. +func (l *FlattenColumn) Mask() ifaces.Column { + return l.mask +} + +// LimbsColID returns the column ID of the flattened limbs. +func (l *FlattenColumn) LimbsColID() ifaces.ColID { + return ifaces.ColIDf("%s_FLATTEN_LIMBS", l.originalLimbs[0].GetColID()) +} + +// MaskColID returns the column ID of the flattened mask. +func (l *FlattenColumn) MaskColID() ifaces.ColID { + return ifaces.ColIDf("%s_FLATTEN_MASK", l.originalMask.GetColID()) +} + +// CsFlattenProjection adds a single batched projection constraint that enforces +// the “flattened” limbs and mask columns exactly match the row‐wise concatenation +// of the original limb columns and their mask. +// +// It works by: +// 1. Shifting the committed flattened limbs and mask by 0…nbLimbsCols−1 rows. +// 2. Duplicating the original limbs and mask into nbLimbsCols slots. +// 3. Using auxProjectionMask (a sparse selector with a 1 at each block start) +// and a onesColumn to feed into the projection gadget. +// 4. Requiring at each selected position that +// shiftedFlattenLimbs[i] == originalLimbs[i] +// shiftedFlattenMask[i] == originalMask +// for all limb indices i and row positions. +// +// Suppose nbLimbsCols = 3, size = 4: +// original limbs (rows × limbs): +// +// r\i 0 1 2 +// 0 [a0, b0, c0] +// 1 [a1, b1, c1] +// 2 [a2, b2, c2] +// 3 [a3, b3, c3] +// +// flattened (size*3 = 12): +// +// [a0, b0, c0, a1, b1, c1, a2, b2, c2, a3, b3, c3] +// +// shift0 (i=0): +// +// [a0, b0, c0, a1, b1, c1, a2, b2, c2, a3, b3, c3] +// +// shift1 (i=1): +// +// [b0, c0, a1, b1, c1, a2, b2, c2, a3, b3, c3, 0 ] +// +// shift2 (i=2): +// +// [c0, a1, b1, c1, a2, b2, c2, a3, b3, c3, 0, 0 ] +// +// auxProjectionMask = [1,0,0, 1,0,0, 1,0,0, 1,0,0] +// +// At each ‘1’ at idx = r*3, for shift i, enforce: +// +// shift_i[idx] == original[r][i] +// +// CsFlattenProjection batches all these equalities into one projection check. +func (l *FlattenColumn) CsFlattenProjection(comp *wizard.CompiledIOP) { + masks := make([]ifaces.Column, l.nbLimbsCols) + shiftedFlattenLimbs := make([]ifaces.Column, l.nbLimbsCols) + shiftedFlattenMask := make([]ifaces.Column, l.nbLimbsCols) + + for i := 0; i < l.nbLimbsCols; i++ { + masks[i] = l.originalMask + shiftedFlattenLimbs[i] = column.Shift(l.limbs, i) + shiftedFlattenMask[i] = column.Shift(l.mask, i) + } + + projection.InsertProjection(comp, + ifaces.QueryIDf("%v_FLATTEN_LIMBS_PROJECTION", l.originalMask.GetColID()), + append(shiftedFlattenLimbs[:], shiftedFlattenMask[:]...), + append(l.originalLimbs[:], masks[:]...), + l.auxProjectionMask, l.onesColumn, + ) +} + +// initColumns initializes the FlattenColumn by committing to the flattened limbs +// and mask columns, and precomputing the projection mask. +func (l *FlattenColumn) initColumns(comp *wizard.CompiledIOP) { + baseID := l.LimbsColID() + auxProjectionMaskID := ifaces.ColIDf("%s_PROJECTION_MASK", baseID) + + // If the column already exists, we assume it is already registered by another circuit. + if comp.Columns.Exists(baseID) { + l.isDuplicated = true + + l.limbs = comp.Columns.GetHandle(baseID) + l.auxProjectionMask = comp.Columns.GetHandle(auxProjectionMaskID) + + return + } + + l.limbs = comp.InsertCommit(0, baseID, l.size) + l.auxProjectionMask = comp.InsertPrecomputed(auxProjectionMaskID, + precomputeAuxProjectionMask(l.size, l.originalMask.Size(), l.nbLimbsCols)) +} + +// Run maps trace limb columns and mask into the flattened columns. +func (l *FlattenColumn) Run(run *wizard.ProverRuntime) { + l.assignMask(run) + + if !run.Columns.Exists(l.limbs.GetColID()) { + l.assignLimbs(run) + } +} + +func (l *FlattenColumn) assignMask(run *wizard.ProverRuntime) { + maskCol := l.originalMask.GetColAssignment(run).IntoRegVecSaveAlloc() + + flattenMask := NewVectorBuilder(l.mask) + for i := 0; i < l.originalMask.Size(); i++ { + for j := 0; j < l.nbLimbsCols; j++ { + flattenMask.PushField(maskCol[i]) + } + } + + flattenMask.PadAndAssign(run, field.Zero()) +} + +func (l *FlattenColumn) assignLimbs(run *wizard.ProverRuntime) { + limbsCols := make([][]field.Element, l.nbLimbsCols) + for i, limb := range l.originalLimbs { + limbsCols[i] = limb.GetColAssignment(run).IntoRegVecSaveAlloc() + } + + flattenLimbs := NewVectorBuilder(l.limbs) + for i := 0; i < l.originalMask.Size(); i++ { + for j := 0; j < l.nbLimbsCols; j++ { + flattenLimbs.PushField(limbsCols[j][i]) + } + } + + flattenLimbs.PadAndAssign(run, field.Zero()) +} + +// precomputeAuxProjectionMask creates a SmartVector with total size `size`, +// where `nbMasked` positions are periodically set to one. +func precomputeAuxProjectionMask(size, nbMarks, period int) smartvectors.SmartVector { + resSlice := make([]field.Element, size) + + offset := 0 + for i := 0; i < nbMarks; i++ { + resSlice[offset].SetOne() + offset += period + } + + return smartvectors.NewRegular(resSlice) +} diff --git a/prover/zkevm/prover/common/flatten_column_test.go b/prover/zkevm/prover/common/flatten_column_test.go new file mode 100644 index 00000000000..a582197b139 --- /dev/null +++ b/prover/zkevm/prover/common/flatten_column_test.go @@ -0,0 +1,160 @@ +package common + +import ( + "testing" + "github.com/consensys/linea-monorepo/prover/utils/csvtraces" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "fmt" + "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/stretchr/testify/assert" +) + +type testModuleSource struct { + CsTest ifaces.Column + Limbs []ifaces.Column +} + +func TestFlattenColumn(t *testing.T) { + testCases := []struct { + InputFName string + ModuleFName string + NbLimbs int + }{ + { + InputFName: "testdata/flatten_column/default_input.csv", + ModuleFName: "testdata/flatten_column/default_module.csv", + NbLimbs: 8, + }, + { + InputFName: "testdata/flatten_column/three_cols_input.csv", + ModuleFName: "testdata/flatten_column/three_cols_module.csv", + NbLimbs: 3, + }, + { + InputFName: "testdata/flatten_column/alternating_mask_input.csv", + ModuleFName: "testdata/flatten_column/alternating_mask_module.csv", + NbLimbs: 8, + }, + } + + for _, tc := range testCases { + t.Run(tc.InputFName, func(t *testing.T) { + + modCt := csvtraces.MustOpenCsvFile(tc.ModuleFName) + inpCt := csvtraces.MustOpenCsvFile(tc.InputFName) + + var inp *testModuleSource + var flattenColumn *FlattenColumn + + cmp := wizard.Compile(func(build *wizard.Builder) { + comp := build.CompiledIOP + + inp = &testModuleSource{ + CsTest: inpCt.GetCommit(build, "CS_TEST"), + Limbs: make([]ifaces.Column, tc.NbLimbs), + } + + for i := range tc.NbLimbs { + inp.Limbs[i] = inpCt.GetCommit(build, fmt.Sprintf("LIMB_%d", i)) + } + + flattenColumn = NewFlattenColumn(comp, tc.NbLimbs, inp.Limbs[:], inp.CsTest) + flattenColumn.CsFlattenProjection(comp) + }, dummy.Compile) + + proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) { + var limbsInpColsNames []string + limbsInpColsNames = append(limbsInpColsNames, string(inp.CsTest.GetColID())) + for i := 0; i < tc.NbLimbs; i++ { + limbsInpColsNames = append(limbsInpColsNames, string(inp.Limbs[i].GetColID())) + } + + inpCt.Assign(run, limbsInpColsNames...) + + flattenColumn.Run(run) + + modCt.CheckAssignment(run, + string(flattenColumn.LimbsColID()), + string(flattenColumn.MaskColID()), + ) + }) + + assert.NoError(t, wizard.Verify(cmp, proof), "proof failed") + }) + } +} + +func TestFlattenSharedColColumn(t *testing.T) { + testCases := []struct { + InputFName string + ModuleFName string + NbLimbs int + }{ + { + InputFName: "testdata/flatten_column/shared_limbs_input.csv", + ModuleFName: "testdata/flatten_column/shared_limbs_module.csv", + NbLimbs: 8, + }, + } + + for _, tc := range testCases { + t.Run(tc.InputFName, func(t *testing.T) { + + modCt := csvtraces.MustOpenCsvFile(tc.ModuleFName) + inpCt := csvtraces.MustOpenCsvFile(tc.InputFName) + + var inpA, inpB *testModuleSource + var flattenColumnA, flattenColumnB *FlattenColumn + + cmp := wizard.Compile(func(build *wizard.Builder) { + comp := build.CompiledIOP + + inpA = &testModuleSource{ + CsTest: inpCt.GetCommit(build, "CS_MODULE_A"), + Limbs: make([]ifaces.Column, tc.NbLimbs), + } + + inpB = &testModuleSource{ + CsTest: inpCt.GetCommit(build, "CS_MODULE_B"), + Limbs: make([]ifaces.Column, tc.NbLimbs), + } + + for i := range tc.NbLimbs { + limbCommit := inpCt.GetCommit(build, fmt.Sprintf("LIMB_%d", i)) + inpA.Limbs[i] = limbCommit + inpB.Limbs[i] = limbCommit + } + + flattenColumnA = NewFlattenColumn(comp, tc.NbLimbs, inpA.Limbs[:], inpA.CsTest) + flattenColumnA.CsFlattenProjection(comp) + + flattenColumnB = NewFlattenColumn(comp, tc.NbLimbs, inpB.Limbs[:], inpB.CsTest) + flattenColumnB.CsFlattenProjection(comp) + }, dummy.Compile) + + proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) { + var limbsInpColsNames []string + limbsInpColsNames = append(limbsInpColsNames, string(inpA.CsTest.GetColID())) + limbsInpColsNames = append(limbsInpColsNames, string(inpB.CsTest.GetColID())) + for i := 0; i < tc.NbLimbs; i++ { + limbsInpColsNames = append(limbsInpColsNames, string(inpA.Limbs[i].GetColID())) + } + + inpCt.Assign(run, limbsInpColsNames...) + + flattenColumnA.Run(run) + flattenColumnB.Run(run) + + modCt.CheckAssignment(run, + string(flattenColumnA.LimbsColID()), + string(flattenColumnA.MaskColID()), + string(flattenColumnB.LimbsColID()), + string(flattenColumnB.MaskColID()), + ) + }) + + assert.NoError(t, wizard.Verify(cmp, proof), "proof failed") + }) + } +} diff --git a/prover/zkevm/prover/common/testdata/flatten_column/alternating_mask_input.csv b/prover/zkevm/prover/common/testdata/flatten_column/alternating_mask_input.csv new file mode 100644 index 00000000000..7c8c2e45e1b --- /dev/null +++ b/prover/zkevm/prover/common/testdata/flatten_column/alternating_mask_input.csv @@ -0,0 +1,7 @@ +CS_TEST,LIMB_0,LIMB_1,LIMB_2,LIMB_3,LIMB_4,LIMB_5,LIMB_6,LIMB_7 +1,401,402,403,404,405,406,407,408 +0,411,412,413,414,415,416,417,418 +1,421,422,423,424,425,426,427,428 +0,431,432,433,434,435,436,437,438 +1,441,442,443,444,445,446,447,448 +0,451,452,453,454,455,456,457,458 diff --git a/prover/zkevm/prover/common/testdata/flatten_column/alternating_mask_module.csv b/prover/zkevm/prover/common/testdata/flatten_column/alternating_mask_module.csv new file mode 100644 index 00000000000..3fdbf28d489 --- /dev/null +++ b/prover/zkevm/prover/common/testdata/flatten_column/alternating_mask_module.csv @@ -0,0 +1,49 @@ +LIMB_0_FLATTEN_LIMBS,CS_TEST_FLATTEN_MASK +401,1 +402,1 +403,1 +404,1 +405,1 +406,1 +407,1 +408,1 +411,0 +412,0 +413,0 +414,0 +415,0 +416,0 +417,0 +418,0 +421,1 +422,1 +423,1 +424,1 +425,1 +426,1 +427,1 +428,1 +431,0 +432,0 +433,0 +434,0 +435,0 +436,0 +437,0 +438,0 +441,1 +442,1 +443,1 +444,1 +445,1 +446,1 +447,1 +448,1 +451,0 +452,0 +453,0 +454,0 +455,0 +456,0 +457,0 +458,0 diff --git a/prover/zkevm/prover/common/testdata/flatten_column/default_input.csv b/prover/zkevm/prover/common/testdata/flatten_column/default_input.csv new file mode 100644 index 00000000000..79a3eff61fe --- /dev/null +++ b/prover/zkevm/prover/common/testdata/flatten_column/default_input.csv @@ -0,0 +1,3 @@ +CS_TEST,LIMB_0,LIMB_1,LIMB_2,LIMB_3,LIMB_4,LIMB_5,LIMB_6,LIMB_7 +1,11,12,13,14,15,16,17,18 +0,21,22,23,24,25,26,27,28 diff --git a/prover/zkevm/prover/common/testdata/flatten_column/default_module.csv b/prover/zkevm/prover/common/testdata/flatten_column/default_module.csv new file mode 100644 index 00000000000..6ca61ead40f --- /dev/null +++ b/prover/zkevm/prover/common/testdata/flatten_column/default_module.csv @@ -0,0 +1,17 @@ +LIMB_0_FLATTEN_LIMBS,CS_TEST_FLATTEN_MASK +11,1 +12,1 +13,1 +14,1 +15,1 +16,1 +17,1 +18,1 +21,0 +22,0 +23,0 +24,0 +25,0 +26,0 +27,0 +28,0 diff --git a/prover/zkevm/prover/common/testdata/flatten_column/shared_limbs_input.csv b/prover/zkevm/prover/common/testdata/flatten_column/shared_limbs_input.csv new file mode 100644 index 00000000000..2087e638fdc --- /dev/null +++ b/prover/zkevm/prover/common/testdata/flatten_column/shared_limbs_input.csv @@ -0,0 +1,19 @@ +CS_MODULE_A,CS_MODULE_B,LIMB_0,LIMB_1,LIMB_2,LIMB_3,LIMB_4,LIMB_5,LIMB_6,LIMB_7 +1,0,101,102,103,104,105,106,107,108 +1,0,111,112,113,114,115,116,117,118 +1,0,121,122,123,124,125,126,127,128 +1,1,131,132,133,134,135,136,137,138 +1,1,141,142,143,144,145,146,147,148 +1,1,151,152,153,154,155,156,157,158 +0,1,161,162,163,164,165,166,167,168 +0,1,171,172,173,174,175,176,177,178 +0,1,181,182,183,184,185,186,187,188 +0,0,191,192,193,194,195,196,197,198 +1,0,201,202,203,204,205,206,207,208 +1,0,211,212,213,214,215,216,217,218 +1,1,221,222,223,224,225,226,227,228 +1,1,231,232,233,234,235,236,237,238 +1,1,241,242,243,244,245,246,247,248 +0,1,251,252,253,254,255,256,257,258 +0,1,261,262,263,264,265,266,267,268 +0,1,271,272,273,274,275,276,277,278 diff --git a/prover/zkevm/prover/common/testdata/flatten_column/shared_limbs_module.csv b/prover/zkevm/prover/common/testdata/flatten_column/shared_limbs_module.csv new file mode 100644 index 00000000000..478d402c10e --- /dev/null +++ b/prover/zkevm/prover/common/testdata/flatten_column/shared_limbs_module.csv @@ -0,0 +1,145 @@ +LIMB_0_FLATTEN_LIMBS,CS_MODULE_A_FLATTEN_MASK,CS_MODULE_B_FLATTEN_MASK +101,1,0 +102,1,0 +103,1,0 +104,1,0 +105,1,0 +106,1,0 +107,1,0 +108,1,0 +111,1,0 +112,1,0 +113,1,0 +114,1,0 +115,1,0 +116,1,0 +117,1,0 +118,1,0 +121,1,0 +122,1,0 +123,1,0 +124,1,0 +125,1,0 +126,1,0 +127,1,0 +128,1,0 +131,1,1 +132,1,1 +133,1,1 +134,1,1 +135,1,1 +136,1,1 +137,1,1 +138,1,1 +141,1,1 +142,1,1 +143,1,1 +144,1,1 +145,1,1 +146,1,1 +147,1,1 +148,1,1 +151,1,1 +152,1,1 +153,1,1 +154,1,1 +155,1,1 +156,1,1 +157,1,1 +158,1,1 +161,0,1 +162,0,1 +163,0,1 +164,0,1 +165,0,1 +166,0,1 +167,0,1 +168,0,1 +171,0,1 +172,0,1 +173,0,1 +174,0,1 +175,0,1 +176,0,1 +177,0,1 +178,0,1 +181,0,1 +182,0,1 +183,0,1 +184,0,1 +185,0,1 +186,0,1 +187,0,1 +188,0,1 +191,0,0 +192,0,0 +193,0,0 +194,0,0 +195,0,0 +196,0,0 +197,0,0 +198,0,0 +201,1,0 +202,1,0 +203,1,0 +204,1,0 +205,1,0 +206,1,0 +207,1,0 +208,1,0 +211,1,0 +212,1,0 +213,1,0 +214,1,0 +215,1,0 +216,1,0 +217,1,0 +218,1,0 +221,1,1 +222,1,1 +223,1,1 +224,1,1 +225,1,1 +226,1,1 +227,1,1 +228,1,1 +231,1,1 +232,1,1 +233,1,1 +234,1,1 +235,1,1 +236,1,1 +237,1,1 +238,1,1 +241,1,1 +242,1,1 +243,1,1 +244,1,1 +245,1,1 +246,1,1 +247,1,1 +248,1,1 +251,0,1 +252,0,1 +253,0,1 +254,0,1 +255,0,1 +256,0,1 +257,0,1 +258,0,1 +261,0,1 +262,0,1 +263,0,1 +264,0,1 +265,0,1 +266,0,1 +267,0,1 +268,0,1 +271,0,1 +272,0,1 +273,0,1 +274,0,1 +275,0,1 +276,0,1 +277,0,1 +278,0,1 diff --git a/prover/zkevm/prover/common/testdata/flatten_column/three_cols_input.csv b/prover/zkevm/prover/common/testdata/flatten_column/three_cols_input.csv new file mode 100644 index 00000000000..fa3342c427e --- /dev/null +++ b/prover/zkevm/prover/common/testdata/flatten_column/three_cols_input.csv @@ -0,0 +1,3 @@ +CS_TEST,LIMB_0,LIMB_1,LIMB_2 +1,11,12,13 +0,21,22,23 diff --git a/prover/zkevm/prover/common/testdata/flatten_column/three_cols_module.csv b/prover/zkevm/prover/common/testdata/flatten_column/three_cols_module.csv new file mode 100644 index 00000000000..b1ca7e1d5fa --- /dev/null +++ b/prover/zkevm/prover/common/testdata/flatten_column/three_cols_module.csv @@ -0,0 +1,7 @@ +LIMB_0_FLATTEN_LIMBS,CS_TEST_FLATTEN_MASK +11,1 +12,1 +13,1 +21,0 +22,0 +23,0 diff --git a/prover/zkevm/prover/ecarith/ecadd.go b/prover/zkevm/prover/ecarith/ecadd.go index fd01d31ec37..b3bd2cfd093 100644 --- a/prover/zkevm/prover/ecarith/ecadd.go +++ b/prover/zkevm/prover/ecarith/ecadd.go @@ -1,16 +1,16 @@ package ecarith import ( - "fmt" - "github.com/consensys/gnark/frontend" - "github.com/consensys/gnark/std/algebra" - "github.com/consensys/gnark/std/algebra/emulated/sw_bn254" - "github.com/consensys/gnark/std/math/bitslice" - "github.com/consensys/gnark/std/math/emulated" "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" + "github.com/consensys/gnark/std/math/emulated" + "fmt" + "github.com/consensys/gnark/std/algebra/emulated/sw_bn254" + "github.com/consensys/gnark/std/math/bitslice" + "github.com/consensys/gnark/std/algebra" ) const ( @@ -21,27 +21,34 @@ const ( nbRowsPerEcAdd = 12 ) -// EcMulIntegration integrated EC_MUL precompile call verification inside a +// EcAdd integrated EC_ADD precompile call verification inside a // gnark circuit. type EcAdd struct { *EcDataAddSource AlignedGnarkData *plonk.Alignment + flattenLimbs *common.FlattenColumn + size int *Limits } func NewEcAddZkEvm(comp *wizard.CompiledIOP, limits *Limits) *EcAdd { + src := &EcDataAddSource{ + CsEcAdd: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_ECADD"), + Index: comp.Columns.GetHandle("ecdata.INDEX"), + IsData: comp.Columns.GetHandle("ecdata.IS_ECADD_DATA"), + IsRes: comp.Columns.GetHandle("ecdata.IS_ECADD_RESULT"), + } + + for i := 0; i < common.NbLimbU128; i++ { + src.Limbs[i] = comp.Columns.GetHandle(ifaces.ColIDf("ecdata.LIMB_%d", i)) + } + return newEcAdd( comp, limits, - &EcDataAddSource{ - CsEcAdd: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_ECADD"), - Limb: comp.Columns.GetHandle("ecdata.LIMB"), - Index: comp.Columns.GetHandle("ecdata.INDEX"), - IsData: comp.Columns.GetHandle("ecdata.IS_ECADD_DATA"), - IsRes: comp.Columns.GetHandle("ecdata.IS_ECADD_RESULT"), - }, + src, []plonk.Option{plonk.WithRangecheck(16, 6, true)}, ) } @@ -50,11 +57,13 @@ func NewEcAddZkEvm(comp *wizard.CompiledIOP, limits *Limits) *EcAdd { func newEcAdd(comp *wizard.CompiledIOP, limits *Limits, src *EcDataAddSource, plonkOptions []plonk.Option) *EcAdd { size := limits.sizeEcAddIntegration() + flattenLimbs := common.NewFlattenColumn(comp, common.NbLimbU128, src.Limbs[:], src.CsEcAdd) + toAlign := &plonk.CircuitAlignmentInput{ Name: NAME_ECADD + "_ALIGNMENT", Round: ROUND_NR, - DataToCircuitMask: src.CsEcAdd, - DataToCircuit: src.Limb, + DataToCircuitMask: flattenLimbs.Mask(), + DataToCircuit: flattenLimbs.Limbs(), Circuit: NewECAddCircuit(limits), NbCircuitInstances: limits.NbCircuitInstances, PlonkOptions: plonkOptions, @@ -63,14 +72,18 @@ func newEcAdd(comp *wizard.CompiledIOP, limits *Limits, src *EcDataAddSource, pl res := &EcAdd{ EcDataAddSource: src, AlignedGnarkData: plonk.DefineAlignment(comp, toAlign), + flattenLimbs: flattenLimbs, size: size, } + flattenLimbs.CsFlattenProjection(comp) + return res } // Assign assigns the data from the trace to the gnark inputs. func (em *EcAdd) Assign(run *wizard.ProverRuntime) { + em.flattenLimbs.Run(run) em.AlignedGnarkData.Assign(run) } @@ -78,7 +91,7 @@ func (em *EcAdd) Assign(run *wizard.ProverRuntime) { // fetch data from the EC_DATA module from the arithmetization. type EcDataAddSource struct { CsEcAdd ifaces.Column - Limb ifaces.Column + Limbs [common.NbLimbU128]ifaces.Column Index ifaces.Column IsData ifaces.Column IsRes ifaces.Column @@ -93,20 +106,20 @@ type MultiECAddCircuit struct { type ECAddInstance struct { // First input to addition - P_X_hi, P_X_lo frontend.Variable `gnark:",public"` - P_Y_hi, P_Y_lo frontend.Variable `gnark:",public"` + P_X_hi, P_X_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` + P_Y_hi, P_Y_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` // Second input to addition - Q_X_hi, Q_X_lo frontend.Variable `gnark:",public"` - Q_Y_hi, Q_Y_lo frontend.Variable `gnark:",public"` + Q_X_hi, Q_X_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` + Q_Y_hi, Q_Y_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` // The result of the addition. Is provided non-deterministically by the // caller, we have to ensure that the result is correct. - R_X_hi, R_X_lo frontend.Variable `gnark:",public"` - R_Y_hi, R_Y_lo frontend.Variable `gnark:",public"` + R_X_hi, R_X_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` + R_Y_hi, R_Y_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` } -// NewECMulCircuit creates a new circuit for verifying the EC_MUL precompile +// NewECAddCircuit creates a new circuit for verifying the EC_MUL precompile // based on the defined number of inputs. func NewECAddCircuit(limits *Limits) *MultiECAddCircuit { return &MultiECAddCircuit{ diff --git a/prover/zkevm/prover/ecarith/ecadd_test.go b/prover/zkevm/prover/ecarith/ecadd_test.go index c67f25f23e7..6bcc5ad4797 100644 --- a/prover/zkevm/prover/ecarith/ecadd_test.go +++ b/prover/zkevm/prover/ecarith/ecadd_test.go @@ -7,6 +7,8 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils/csvtraces" + "fmt" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) func TestEcAddIntegration(t *testing.T) { @@ -21,11 +23,15 @@ func TestEcAddIntegration(t *testing.T) { func(b *wizard.Builder) { ecAddSource = &EcDataAddSource{ CsEcAdd: ct.GetCommit(b, "CS_ADD"), - Limb: ct.GetCommit(b, "LIMB"), Index: ct.GetCommit(b, "INDEX"), IsData: ct.GetCommit(b, "IS_DATA"), IsRes: ct.GetCommit(b, "IS_RES"), } + + for i := 0; i < common.NbLimbU128; i++ { + ecAddSource.Limbs[i] = ct.GetCommit(b, fmt.Sprintf("LIMB_%d", i)) + } + ecAdd = newEcAdd(b.CompiledIOP, limits, ecAddSource, []plonk.Option{plonk.WithRangecheck(16, 6, true)}) }, dummy.Compile, @@ -33,7 +39,7 @@ func TestEcAddIntegration(t *testing.T) { proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) { - ct.Assign(run, "CS_ADD", "LIMB", "INDEX", "IS_DATA", "IS_RES") + ct.Assign(run, "CS_ADD", "LIMB_0", "LIMB_1", "LIMB_2", "LIMB_3", "LIMB_4", "LIMB_5", "LIMB_6", "LIMB_7", "INDEX", "IS_DATA", "IS_RES") ecAdd.Assign(run) }) diff --git a/prover/zkevm/prover/ecarith/ecmul.go b/prover/zkevm/prover/ecarith/ecmul.go index df52f0a6ac4..9f246c2c2a9 100644 --- a/prover/zkevm/prover/ecarith/ecmul.go +++ b/prover/zkevm/prover/ecarith/ecmul.go @@ -1,17 +1,17 @@ package ecarith import ( - "fmt" - "github.com/consensys/gnark/frontend" - "github.com/consensys/gnark/std/algebra" - "github.com/consensys/gnark/std/algebra/algopts" - "github.com/consensys/gnark/std/algebra/emulated/sw_bn254" - "github.com/consensys/gnark/std/math/bitslice" - "github.com/consensys/gnark/std/math/emulated" "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" + "github.com/consensys/gnark/std/math/emulated" + "fmt" + "github.com/consensys/gnark/std/algebra/emulated/sw_bn254" + "github.com/consensys/gnark/std/math/bitslice" + "github.com/consensys/gnark/std/algebra" + "github.com/consensys/gnark/std/algebra/algopts" ) const ( @@ -28,21 +28,28 @@ type EcMul struct { *EcDataMulSource AlignedGnarkData *plonk.Alignment + flattenLimbs *common.FlattenColumn + size int *Limits } func NewEcMulZkEvm(comp *wizard.CompiledIOP, limits *Limits) *EcMul { + src := &EcDataMulSource{ + CsEcMul: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_ECMUL"), + Index: comp.Columns.GetHandle("ecdata.INDEX"), + IsData: comp.Columns.GetHandle("ecdata.IS_ECMUL_DATA"), + IsRes: comp.Columns.GetHandle("ecdata.IS_ECMUL_RESULT"), + } + + for i := 0; i < common.NbLimbU128; i++ { + src.Limbs[i] = comp.Columns.GetHandle(ifaces.ColIDf("ecdata.LIMB_%d", i)) + } + return newEcMul( comp, limits, - &EcDataMulSource{ - CsEcMul: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_ECMUL"), - Limb: comp.Columns.GetHandle("ecdata.LIMB"), - Index: comp.Columns.GetHandle("ecdata.INDEX"), - IsData: comp.Columns.GetHandle("ecdata.IS_ECMUL_DATA"), - IsRes: comp.Columns.GetHandle("ecdata.IS_ECMUL_RESULT"), - }, + src, []plonk.Option{plonk.WithRangecheck(16, 6, true)}, ) } @@ -51,11 +58,13 @@ func NewEcMulZkEvm(comp *wizard.CompiledIOP, limits *Limits) *EcMul { func newEcMul(comp *wizard.CompiledIOP, limits *Limits, src *EcDataMulSource, plonkOptions []plonk.Option) *EcMul { size := limits.sizeEcMulIntegration() + flattenLimbs := common.NewFlattenColumn(comp, common.NbLimbU128, src.Limbs[:], src.CsEcMul) + toAlign := &plonk.CircuitAlignmentInput{ Name: NAME_ECMUL + "_ALIGNMENT", Round: ROUND_NR, - DataToCircuitMask: src.CsEcMul, - DataToCircuit: src.Limb, + DataToCircuitMask: flattenLimbs.Mask(), + DataToCircuit: flattenLimbs.Limbs(), Circuit: NewECMulCircuit(limits), NbCircuitInstances: limits.NbCircuitInstances, PlonkOptions: plonkOptions, @@ -64,14 +73,18 @@ func newEcMul(comp *wizard.CompiledIOP, limits *Limits, src *EcDataMulSource, pl res := &EcMul{ EcDataMulSource: src, AlignedGnarkData: plonk.DefineAlignment(comp, toAlign), + flattenLimbs: flattenLimbs, size: size, } + flattenLimbs.CsFlattenProjection(comp) + return res } // Assign assigns the data from the trace to the gnark inputs. func (em *EcMul) Assign(run *wizard.ProverRuntime) { + em.flattenLimbs.Run(run) em.AlignedGnarkData.Assign(run) } @@ -79,7 +92,7 @@ func (em *EcMul) Assign(run *wizard.ProverRuntime) { // fetch data from the EC_DATA module from the arithmetization. type EcDataMulSource struct { CsEcMul ifaces.Column - Limb ifaces.Column + Limbs [common.NbLimbU128]ifaces.Column Index ifaces.Column IsData ifaces.Column IsRes ifaces.Column @@ -99,15 +112,15 @@ type ECMulInstance struct { // significant bits. The values are already range checked to be in 128 bit // range. - P_X_hi, P_X_lo frontend.Variable `gnark:",public"` - P_Y_hi, P_Y_lo frontend.Variable `gnark:",public"` + P_X_hi, P_X_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` + P_Y_hi, P_Y_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` - N_hi, N_lo frontend.Variable `gnark:",public"` + N_hi, N_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` // The result of the multiplication. Is provided by the caller, we have to // ensure that the result is correct. - R_X_hi, R_X_lo frontend.Variable `gnark:",public"` - R_Y_hi, R_Y_lo frontend.Variable `gnark:",public"` + R_X_hi, R_X_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` + R_Y_hi, R_Y_lo [common.NbLimbU128]frontend.Variable `gnark:",public"` } // NewECMulCircuit creates a new circuit for verifying the EC_MUL precompile diff --git a/prover/zkevm/prover/ecarith/ecmul_test.go b/prover/zkevm/prover/ecarith/ecmul_test.go index 7d4c1ebac76..a8261608637 100644 --- a/prover/zkevm/prover/ecarith/ecmul_test.go +++ b/prover/zkevm/prover/ecarith/ecmul_test.go @@ -13,29 +13,32 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils/csvtraces" + "fmt" + "github.com/consensys/gnark/frontend" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) var ( // 8812078025088706800239420563438698135256154119486538953196282662928678739599 - dummyPxLo = "283099484937911152101840152952769175183" - dummyPxHi = "25896369843742486929410689099938763911" + dummyPxLo = [8]frontend.Variable{54522, 64063, 19107, 64140, 47249, 36866, 4929, 24207} + dummyPxHi = [8]frontend.Variable{4987, 30108, 7206, 43510, 4530, 21165, 28317, 38023} // 19384817048585926091202754628019327561583315513931387211365745455438290666381 - dummyPyLo = "111183359799337868641726371639121593229" - dummyPyHi = "56966857330840811282595055882070803917" + dummyPyLo = [8]frontend.Variable{21413, 8925, 46471, 63591, 44678, 62564, 1446, 50061} + dummyPyHi = [8]frontend.Variable{10971, 27370, 17409, 54880, 14499, 22162, 18782, 17869} // 6392244365320561037829193157981140850021222049710818941199853670416625377985 - dummyScalarLo = "245773738942695872223709139042640798401" - dummyScalarHi = "18785117851274795320712487213606100714" + dummyScalarLo = [8]frontend.Variable{47334, 19682, 59651, 5498, 64385, 42173, 9491, 8897} + dummyScalarHi = [8]frontend.Variable{3617, 57809, 10842, 19675, 18737, 65290, 60383, 57066} // 18286867191893102909980352899825705524248643499324573950097278735467138404960 - dummyRxLo = "116681329789095301534161201352163349088" - dummyRxHi = "53740272695769426816068725118027597037" + dummyRxLo = [8]frontend.Variable{22472, 439, 2429, 45020, 55129, 27384, 35002, 21088} + dummyRxHi = [8]frontend.Variable{10350, 2, 42581, 19814, 12263, 19537, 62766, 34029} // 9901600500795379168368190931083365122151061434285910708538887599132533626517 - dummyRyLo = "44262458709865108276042827186833757845" - dummyRyHi = "29098188631960252798063832986963793337" + dummyRyLo = [8]frontend.Variable{8524, 41907, 60473, 20665, 11836, 12273, 58948, 38549} + dummyRyHi = [8]frontend.Variable{5604, 7030, 51904, 28067, 12228, 33396, 63525, 54713} ) func TestMultiEcMulCircuit(t *testing.T) { @@ -95,11 +98,15 @@ func TestEcMulIntegration(t *testing.T) { func(b *wizard.Builder) { ecMulSource = &EcDataMulSource{ CsEcMul: ct.GetCommit(b, "CS_MUL"), - Limb: ct.GetCommit(b, "LIMB"), Index: ct.GetCommit(b, "INDEX"), IsData: ct.GetCommit(b, "IS_DATA"), IsRes: ct.GetCommit(b, "IS_RES"), } + + for i := 0; i < common.NbLimbU128; i++ { + ecMulSource.Limbs[i] = ct.GetCommit(b, fmt.Sprintf("LIMB_%d", i)) + } + ecMul = newEcMul(b.CompiledIOP, limits, ecMulSource, []plonk.Option{plonk.WithRangecheck(16, 6, true)}) }, dummy.Compile, @@ -107,7 +114,7 @@ func TestEcMulIntegration(t *testing.T) { proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) { - ct.Assign(run, "CS_MUL", "LIMB", "INDEX", "IS_DATA", "IS_RES") + ct.Assign(run, "CS_MUL", "LIMB_0", "LIMB_1", "LIMB_2", "LIMB_3", "LIMB_4", "LIMB_5", "LIMB_6", "LIMB_7", "INDEX", "IS_DATA", "IS_RES") ecMul.Assign(run) }) diff --git a/prover/zkevm/prover/ecarith/testdata/ecadd_test.csv b/prover/zkevm/prover/ecarith/testdata/ecadd_test.csv index d78c6233ba7..d0d16322e07 100644 --- a/prover/zkevm/prover/ecarith/testdata/ecadd_test.csv +++ b/prover/zkevm/prover/ecarith/testdata/ecadd_test.csv @@ -1,13 +1,13 @@ -CS_ADD,LIMB,INDEX,IS_DATA,IS_RES -1,0x07a7d101deb72417b572dd3b6f908395,0,1,0 -1,0xf37a49b2315651f788236b3eb293d6aa,1,1,0 -1,0x0c4fed757e4b2b49bbccecacf69a6a1a,2,1,0 -1,0xcc5e7964c3a3aab7e95ed1dfc36eb090,3,1,0 -1,0x1921eac2ea463db9bd598dc450ddfcdf,4,1,0 -1,0x37632c82f3151abe105e0c758353e834,5,1,0 -1,0x260c5f405366aed895d6006fb4298798,6,1,1 -1,0x48bb6f3036119056a13718b5495f58a3,7,1,1 -1,0x138b1e3bed42fb008681efffafd8eda1,0,0,1 -1,0x6d00cb479b39187a5104d17f4459dbff,1,0,1 -1,0x27334cf5fc4039d14fc1c6c4e9ea640c,2,0,1 -1,0xa426aac7155a3272fd8f47e39b65948a,3,0,1 \ No newline at end of file +CS_ADD,LIMB_0,LIMB_1,LIMB_2,LIMB_3,LIMB_4,LIMB_5,LIMB_6,LIMB_7,INDEX,IS_DATA,IS_RES +1,0x07a7,0xd101,0xdeb7,0x2417,0xb572,0xdd3b,0x6f90,0x8395,0,1,0 +1,0xf37a,0x49b2,0x3156,0x51f7,0x8823,0x6b3e,0xb293,0xd6aa,1,1,0 +1,0x0c4f,0xed75,0x7e4b,0x2b49,0xbbcc,0xecac,0xf69a,0x6a1a,2,1,0 +1,0xcc5e,0x7964,0xc3a3,0xaab7,0xe95e,0xd1df,0xc36e,0xb090,3,1,0 +1,0x1921,0xeac2,0xea46,0x3db9,0xbd59,0x8dc4,0x50dd,0xfcdf,4,1,0 +1,0x3763,0x2c82,0xf315,0x1abe,0x105e,0x0c75,0x8353,0xe834,5,1,0 +1,0x260c,0x5f40,0x5366,0xaed8,0x95d6,0x006f,0xb429,0x8798,6,1,0 +1,0x48bb,0x6f30,0x3611,0x9056,0xa137,0x18b5,0x495f,0x58a3,7,1,0 +1,0x138b,0x1e3b,0xed42,0xfb00,0x8681,0xefff,0xafd8,0xeda1,0,0,1 +1,0x6d00,0xcb47,0x9b39,0x187a,0x5104,0xd17f,0x4459,0xdbff,1,0,1 +1,0x2733,0x4cf5,0xfc40,0x39d1,0x4fc1,0xc6c4,0xe9ea,0x640c,2,0,1 +1,0xa426,0xaac7,0x155a,0x3272,0xfd8f,0x47e3,0x9b65,0x948a,3,0,1 diff --git a/prover/zkevm/prover/ecarith/testdata/ecmul_test.csv b/prover/zkevm/prover/ecarith/testdata/ecmul_test.csv index b26aa83cf6e..59cd3aee3b7 100644 --- a/prover/zkevm/prover/ecarith/testdata/ecmul_test.csv +++ b/prover/zkevm/prover/ecarith/testdata/ecmul_test.csv @@ -1,11 +1,11 @@ -CS_MUL,LIMB,INDEX,IS_DATA,IS_RES -1,0x00000000000000000000000000000000,0,1,0 -1,0x00000000000000000000000000000001,1,1,0 -1,0x00000000000000000000000000000000,2,1,0 -1,0x00000000000000000000000000000002,3,1,0 -1,0x017d12e6c84e5fba373825e7c685757d,4,1,0 -1,0x9d35fbdedf8e9ad7b072f495cc18cf1d,5,1,0 -1,0x2248554789627797da7d833d251fbd6d,0,0,1 -1,0xcf0db51c914f2e240ab4a09057e851dc,1,0,1 -1,0x0ce6e73a50938e2a937d6385d3ad9620,2,0,1 -1,0xa83d1f8c4362e4096e78629eb640c89a,3,0,1 \ No newline at end of file +CS_MUL,LIMB_0,LIMB_1,LIMB_2,LIMB_3,LIMB_4,LIMB_5,LIMB_6,LIMB_7,INDEX,IS_DATA,IS_RES +1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0,0,1 +1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,1,0,1 +1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,2,0,1 +1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,3,0,1 +1,0x017d,0x12e6,0xc84e,0x5fba,0x3738,0x25e7,0xc685,0x757d,4,0,1 +1,0x9d35,0xfbde,0xdf8e,0x9ad7,0xb072,0xf495,0xcc18,0xcf1d,5,0,1 +1,0x2248,0x5547,0x8962,0x7797,0xda7d,0x833d,0x251f,0xbd6d,0,0,1 +1,0xcf0d,0xb51c,0x914f,0x2e24,0x0ab4,0xa090,0x57e8,0x51dc,1,0,1 +1,0x0ce6,0xe73a,0x5093,0x8e2a,0x937d,0x6385,0xd3ad,0x9620,2,0,1 +1,0xa83d,0x1f8c,0x4362,0xe409,0x6e78,0x629e,0xb640,0xc89a,3,0,1 diff --git a/prover/zkevm/prover/ecdsa/address_test.go b/prover/zkevm/prover/ecdsa/address_test.go index 9c7dbe62bcb..e5225bcb6c9 100644 --- a/prover/zkevm/prover/ecdsa/address_test.go +++ b/prover/zkevm/prover/ecdsa/address_test.go @@ -42,11 +42,15 @@ func TestAddress(t *testing.T) { Inputs: &antichamberInput{settings: limits}, ID: gbmGnark.HashNum, } + uaGnark = &UnalignedGnarkData{ - GnarkData: gbmGnark.Limb, GnarkPublicKeyIndex: gbmGnark.Index, IsPublicKey: gbmGnark.ToHash, } + + copy(uaGnark.GnarkData[:], gbmGnark.Limbs) + copy(uaGnark.GnarkDataLA[:], uaGnark.GnarkData[:]) + ac.UnalignedGnarkData = uaGnark // commit to txnData and ecRecover @@ -60,6 +64,7 @@ func TestAddress(t *testing.T) { Provider: addr.provider, MaxNumKeccakF: nbKeccakF, } + m = keccak.NewKeccakSingleProvider(comp, keccakInp) }, dummy.Compile) @@ -67,6 +72,7 @@ func TestAddress(t *testing.T) { proof := wizard.Prove(compiled, func(run *wizard.ProverRuntime) { testdata.GenerateAndAssignGenDataModule(run, &gbmGnark, c.HashNum, c.ToHash, false) + // it assign mock data to EcRec and txn_data AssignEcRecTxnData(run, gbmGnark, limits.MaxNbEcRecover, limits.MaxNbTx, sizeTxnData, size, td, ecRec, ac) diff --git a/prover/zkevm/prover/ecdsa/adress.go b/prover/zkevm/prover/ecdsa/adress.go index ef658158c15..d52874349dc 100644 --- a/prover/zkevm/prover/ecdsa/adress.go +++ b/prover/zkevm/prover/ecdsa/adress.go @@ -1,13 +1,13 @@ package ecdsa import ( + "fmt" "github.com/consensys/linea-monorepo/prover/crypto/keccak" "github.com/consensys/linea-monorepo/prover/maths/common/smartvectors" "github.com/consensys/linea-monorepo/prover/maths/common/vector" "github.com/consensys/linea-monorepo/prover/maths/field" "github.com/consensys/linea-monorepo/prover/protocol/column" "github.com/consensys/linea-monorepo/prover/protocol/dedicated" - "github.com/consensys/linea-monorepo/prover/protocol/dedicated/byte32cmp" "github.com/consensys/linea-monorepo/prover/protocol/dedicated/projection" "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" @@ -17,6 +17,17 @@ import ( "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" ) +const ( + // addressHiBytes is the size of the leftover from trimmed addressHi part (in bytes). + addressHiBytes = 4 + // addressHiColumns is the number of addressHi columns. + addressHiColumns = addressHiBytes / LimbBytes + // addressTrimmedBytes size of the trimmed address part (in bytes). + addressTrimmedBytes = common.NbLimbU256 - addressHiBytes + // addressTrimmedColumns number of columns that represent the trimmed address part. + addressTrimmedColumns = addressTrimmedBytes / LimbBytes +) + // Address submodule is responsible for the columns holding the address of the sender, // and checking their consistency with the claimed public key // (since address is the truncated hash of public key). @@ -25,49 +36,49 @@ import ( // // The public-key comes from Gnark-Data. type Addresses struct { - - // main columns - addressHiUntrimmed ifaces.Column - addressHi ifaces.Column - addressLo ifaces.Column + addressUntrimmed [common.NbLimbU256]ifaces.Column + address [common.NbLimbEthAddress]ifaces.Column // filters over address columns isAddress ifaces.Column isAddressFromEcRec ifaces.Column isAddressFromTxnData ifaces.Column - // helper columns for intermediate computations/proofs - - // filter over ecRecover; indicating only the AddressHi from EcRecoverIsRes + // filter over ecRecover; indicating only the AddressHi limbs from EcRecoverIsRes // we need this columns just because projection query does not support expressions as filter isAddressHiEcRec ifaces.Column // a column of all 16 indicating that all 16 bytes of public key should be hashed. col16 ifaces.Column - // used as the hassID for hashing by keccak. + // used as the hashID for hashing by keccak. hashNum ifaces.Column - // columns for decomposition and trimming the HashHi to AddressHi - limbColumnsUntrimmed byte32cmp.LimbColumns - computeLimbColumnsUntrimmed wizard.ProverAction - // providers for keccak, Providers contain the inputs and outputs of keccak hash. provider generic.GenericByteModule } -// AddressHi is the trimming of HashHi, taking its last 4bytes. -const trimmingSize = 4 - // newAddress creates an Address struct, declaring native columns and the constraints among them. func newAddress(comp *wizard.CompiledIOP, size int, ecRec *EcRecover, ac *antichamber, td *txnData) *Addresses { createCol := createColFn(comp, NAME_ADDRESSES, size) ecRecSize := ecRec.EcRecoverIsRes.Size() + + // Create columns for every 16 bit limb of address + address := [common.NbLimbEthAddress]ifaces.Column{} + for i := 0; i < common.NbLimbEthAddress; i++ { + address[i] = createCol(fmt.Sprintf("ADDRESS_%d", i)) + } + + // Create columns for every 16 bit limb of addressUntrimmed + addressUntrimmed := [common.NbLimbU256]ifaces.Column{} + for i := 0; i < common.NbLimbU256; i++ { + addressUntrimmed[i] = createCol(fmt.Sprintf("ADRESS_UNTRIMMED_%d", i)) + } + // declare the native columns addr := &Addresses{ - addressHi: createCol("ADDRESS_HI"), - addressLo: createCol("ADDRESS_LO"), - isAddress: createCol("IS_ADDRESS"), - addressHiUntrimmed: createCol("ADRESSHI_UNTRIMMED"), + address: address, + addressUntrimmed: addressUntrimmed, + isAddress: createCol("IS_ADDRESS"), col16: comp.InsertPrecomputed(ifaces.ColIDf("ADDRESS_Col16"), smartvectors.NewRegular(vector.Repeat(field.NewElement(16), size))), isAddressHiEcRec: comp.InsertCommit(0, ifaces.ColIDf("ISADRESS_HI_ECREC"), ecRecSize), @@ -91,7 +102,7 @@ func newAddress(comp *wizard.CompiledIOP, size int, ecRec *EcRecover, ac *antich addr.hashNum, ) - // check the trimming of hashHi to the addressHi + // check the trimming of address limb columns to addressUntrimmed limb columns addr.csAddressTrimming(comp) // check that IsAddressHiEcRec is well-formed @@ -99,24 +110,27 @@ func newAddress(comp *wizard.CompiledIOP, size int, ecRec *EcRecover, ac *antich // projection from ecRecover to address columns // ecdata is already projected over our ecRecover. Thus, we only project from our ecrecover. + + // Check that first 6 elements (trimmed 12 bytes) of address higher part are all 0 + for i := 0; i < addressTrimmedColumns; i++ { + comp.InsertGlobal(0, ifaces.QueryIDf("Trimmed_Bytes_Zeros_%d", i), + sym.Mul(addr.isAddressHiEcRec, addr.isAddressFromEcRec, ecRec.Limb[i]), + ) + } + projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressHi_EcRec"), - []ifaces.Column{ecRec.Limb}, []ifaces.Column{addr.addressHi}, + ecRec.Limb[addressTrimmedColumns:], addr.address[:addressHiColumns], addr.isAddressHiEcRec, addr.isAddressFromEcRec, ) - projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressLo_EcRec"), - []ifaces.Column{ecRec.Limb}, []ifaces.Column{addr.addressLo}, + projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressLo_EcRe"), + ecRec.Limb[:], addr.address[addressHiColumns:], column.Shift(addr.isAddressHiEcRec, -1), addr.isAddressFromEcRec, ) // projection from txn-data to address columns - projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressHi_TxnData"), - []ifaces.Column{td.fromHi}, []ifaces.Column{addr.addressHi}, - td.isFrom, addr.isAddressFromTxnData, - ) - - projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressLO_TxnData"), - []ifaces.Column{td.fromLo}, []ifaces.Column{addr.addressLo}, + projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressUntrimmed_TxnData"), + td.from[:], addressUntrimmed[:], td.isFrom, addr.isAddressFromTxnData, ) @@ -125,6 +139,7 @@ func newAddress(comp *wizard.CompiledIOP, size int, ecRec *EcRecover, ac *antich sym.Mul(ac.IsActive, sym.Sub(addr.hashNum, ac.ID, 1)), ) + // assign the keccak provider addr.provider = addr.GetProvider(comp, addr.hashNum, ac.UnalignedGnarkData) @@ -148,21 +163,11 @@ func (addr *Addresses) csIsAddressHiEcRec(comp *wizard.CompiledIOP, ecRec *EcRec addr.isAddressHiEcRec)) } -// The constraints for trimming the HashHi to AddressHi +// The constraints for trimming the addressUntrimmed to address func (addr *Addresses) csAddressTrimming(comp *wizard.CompiledIOP) { - - bitPerLimbs := 16 - addr.limbColumnsUntrimmed, addr.computeLimbColumnsUntrimmed = byte32cmp.Decompose(comp, addr.addressHiUntrimmed, 8, bitPerLimbs) - // addr.LimbColumnsTrimmed, addr.computeLimbColumnsTrimmed = byte32cmp.Decompose(comp, addr.AddressHi, 2, 16) - - // recompose two first limbs to get AddressHi - // since decomposition is in little-endian, but address is in big-endian, we get the first limbs. - a := addr.limbColumnsUntrimmed.Limbs[0] - b := addr.limbColumnsUntrimmed.Limbs[1] - pow2 := sym.NewConstant(1 << bitPerLimbs) - expr := sym.Add(a, sym.Mul(pow2, b)) - - comp.InsertGlobal(0, ifaces.QueryIDf("Address_Trimming"), sym.Sub(expr, addr.addressHi)) + for i := 0; i < common.NbLimbEthAddress; i++ { + comp.InsertGlobal(0, ifaces.QueryIDf("Address_Trimming_%d", i), sym.Sub(addr.address[i], addr.addressUntrimmed[i+addressTrimmedColumns])) + } } // It builds a provider from public key extracted from Gnark-Data (as hash input) and addresses (as output). @@ -173,11 +178,11 @@ func (addr *Addresses) GetProvider(comp *wizard.CompiledIOP, id ifaces.Column, u return provider } -// It builds a GenericByteModule from Address columns and Public-Key/GnarkData columns. +// It builds a GenericByteModule from Address columns and Public-Key/GnarkDataLA columns. func (addr *Addresses) buildGenericModule(id ifaces.Column, uaGnark *UnalignedGnarkData) (pkModule generic.GenericByteModule) { pkModule.Data = generic.GenDataModule{ HashNum: id, - Limb: uaGnark.GnarkData, + Limbs: uaGnark.GnarkDataLA[:], // a column of all 16, since all the bytes of public key are used in hashing NBytes: addr.col16, @@ -186,8 +191,8 @@ func (addr *Addresses) buildGenericModule(id ifaces.Column, uaGnark *UnalignedGn } pkModule.Info = generic.GenInfoModule{ - HashHi: addr.addressHiUntrimmed, - HashLo: addr.addressLo, + HashHi: addr.address[:addressHiColumns], + HashLo: addr.address[addressHiColumns:], IsHashHi: addr.isAddress, IsHashLo: addr.isAddress, } @@ -239,58 +244,74 @@ func (addr *Addresses) assignMainColumns( split := splitAt(nbEcRecover) n := nbRowsPerEcRec - permTrace := keccak.GenerateTrace(pkModule.Data.ScanStreams(run)) + streams := pkModule.Data.ScanStreams(run) + permTrace := keccak.GenerateTrace(streams) - hashHi := make([]field.Element, 0, len(permTrace.HashOutPut)) - hashLo := make([]field.Element, 0, len(permTrace.HashOutPut)) - isHash := make([]field.Element, 0, len(permTrace.HashOutPut)) - trimmedHi := make([]field.Element, 0, len(permTrace.HashOutPut)) + // Initialize an array of addressUntrimmedColumns limbs columns + addressUntrimmedColumns := make([][]field.Element, 0, common.NbLimbU256) + for i := 0; i < common.NbLimbU256; i++ { + addressUntrimmedColumns = append(addressUntrimmedColumns, make([]field.Element, 0, len(permTrace.HashOutPut))) + } - var v, w, u field.Element + // Initialize an array of address limbs columns + addressColumns := make([][]field.Element, 0, common.NbLimbEthAddress) + for i := 0; i < common.NbLimbEthAddress; i++ { + addressColumns = append(addressColumns, make([]field.Element, 0, len(permTrace.HashOutPut))) + } + + isHash := make([]field.Element, 0, len(permTrace.HashOutPut)) for _, digest := range permTrace.HashOutPut { + if len(addressColumns[len(addressColumns)-1]) == split { + n = nbRowsPerTxSign + } - hi := digest[:halfDigest] - lo := digest[halfDigest:] - trimmed := hi[halfDigest-trimmingSize:] + // Initialize limb values for each column of addressUntrimmed + addressUntrimmed := SplitBytes(digest[:]) + for j, limb := range addressUntrimmed { + var element field.Element + element.SetBytes(limb[:]) - v.SetBytes(hi[:]) - w.SetBytes(lo[:]) - u.SetBytes(trimmed[:]) + repeat := vector.Repeat(element, n) + addressUntrimmedColumns[j] = append(addressUntrimmedColumns[j], repeat...) + } - if len(hashHi) == split { - n = nbRowsPerTxSign + // Initialize limb values for each column of address + address := SplitBytes(digest[addressTrimmedBytes:]) + for j, limb := range address { + var element field.Element + element.SetBytes(limb[:]) + + repeat := vector.Repeat(element, n) + addressColumns[j] = append(addressColumns[j], repeat...) } - repeatLO := vector.Repeat(w, n) - repeatHi := vector.Repeat(v, n) - repeatTrimmedHi := vector.Repeat(u, n) + repeatIsTxHash := vector.Repeat(field.Zero(), n-1) - hashHi = append(hashHi, repeatHi...) - hashLo = append(hashLo, repeatLO...) isHash = append(isHash, field.One()) isHash = append(isHash, repeatIsTxHash...) - trimmedHi = append(trimmedHi, repeatTrimmedHi...) } isFromEcRec := isHash[:split] isFromTxnData := vector.Repeat(field.Zero(), split) isFromTxnData = append(isFromTxnData, isHash[split:]...) - run.AssignColumn(addr.addressHiUntrimmed.GetColID(), smartvectors.RightZeroPadded(hashHi, size)) - run.AssignColumn(addr.addressLo.GetColID(), smartvectors.RightZeroPadded(hashLo, size)) + // Assign values to columns + // We do a reverse of address columns since the address was storing in big-endian format. + for i := 0; i < common.NbLimbU256; i++ { + run.AssignColumn(addr.addressUntrimmed[i].GetColID(), smartvectors.RightZeroPadded(addressUntrimmedColumns[i], size)) + } + + for i := 0; i < common.NbLimbEthAddress; i++ { + run.AssignColumn(addr.address[i].GetColID(), smartvectors.RightZeroPadded(addressColumns[i], size)) + } + run.AssignColumn(addr.isAddress.GetColID(), smartvectors.RightZeroPadded(isHash, size)) - run.AssignColumn(addr.addressHi.GetColID(), smartvectors.RightZeroPadded(trimmedHi, size)) run.AssignColumn(addr.isAddressFromEcRec.GetColID(), smartvectors.RightZeroPadded(isFromEcRec, size)) run.AssignColumn(addr.isAddressFromTxnData.GetColID(), smartvectors.RightZeroPadded(isFromTxnData, size)) - } // It assigns the helper columns func (addr *Addresses) assignHelperColumns(run *wizard.ProverRuntime, ecRec *EcRecover) { - - // assign LimbColumns from decomposition via proverAction - addr.computeLimbColumnsUntrimmed.Run(run) - // assign isAddressHiEcRec isRes := ecRec.EcRecoverIsRes.GetColAssignment(run).IntoRegVecSaveAlloc() col := make([]field.Element, len(isRes)) @@ -302,7 +323,6 @@ func (addr *Addresses) assignHelperColumns(run *wizard.ProverRuntime, ecRec *EcR } } run.AssignColumn(addr.isAddressHiEcRec.GetColID(), smartvectors.NewRegular(col)) - } // It indicates the row where ecrecover and txSignature are split. @@ -311,16 +331,14 @@ func splitAt(nbEcRecover int) int { } func (td *txnData) csTxnData(comp *wizard.CompiledIOP) { - // isFrom == 1 iff ct==1 td.isFrom, td.pa_IsZero = dedicated.IsZero(comp, sym.Sub(td.ct, 1)) } // txndata represents the txn_data module from the arithmetization side. type txnData struct { - fromHi ifaces.Column - fromLo ifaces.Column - ct ifaces.Column + from [common.NbLimbU256]ifaces.Column + ct ifaces.Column // helper column isFrom ifaces.Column diff --git a/prover/zkevm/prover/ecdsa/antichamber.go b/prover/zkevm/prover/ecdsa/antichamber.go index 5fb8aeb9eb1..85822136af2 100644 --- a/prover/zkevm/prover/ecdsa/antichamber.go +++ b/prover/zkevm/prover/ecdsa/antichamber.go @@ -7,6 +7,7 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" ) @@ -69,6 +70,8 @@ type antichamber struct { // providers for keccak, Providers contain the inputs and outputs of keccak hash. Providers []generic.GenericByteModule + + flattenLimbs *common.FlattenColumn } type Settings struct { @@ -113,11 +116,14 @@ func newAntichamber(comp *wizard.CompiledIOP, inputs *antichamberInput) *anticha res.EcRecover = newEcRecover(comp, inputs.settings, inputs.ecSource) res.UnalignedGnarkData = newUnalignedGnarkData(comp, size, res.unalignedGnarkDataSource()) res.Addresses = newAddress(comp, size, res.EcRecover, res, inputs.txSource) + + res.flattenLimbs = common.NewFlattenColumn(comp, common.NbLimbU128, res.UnalignedGnarkData.GnarkData[:], res.IsPushing) + toAlign := &plonk.CircuitAlignmentInput{ Name: NAME_GNARK_DATA, Round: ROUND_NR, - DataToCircuit: res.UnalignedGnarkData.GnarkData, - DataToCircuitMask: res.IsPushing, + DataToCircuit: res.flattenLimbs.Limbs(), + DataToCircuitMask: res.flattenLimbs.Mask(), Circuit: newMultiEcRecoverCircuit(settings.NbInputInstance), InputFiller: inputFiller, PlonkOptions: inputs.plonkOptions, @@ -133,6 +139,8 @@ func newAntichamber(comp *wizard.CompiledIOP, inputs *antichamberInput) *anticha res.csSource(comp) res.csTransitions(comp) + res.flattenLimbs.CsFlattenProjection(comp) + // consistency with submodules // ecrecover res.EcRecover.csConstrainAuxProjectionMaskConsistency(comp, res.Source, res.IsFetching) @@ -159,10 +167,14 @@ func (ac *antichamber) assign(run *wizard.ProverRuntime, txGet TxSignatureGetter txSource = ac.Inputs.txSource nbActualEcRecover = ecSrc.nbActualInstances(run) ) + ac.assignAntichamber(run, nbActualEcRecover, nbTx) ac.EcRecover.Assign(run, ecSrc) ac.txSignature.assignTxSignature(run, nbActualEcRecover) ac.UnalignedGnarkData.Assign(run, ac.unalignedGnarkDataSource(), txGet) + + ac.flattenLimbs.Run(run) + ac.Addresses.assignAddress(run, nbActualEcRecover, ac.size, ac, ac.EcRecover, ac.UnalignedGnarkData, txSource) ac.AlignedGnarkData.Assign(run) } diff --git a/prover/zkevm/prover/ecdsa/antichamber_columns.go b/prover/zkevm/prover/ecdsa/antichamber_columns.go index ba90073b409..c14f49010da 100644 --- a/prover/zkevm/prover/ecdsa/antichamber_columns.go +++ b/prover/zkevm/prover/ecdsa/antichamber_columns.go @@ -16,38 +16,28 @@ func (ac *antichamber) cols(withActive bool) []ifaces.Column { } func (ec *EcRecover) cols() []ifaces.Column { - return []ifaces.Column{ - ec.EcRecoverID, - ec.Limb, - ec.SuccessBit, - ec.EcRecoverIndex, - ec.EcRecoverIsData, - ec.EcRecoverIsRes, - } + return append( + []ifaces.Column{ec.EcRecoverID}, + append( + ec.Limb[:], + ec.SuccessBit, ec.EcRecoverIndex, ec.EcRecoverIsData, ec.EcRecoverIsRes, + )..., + ) } func (ad *Addresses) cols() []ifaces.Column { - return []ifaces.Column{ - ad.addressHiUntrimmed, - ad.addressHi, - ad.addressLo, - } + return append(ad.addressUntrimmed[:], ad.address[:]...) } func (ts *txSignature) cols() []ifaces.Column { - return []ifaces.Column{ - ts.isTxHash, - ts.txHashHi, - ts.txHashLo, - } + return append([]ifaces.Column{ts.isTxHash}, ts.txHash[:]...) } func (ugd *UnalignedGnarkData) cols() []ifaces.Column { - return []ifaces.Column{ - ugd.IsPublicKey, - ugd.GnarkIndex, - ugd.GnarkData, - } + return append( + []ifaces.Column{ugd.IsPublicKey, ugd.GnarkIndex}, + ugd.GnarkData[:]..., + ) } func (ac *antichamber) unalignedGnarkDataSource() *unalignedGnarkDataSource { @@ -60,7 +50,6 @@ func (ac *antichamber) unalignedGnarkDataSource() *unalignedGnarkDataSource { SuccessBit: ac.EcRecover.SuccessBit, IsData: ac.EcRecover.EcRecoverIsData, IsRes: ac.EcRecover.EcRecoverIsRes, - TxHashHi: ac.txSignature.txHashHi, - TxHashLo: ac.txSignature.txHashLo, + TxHash: ac.txHash, } } diff --git a/prover/zkevm/prover/ecdsa/antichamber_test.go b/prover/zkevm/prover/ecdsa/antichamber_test.go index f65ce646b24..5f26a83002d 100644 --- a/prover/zkevm/prover/ecdsa/antichamber_test.go +++ b/prover/zkevm/prover/ecdsa/antichamber_test.go @@ -3,6 +3,7 @@ package ecdsa import ( "crypto/rand" "fmt" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "math/big" "os" "testing" @@ -58,13 +59,16 @@ func TestAntichamber(t *testing.T) { ecSrc = &ecDataSource{ CsEcrecover: ct.GetCommit(b, "EC_DATA_CS_ECRECOVER"), ID: ct.GetCommit(b, "EC_DATA_ID"), - Limb: ct.GetCommit(b, "EC_DATA_LIMB"), SuccessBit: ct.GetCommit(b, "EC_DATA_SUCCESS_BIT"), Index: ct.GetCommit(b, "EC_DATA_INDEX"), IsData: ct.GetCommit(b, "EC_DATA_IS_DATA"), IsRes: ct.GetCommit(b, "EC_DATA_IS_RES"), } + for i := 0; i < common.NbLimbU128; i++ { + ecSrc.Limb[i] = ct.GetCommit(b, fmt.Sprintf("EC_DATA_LIMB_%d", i)) + } + ac = newAntichamber( b.CompiledIOP, &antichamberInput{ @@ -88,9 +92,14 @@ func TestAntichamber(t *testing.T) { // assign txn_data module from pk txSrc.assignTxnDataFromPK(run, ac, trace.HashOutPut, nbRowsPerTxInTxnData) - ct.Assign(run, - "EC_DATA_CS_ECRECOVER", "EC_DATA_ID", "EC_DATA_LIMB", "EC_DATA_SUCCESS_BIT", "EC_DATA_INDEX", "EC_DATA_IS_DATA", "EC_DATA_IS_RES", - ) + var names = []string{"EC_DATA_CS_ECRECOVER", "EC_DATA_ID"} + for i := 0; i < common.NbLimbU128; i++ { + names = append(names, fmt.Sprintf("EC_DATA_LIMB_%d", i)) + } + + names = append(names, "EC_DATA_SUCCESS_BIT", "EC_DATA_INDEX", "EC_DATA_IS_DATA", "EC_DATA_IS_RES") + + ct.Assign(run, names...) ac.assign(run, dummyTxSignatureGetter, limits.MaxNbTx) }) diff --git a/prover/zkevm/prover/ecdsa/circuit.go b/prover/zkevm/prover/ecdsa/circuit.go index fdec4223cd5..c468e66bdbd 100644 --- a/prover/zkevm/prover/ecdsa/circuit.go +++ b/prover/zkevm/prover/ecdsa/circuit.go @@ -2,7 +2,6 @@ package ecdsa import ( "fmt" - "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/std/algebra" "github.com/consensys/gnark/std/algebra/emulated/sw_emulated" @@ -11,16 +10,17 @@ import ( "github.com/consensys/gnark/std/math/emulated" "github.com/consensys/gnark/std/math/emulated/emparams" "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) type EcRecoverInstance struct { - PKXHi, PKXLo, PKYHi, PKYLo frontend.Variable `gnark:",public"` - HHi, HLo frontend.Variable `gnark:",public"` - VHi, VLo frontend.Variable `gnark:",public"` - RHi, RLo frontend.Variable `gnark:",public"` - SHi, SLo frontend.Variable `gnark:",public"` - SUCCESS_BIT frontend.Variable `gnark:",public"` - ECRECOVERBIT frontend.Variable `gnark:",public"` + PKXHi, PKXLo, PKYHi, PKYLo [common.NbLimbU128]frontend.Variable `gnark:",public"` + HHi, HLo [common.NbLimbU128]frontend.Variable `gnark:",public"` + VHi, VLo [common.NbLimbU128]frontend.Variable `gnark:",public"` + RHi, RLo [common.NbLimbU128]frontend.Variable `gnark:",public"` + SHi, SLo [common.NbLimbU128]frontend.Variable `gnark:",public"` + SUCCESS_BIT frontend.Variable `gnark:",public"` + ECRECOVERBIT frontend.Variable `gnark:",public"` } type MultiEcRecoverCircuit struct { diff --git a/prover/zkevm/prover/ecdsa/ecdata.go b/prover/zkevm/prover/ecdsa/ecdata.go index b54965f88e3..590c7c44796 100644 --- a/prover/zkevm/prover/ecdsa/ecdata.go +++ b/prover/zkevm/prover/ecdsa/ecdata.go @@ -1,12 +1,14 @@ package ecdsa import ( + "fmt" "github.com/consensys/linea-monorepo/prover/maths/common/smartvectors" "github.com/consensys/linea-monorepo/prover/maths/field" "github.com/consensys/linea-monorepo/prover/protocol/dedicated/projection" "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" sym "github.com/consensys/linea-monorepo/prover/symbolic" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" commoncs "github.com/consensys/linea-monorepo/prover/zkevm/prover/common/common_constraints" ) @@ -22,7 +24,7 @@ const ( type EcRecover struct { EcRecoverID ifaces.Column - Limb ifaces.Column + Limb [common.NbLimbU128]ifaces.Column SuccessBit ifaces.Column EcRecoverIndex ifaces.Column EcRecoverIsData ifaces.Column @@ -37,7 +39,7 @@ type EcRecover struct { type ecDataSource struct { CsEcrecover ifaces.Column ID ifaces.Column - Limb ifaces.Column + Limb [common.NbLimbU128]ifaces.Column SuccessBit ifaces.Column Index ifaces.Column IsData ifaces.Column @@ -70,7 +72,6 @@ func newEcRecover(comp *wizard.CompiledIOP, limits *Settings, src *ecDataSource) createCol := createColFn(comp, NAME_ECRECOVER, limits.sizeAntichamber()) res := &EcRecover{ EcRecoverID: createCol("ECRECOVER_ID"), - Limb: createCol("LIMB"), SuccessBit: createCol("SUCCESS_BIT"), EcRecoverIndex: createCol("ECRECOVER_INDEX"), EcRecoverIsData: createCol("ECRECOVER_IS_DATA"), @@ -79,6 +80,11 @@ func newEcRecover(comp *wizard.CompiledIOP, limits *Settings, src *ecDataSource) Settings: limits, } + + for i := 0; i < common.NbLimbU128; i++ { + res.Limb[i] = createCol(fmt.Sprintf("LIMB_%d", i)) + } + res.csEcDataProjection(comp, src) res.csConstraintAuxProjectionMask(comp) @@ -92,33 +98,41 @@ func (ec *EcRecover) Assign(run *wizard.ProverRuntime, src *ecDataSource) { func (ec *EcRecover) assignFromEcDataSource(run *wizard.ProverRuntime, src *ecDataSource) { var ( + sourceLimb [common.NbLimbU128]ifaces.ColAssignment + nbInstances = src.nbActualInstances(run) currRow = int(0) sourceCsEcRecover = run.GetColumn(src.CsEcrecover.GetColID()) sourceID = run.GetColumn(src.ID.GetColID()) - sourceLimb = run.GetColumn(src.Limb.GetColID()) sourceSuccessBit = run.GetColumn(src.SuccessBit.GetColID()) sourceIndex = run.GetColumn(src.Index.GetColID()) sourceIsData = run.GetColumn(src.IsData.GetColID()) sourceIsRes = run.GetColumn(src.IsRes.GetColID()) - // - resEcRecoverID, resLimb, resSuccessBit, resEcRecoverIndex []field.Element + + resEcRecoverID, resSuccessBit, resEcRecoverIndex []field.Element resEcRecoverIsData, resEcRecoverIsRes, resAuxProjectionMask []field.Element ) + for i := 0; i < common.NbLimbU128; i++ { + sourceLimb[i] = run.GetColumn(src.Limb[i].GetColID()) + + if sourceID.Len() != sourceLimb[i].Len() || sourceLimb[i].Len() != sourceSuccessBit.Len() { + panic("all source limb columns must have the same length") + } + } + if sourceCsEcRecover.Len() != sourceID.Len() || - sourceID.Len() != sourceLimb.Len() || - sourceLimb.Len() != sourceSuccessBit.Len() || sourceSuccessBit.Len() != sourceIndex.Len() || sourceIndex.Len() != sourceIsData.Len() || sourceIsData.Len() != sourceIsRes.Len() { panic("all source columns must have the same length") } + var resElements [common.NbLimbU128][]field.Element for i := 0; i < nbInstances; i++ { var ( - rowEcRecoverID, rowLimb, rowSuccessBit, rowEcRecoverIndex [nbRowsPerEcRec]field.Element + rowEcRecoverID, rowSuccessBit, rowEcRecoverIndex, rowEcRecoverIsData, rowEcRecoverIsRes, rowAuxProjectionMask [nbRowsPerEcRec]field.Element ) @@ -130,10 +144,15 @@ func (ec *EcRecover) assignFromEcDataSource(run *wizard.ProverRuntime, src *ecDa } } + var colElements [common.NbLimbU128][nbRowsPerEcRec]field.Element for j := 0; j < nbRowsPerEcRecFetching; j++ { sourceIdx := currRow + j rowEcRecoverID[j] = sourceID.Get(sourceIdx) - rowLimb[j] = sourceLimb.Get(sourceIdx) + + for k := 0; k < common.NbLimbU128; k++ { + colElements[k][j] = sourceLimb[k].Get(sourceIdx) + } + rowSuccessBit[j] = sourceSuccessBit.Get(sourceIdx) rowEcRecoverIndex[j] = sourceIndex.Get(sourceIdx) rowEcRecoverIsData[j] = sourceIsData.Get(sourceIdx) @@ -146,7 +165,11 @@ func (ec *EcRecover) assignFromEcDataSource(run *wizard.ProverRuntime, src *ecDa currRow += nbRowsPerEcRecFetching resEcRecoverID = append(resEcRecoverID, rowEcRecoverID[:]...) - resLimb = append(resLimb, rowLimb[:]...) + + for j := 0; j < common.NbLimbU128; j++ { + resElements[j] = append(resElements[j], colElements[j][:]...) + } + resSuccessBit = append(resSuccessBit, rowSuccessBit[:]...) resEcRecoverIndex = append(resEcRecoverIndex, rowEcRecoverIndex[:]...) resEcRecoverIsData = append(resEcRecoverIsData, rowEcRecoverIsData[:]...) @@ -157,7 +180,11 @@ func (ec *EcRecover) assignFromEcDataSource(run *wizard.ProverRuntime, src *ecDa // assign this submodule components size := ec.Settings.sizeAntichamber() run.AssignColumn(ec.EcRecoverID.GetColID(), smartvectors.RightZeroPadded(resEcRecoverID, size)) - run.AssignColumn(ec.Limb.GetColID(), smartvectors.RightZeroPadded(resLimb, size)) + + for i := 0; i < common.NbLimbU128; i++ { + run.AssignColumn(ec.Limb[i].GetColID(), smartvectors.RightZeroPadded(resElements[i], size)) + } + run.AssignColumn(ec.SuccessBit.GetColID(), smartvectors.RightZeroPadded(resSuccessBit, size)) run.AssignColumn(ec.EcRecoverIndex.GetColID(), smartvectors.RightZeroPadded(resEcRecoverIndex, size)) run.AssignColumn(ec.EcRecoverIsData.GetColID(), smartvectors.RightZeroPadded(resEcRecoverIsData, size)) @@ -166,9 +193,18 @@ func (ec *EcRecover) assignFromEcDataSource(run *wizard.ProverRuntime, src *ecDa } func (ec *EcRecover) csEcDataProjection(comp *wizard.CompiledIOP, src *ecDataSource) { + columnsA := append( + ec.Limb[:], + ec.EcRecoverID, ec.SuccessBit, ec.EcRecoverIndex, ec.EcRecoverIsData, ec.EcRecoverIsRes, + ) + + columnsB := append( + src.Limb[:], + src.ID, src.SuccessBit, src.Index, src.IsData, src.IsRes, + ) + projection.InsertProjection(comp, ifaces.QueryIDf("%v_PROJECT_ECDATA", NAME_ECRECOVER), - []ifaces.Column{ec.EcRecoverID, ec.Limb, ec.SuccessBit, ec.EcRecoverIndex, ec.EcRecoverIsData, ec.EcRecoverIsRes}, - []ifaces.Column{src.ID, src.Limb, src.SuccessBit, src.Index, src.IsData, src.IsRes}, + columnsA, columnsB, ec.AuxProjectionMask, src.CsEcrecover, ) } diff --git a/prover/zkevm/prover/ecdsa/ecdata_test.go b/prover/zkevm/prover/ecdsa/ecdata_test.go index 64f269a7676..26a22cb65b8 100644 --- a/prover/zkevm/prover/ecdsa/ecdata_test.go +++ b/prover/zkevm/prover/ecdsa/ecdata_test.go @@ -1,6 +1,8 @@ package ecdsa import ( + "fmt" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "os" "testing" @@ -29,12 +31,16 @@ func TestEcDataAssignData(t *testing.T) { ecSrc = &ecDataSource{ CsEcrecover: ct.GetCommit(b, "EC_DATA_CS_ECRECOVER"), ID: ct.GetCommit(b, "EC_DATA_ID"), - Limb: ct.GetCommit(b, "EC_DATA_LIMB"), SuccessBit: ct.GetCommit(b, "EC_DATA_SUCCESS_BIT"), Index: ct.GetCommit(b, "EC_DATA_INDEX"), IsData: ct.GetCommit(b, "EC_DATA_IS_DATA"), IsRes: ct.GetCommit(b, "EC_DATA_IS_RES"), } + + for i := 0; i < common.NbLimbU128; i++ { + ecSrc.Limb[i] = ct.GetCommit(b, fmt.Sprintf("EC_DATA_LIMB_%d", i)) + } + ecRec = newEcRecover(b.CompiledIOP, limits, ecSrc) }, dummy.Compile, @@ -42,7 +48,15 @@ func TestEcDataAssignData(t *testing.T) { proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) { - ct.Assign(run, "EC_DATA_CS_ECRECOVER", "EC_DATA_ID", "EC_DATA_LIMB", "EC_DATA_SUCCESS_BIT", "EC_DATA_INDEX", "EC_DATA_IS_DATA", "EC_DATA_IS_RES") + var columns = []string{"EC_DATA_CS_ECRECOVER", "EC_DATA_ID"} + + for i := 0; i < common.NbLimbU128; i++ { + columns = append(columns, fmt.Sprintf("EC_DATA_LIMB_%d", i)) + } + + columns = append(columns, "EC_DATA_SUCCESS_BIT", "EC_DATA_INDEX", "EC_DATA_IS_DATA", "EC_DATA_IS_RES") + + ct.Assign(run, columns...) ecRec.Assign(run, ecSrc) }) diff --git a/prover/zkevm/prover/ecdsa/ecdsa.go b/prover/zkevm/prover/ecdsa/ecdsa.go index c808cf9c037..7ff9a331bdc 100644 --- a/prover/zkevm/prover/ecdsa/ecdsa.go +++ b/prover/zkevm/prover/ecdsa/ecdsa.go @@ -2,7 +2,9 @@ package ecdsa import ( "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" ) @@ -37,32 +39,45 @@ func (e *EcdsaZkEvm) GetProviders() []generic.GenericByteModule { } func getEcdataArithmetization(comp *wizard.CompiledIOP) *ecDataSource { - return &ecDataSource{ + src := &ecDataSource{ CsEcrecover: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_ECRECOVER"), ID: comp.Columns.GetHandle("ecdata.ID"), - Limb: comp.Columns.GetHandle("ecdata.LIMB"), SuccessBit: comp.Columns.GetHandle("ecdata.SUCCESS_BIT"), Index: comp.Columns.GetHandle("ecdata.INDEX"), IsData: comp.Columns.GetHandle("ecdata.IS_ECRECOVER_DATA"), IsRes: comp.Columns.GetHandle("ecdata.IS_ECRECOVER_RESULT"), } + + for i := 0; i < common.NbLimbU128; i++ { + src.Limb[i] = comp.Columns.GetHandle(ifaces.ColIDf("ecdata.LIMB_%d", i)) + } + + return src } func getTxnDataArithmetization(comp *wizard.CompiledIOP) *txnData { td := &txnData{ - fromHi: comp.Columns.GetHandle("txndata.FROM_HI"), - fromLo: comp.Columns.GetHandle("txndata.FROM_LO"), - ct: comp.Columns.GetHandle("txndata.CT"), + ct: comp.Columns.GetHandle("txndata.CT"), + } + + for i := 0; i < common.NbLimbU256; i++ { + td.from[i] = comp.Columns.GetHandle(ifaces.ColIDf("txndata.FROM_%d", i)) } + return td } func getRlpTxnArithmetization(comp *wizard.CompiledIOP) generic.GenDataModule { - return generic.GenDataModule{ + res := generic.GenDataModule{ HashNum: comp.Columns.GetHandle("rlptxn.ABS_TX_NUM"), Index: comp.Columns.GetHandle("rlptxn.INDEX_LX"), - Limb: comp.Columns.GetHandle("rlptxn.LIMB"), NBytes: comp.Columns.GetHandle("rlptxn.nBYTES"), ToHash: comp.Columns.GetHandle("rlptxn.TO_HASH_BY_PROVER"), } + + for i := 0; i < common.NbLimbU128; i++ { + res.Limbs = append(res.Limbs, comp.Columns.GetHandle(ifaces.ColIDf("rlptxn.LIMB_%d", i))) + } + + return res } diff --git a/prover/zkevm/prover/ecdsa/split.go b/prover/zkevm/prover/ecdsa/split.go new file mode 100644 index 00000000000..7b985b7edaa --- /dev/null +++ b/prover/zkevm/prover/ecdsa/split.go @@ -0,0 +1,21 @@ +package ecdsa + +// LimbBytes is the size of one limb in bytes +const LimbBytes = 2 + +// SplitBytes splits the input slice into subarrays of the provided size. +func SplitBytes(input []byte) [][]byte { + if len(input) == 0 { + return [][]byte{} + } + + var result [][]byte + for i := 0; i < len(input); i += LimbBytes { + end := i + LimbBytes + if end > len(input) { + end = len(input) + } + result = append(result, input[i:end]) + } + return result +} diff --git a/prover/zkevm/prover/ecdsa/split_test.go b/prover/zkevm/prover/ecdsa/split_test.go new file mode 100644 index 00000000000..a916d5463f7 --- /dev/null +++ b/prover/zkevm/prover/ecdsa/split_test.go @@ -0,0 +1,35 @@ +package ecdsa + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSplitBytes(t *testing.T) { + cases := []struct { + input []byte + expected [][]byte + }{ + { + input: []byte{0x11, 0x22, 0x33, 0x44}, + expected: [][]byte{{0x11, 0x22}, {0x33, 0x44}}, + }, + { + input: []byte{0x11, 0x22, 0x33}, + expected: [][]byte{{0x11, 0x22}, {0x33}}, + }, + { + input: []byte{0x11}, + expected: [][]byte{{0x11}}, + }, + { + input: []byte{}, + expected: [][]byte{}, + }, + } + + for _, cc := range cases { + limbs := SplitBytes(cc.input) + assert.Equal(t, cc.expected, limbs) + } +} diff --git a/prover/zkevm/prover/ecdsa/testdata/antichamber.csv b/prover/zkevm/prover/ecdsa/testdata/antichamber.csv index ee676227008..1714cdcda2b 100644 --- a/prover/zkevm/prover/ecdsa/testdata/antichamber.csv +++ b/prover/zkevm/prover/ecdsa/testdata/antichamber.csv @@ -1,21 +1,21 @@ -IS_ACTIVE,EC_DATA_CS_ECRECOVER,EC_DATA_ID,EC_DATA_INDEX,EC_DATA_LIMB,EC_DATA_SUCCESS_BIT,EC_DATA_IS_DATA,EC_DATA_IS_RES -1,1,0,0,0x279d94621558f755796898fc4bd36b6d,1,1,0 -1,1,0,1,0x407cae77537865afe523b79c74cc680b,1,1,0 -1,1,0,2,0x0,1,1,0 -1,1,0,3,0x1b,1,1,0 -1,1,0,4,0xc2ff96feed8749a5ad1c0714f950b5ac,1,1,0 -1,1,0,5,0x939d8acedbedcbc2949614ab8af06312,1,1,0 -1,1,0,6,0x1feecd50adc6273fdd5d11c6da18c8cf,1,1,0 -1,1,0,7,0xe14e2787f5a90af7c7c1328e7d0a2c42,1,1,0 -1,1,0,0,0xb2e17f39,1,0,1 -1,1,0,1,0xd52e04340f4041e4ceb2b02884406893,1,0,1 -1,1,1,0,0x279d94621558f755796898fc4bd36b6d,1,1,0 -1,1,1,1,0x407cae77537865afe523b79c74cc680b,1,1,0 -1,1,1,2,0x0,1,1,0 -1,1,1,3,0x1b,1,1,0 -1,1,1,4,0xc2ff96feed8749a5ad1c0714f950b5ac,1,1,0 -1,1,1,5,0x939d8acedbedcbc2949614ab8af06312,1,1,0 -1,1,1,6,0x1feecd50adc6273fdd5d11c6da18c8cf,1,1,0 -1,1,1,7,0xe14e2787f5a90af7c7c1328e7d0a2c42,1,1,0 -1,1,1,0,0xb2e17f39,1,0,1 -1,1,1,1,0xd52e04340f4041e4ceb2b02884406893,1,0,1 \ No newline at end of file +IS_ACTIVE,EC_DATA_CS_ECRECOVER,EC_DATA_ID,EC_DATA_INDEX,EC_DATA_LIMB_0,EC_DATA_LIMB_1,EC_DATA_LIMB_2,EC_DATA_LIMB_3,EC_DATA_LIMB_4,EC_DATA_LIMB_5,EC_DATA_LIMB_6,EC_DATA_LIMB_7,EC_DATA_SUCCESS_BIT,EC_DATA_IS_DATA,EC_DATA_IS_RES +1,1,0,0,0x279d,0x9462,0x1558,0xf755,0x7968,0x98fc,0x4bd3,0x6b6d,1,1,0 +1,1,0,1,0x407c,0xae77,0x5378,0x65af,0xe523,0xb79c,0x74cc,0x680b,1,1,0 +1,1,0,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0 +1,1,0,3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x001b,1,1,0 +1,1,0,4,0xc2ff,0x96fe,0xed87,0x49a5,0xad1c,0x0714,0xf950,0xb5ac,1,1,0 +1,1,0,5,0x939d,0x8ace,0xdbed,0xcbc2,0x9496,0x14ab,0x8af0,0x6312,1,1,0 +1,1,0,6,0x1fee,0xcd50,0xadc6,0x273f,0xdd5d,0x11c6,0xda18,0xc8cf,1,1,0 +1,1,0,7,0xe14e,0x2787,0xf5a9,0x0af7,0xc7c1,0x328e,0x7d0a,0x2c42,1,1,0 +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0xb2e1,0x7f39,1,0,1 +1,1,0,1,0xd52e,0x0434,0x0f40,0x41e4,0xceb2,0xb028,0x8440,0x6893,1,0,1 +1,1,1,0,0x279d,0x9462,0x1558,0xf755,0x7968,0x98fc,0x4bd3,0x6b6d,1,1,0 +1,1,1,1,0x407c,0xae77,0x5378,0x65af,0xe523,0xb79c,0x74cc,0x680b,1,1,0 +1,1,1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0 +1,1,1,3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x001b,1,1,0 +1,1,1,4,0xc2ff,0x96fe,0xed87,0x49a5,0xad1c,0x0714,0xf950,0xb5ac,1,1,0 +1,1,1,5,0x939d,0x8ace,0xdbed,0xcbc2,0x9496,0x14ab,0x8af0,0x6312,1,1,0 +1,1,1,6,0x1fee,0xcd50,0xadc6,0x273f,0xdd5d,0x11c6,0xda18,0xc8cf,1,1,0 +1,1,1,7,0xe14e,0x2787,0xf5a9,0x0af7,0xc7c1,0x328e,0x7d0a,0x2c42,1,1,0 +1,1,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0xb2e1,0x7f39,1,0,1 +1,1,1,1,0xd52e,0x0434,0x0f40,0x41e4,0xceb2,0xb028,0x8440,0x6893,1,0,1 diff --git a/prover/zkevm/prover/ecdsa/testdata/ecdata_test.csv b/prover/zkevm/prover/ecdsa/testdata/ecdata_test.csv index bb98ff85349..2c25a289e76 100644 --- a/prover/zkevm/prover/ecdsa/testdata/ecdata_test.csv +++ b/prover/zkevm/prover/ecdsa/testdata/ecdata_test.csv @@ -1,21 +1,21 @@ -EC_DATA_CS_ECRECOVER,EC_DATA_ID,EC_DATA_LIMB,EC_DATA_SUCCESS_BIT,EC_DATA_INDEX,EC_DATA_IS_DATA,EC_DATA_IS_RES -1,1,0x279d94621558f755796898fc4bd36b6d,1,0,1,0 -1,1,0x407cae77537865afe523b79c74cc680b,1,1,1,0 -1,1,0x0,1,2,1,0 -1,1,0x1b,1,3,1,0 -1,1,0xc2ff96feed8749a5ad1c0714f950b5ac,1,4,1,0 -1,1,0x939d8acedbedcbc2949614ab8af06312,1,5,1,0 -1,1,0x1feecd50adc6273fdd5d11c6da18c8cf,1,6,1,0 -1,1,0xe14e2787f5a90af7c7c1328e7d0a2c42,1,7,1,0 -1,1,0xb2e17f39,1,0,0,1 -1,1,0xd52e04340f4041e4ceb2b02884406893,1,1,0,1 -1,2,0x10,1,0,1,0 -1,2,0x20,1,1,1,0 -1,2,0x30,1,2,1,0 -1,2,0x40,1,3,1,0 -1,2,0x50,1,4,1,0 -1,2,0x60,1,5,1,0 -1,2,0x70,1,6,1,0 -1,2,0x80,1,7,1,0 -1,2,0xa0,1,0,0,1 -1,2,0xb0,1,1,0,1 \ No newline at end of file +EC_DATA_CS_ECRECOVER,EC_DATA_ID,EC_DATA_LIMB_0,EC_DATA_LIMB_1,EC_DATA_LIMB_2,EC_DATA_LIMB_3,EC_DATA_LIMB_4,EC_DATA_LIMB_5,EC_DATA_LIMB_6,EC_DATA_LIMB_7,EC_DATA_SUCCESS_BIT,EC_DATA_INDEX,EC_DATA_IS_DATA,EC_DATA_IS_RES +1,1,0x279d,0x9462,0x1558,0xf755,0x7968,0x98fc,0x4bd3,0x6b6d,1,0,1,0 +1,1,0x407c,0xae77,0x5378,0x65af,0xe523,0xb79c,0x74cc,0x680b,1,1,1,0 +1,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,2,1,0 +1,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x001b,1,3,1,0 +1,1,0xc2ff,0x96fe,0xed87,0x49a5,0xad1c,0x0714,0xf950,0xb5ac,1,4,1,0 +1,1,0x939d,0x8ace,0xdbed,0xcbc2,0x9496,0x14ab,0x8af0,0x6312,1,5,1,0 +1,1,0x1fee,0xcd50,0xadc6,0x273f,0xdd5d,0x11c6,0xda18,0xc8cf,1,6,1,0 +1,1,0xe14e,0x2787,0xf5a9,0x0af7,0xc7c1,0x328e,0x7d0a,0x2c42,1,7,1,0 +1,1,0x0,0x0,0x0,0x0,0x0,0x0,0xb2e1,0x7f39,1,0,0,1 +1,1,0xd52e,0x0434,0x0f40,0x41e4,0xceb2,0xb028,0x8440,0x6893,1,1,0,1 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0010,1,0,1,0 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0020,1,1,1,0 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0030,1,2,1,0 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0040,1,3,1,0 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0050,1,4,1,0 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0060,1,5,1,0 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0070,1,6,1,0 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0080,1,7,1,0 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x00a0,1,0,0,1 +1,2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x00b0,1,1,0,1 diff --git a/prover/zkevm/prover/ecdsa/testdata/unaligned_gnark_test.csv b/prover/zkevm/prover/ecdsa/testdata/unaligned_gnark_test.csv index 0f8db32d238..089383d7bf9 100644 --- a/prover/zkevm/prover/ecdsa/testdata/unaligned_gnark_test.csv +++ b/prover/zkevm/prover/ecdsa/testdata/unaligned_gnark_test.csv @@ -1,40 +1,40 @@ -IS_ACTIVE,IS_PUSHING,IS_FETCHING,SOURCE,LIMB,SUCCESS_BIT,IS_DATA,IS_RES,TX_HASH_HI,TX_HASH_LO,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_IS_PUBLIC_KEY,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_INDEX,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_DATA -1,0,1,0,0x279d94621558f755796898fc4bd36b6d,1,1,0,0,0,0,0,0 -1,0,1,0,0x407cae77537865afe523b79c74cc680b,1,1,0,0,0,0,0,0 -1,0,1,0,0x0,1,1,0,0,0,0,0,0 -1,0,1,0,0x1b,1,1,0,0,0,0,0,0 -1,0,1,0,0xc2ff96feed8749a5ad1c0714f950b5ac,1,1,0,0,0,0,0,0 -1,0,1,0,0x939d8acedbedcbc2949614ab8af06312,1,1,0,0,0,0,0,0 -1,0,1,0,0x1feecd50adc6273fdd5d11c6da18c8cf,1,1,0,0,0,0,0,0 -1,0,1,0,0xe14e2787f5a90af7c7c1328e7d0a2c42,1,1,0,0,0,0,0,0 -1,0,1,0,0xb2e17f39,1,0,1,0,0,0,0,0 -1,0,1,0,0xd52e04340f4041e4ceb2b02884406893,1,0,1,0,0,0,0,0 -1,1,0,0,0,0,0,0,0,0,1,0,0xdc6c702420180434981fbcbed7a6497d -1,1,0,0,0,0,0,0,0,0,1,1,0xe71450cdef9a3cf1e9fd8f837881576a -1,1,0,0,0,0,0,0,0,0,1,2,0x22500b99bb024b12eec122edec75564a -1,1,0,0,0,0,0,0,0,0,1,3,0x72e05bf0d94609b37a4fa54a0a6c8795 -1,1,0,0,0,0,0,0,0,0,0,4,0x279d94621558f755796898fc4bd36b6d -1,1,0,0,0,0,0,0,0,0,0,5,0x407cae77537865afe523b79c74cc680b -1,1,0,0,0,0,0,0,0,0,0,6,0x0 -1,1,0,0,0,0,0,0,0,0,0,7,0x1b -1,1,0,0,0,0,0,0,0,0,0,8,0xc2ff96feed8749a5ad1c0714f950b5ac -1,1,0,0,0,0,0,0,0,0,0,9,0x939d8acedbedcbc2949614ab8af06312 -1,1,0,0,0,0,0,0,0,0,0,10,0x1feecd50adc6273fdd5d11c6da18c8cf -1,1,0,0,0,0,0,0,0,0,0,11,0xe14e2787f5a90af7c7c1328e7d0a2c42 -1,1,0,0,0,0,0,0,0,0,0,12,0x1 -1,1,0,0,0,0,0,0,0,0,0,13,0x1 -1,0,1,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,0,0x0 -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,1,0,0xfa2dc7346b29484359a5e24e9894c85c -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,1,1,0x6c75445a64a738a2e62443863e4d610e -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,1,2,0x24bcac6af7d4f4d9d062bdae6661ba47 -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,1,3,0x8e55fc55e65b7b71224cdbfccfa32cec -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,4,0x4be146e06cc1b37342b6b7b1fa8542ae -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,5,0x58a62103b8af0f7d58f8a1ffffcf7914 -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,6,0x0 -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,7,0x1b -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,8,0xa7b0f504b652b3a621921c78c587fdf8 -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,9,0x0a3ab590e22c304b0b0930e90c4e081d -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,10,0x5428459ef7e6bd079fbbb7c6fd95cc6c -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,11,0x7fe68c93ed4ae75cee36810e79e8a0e5 -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,12,0x1 -1,1,0,1,0,0,0,0,0x4be146e06cc1b37342b6b7b1fa8542ae,0x58a62103b8af0f7d58f8a1ffffcf7914,0,13,0x0 \ No newline at end of file +IS_ACTIVE,IS_PUSHING,IS_FETCHING,SOURCE,LIMB_0,LIMB_1,LIMB_2,LIMB_3,LIMB_4,LIMB_5,LIMB_6,LIMB_7,SUCCESS_BIT,IS_DATA,IS_RES,TX_HASH_0,TX_HASH_1,TX_HASH_2,TX_HASH_3,TX_HASH_4,TX_HASH_5,TX_HASH_6,TX_HASH_7,TX_HASH_8,TX_HASH_9,TX_HASH_10,TX_HASH_11,TX_HASH_12,TX_HASH_13,TX_HASH_14,TX_HASH_15,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_IS_PUBLIC_KEY,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_INDEX,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_DATA_0,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_DATA_1,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_DATA_2,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_DATA_3,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_DATA_4,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_DATA_5,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_DATA_6,ECDSA_ANTICHAMBER_UNALIGNED_GNARK_DATA_GNARK_DATA_7 +1,0,1,0,0x279d,0x9462,0x1558,0xf755,0x7968,0x98fc,0x4bd3,0x6b6d,1,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,0,1,0,0x407c,0xae77,0x5378,0x65af,0xe523,0xb79c,0x74cc,0x680b,1,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,0,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,0,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x001b,1,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,0,1,0,0xc2ff,0x96fe,0xed87,0x49a5,0xad1c,0x0714,0xf950,0xb5ac,1,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,0,1,0,0x939d,0x8ace,0xdbed,0xcbc2,0x9496,0x14ab,0x8af0,0x6312,1,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,0,1,0,0x1fee,0xcd50,0xadc6,0x273f,0xdd5d,0x11c6,0xda18,0xc8cf,1,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,0,1,0,0xe14e,0x2787,0xf5a9,0x0af7,0xc7c1,0x328e,0x7d0a,0x2c42,1,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,0,1,0,0x0,0x0,0x0,0x0,0x0,0x0,0xb2e1,0x7f39,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,0,1,0,0xd52e,0x0434,0x0f40,0x41e4,0xceb2,0xb028,0x8440,0x6893,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0xdc6c,0x7024,0x2018,0x0434,0x981f,0xbcbe,0xd7a6,0x497d +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0xe714,0x50cd,0xef9a,0x3cf1,0xe9fd,0x8f83,0x7881,0x576a +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,2,0x2250,0x0b99,0xbb02,0x4b12,0xeec1,0x22ed,0xec75,0x564a +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,3,0x72e0,0x5bf0,0xd946,0x09b3,0x7a4f,0xa54a,0x0a6c,0x8795 +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,4,0x279d,0x9462,0x1558,0xf755,0x7968,0x98fc,0x4bd3,0x6b6d +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,5,0x407c,0xae77,0x5378,0x65af,0xe523,0xb79c,0x74cc,0x680b +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x001b +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,8,0xc2ff,0x96fe,0xed87,0x49a5,0xad1c,0x0714,0xf950,0xb5ac +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,9,0x939d,0x8ace,0xdbed,0xcbc2,0x9496,0x14ab,0x8af0,0x6312 +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,10,0x1fee,0xcd50,0xadc6,0x273f,0xdd5d,0x11c6,0xda18,0xc8cf +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,11,0xe14e,0x2787,0xf5a9,0x0af7,0xc7c1,0x328e,0x7d0a,0x2c42 +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,12,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0001 +1,1,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,13,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0001 +1,0,1,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,1,0,0xfa2d,0xc734,0x6b29,0x4843,0x59a5,0xe24e,0x9894,0xc85c +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,1,1,0x6c75,0x445a,0x64a7,0x38a2,0xe624,0x4386,0x3e4d,0x610e +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,1,2,0x24bc,0xac6a,0xf7d4,0xf4d9,0xd062,0xbdae,0x6661,0xba47 +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,1,3,0x8e55,0xfc55,0xe65b,0x7b71,0x224c,0xdbfc,0xcfa3,0x2cec +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,4,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,5,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914 +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x001b +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,8,0xa7b0,0xf504,0xb652,0xb3a6,0x2192,0x1c78,0xc587,0xfdf8 +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,9,0x0a3a,0xb590,0xe22c,0x304b,0x0b09,0x30e9,0x0c4e,0x081d +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,10,0x5428,0x459e,0xf7e6,0xbd07,0x9fbb,0xb7c6,0xfd95,0xcc6c +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,11,0x7fe6,0x8c93,0xed4a,0xe75c,0xee36,0x810e,0x79e8,0xa0e5 +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,12,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0001 +1,1,0,1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0x4be1,0x46e0,0x6cc1,0xb373,0x42b6,0xb7b1,0xfa85,0x42ae,0x58a6,0x2103,0xb8af,0x0f7d,0x58f8,0xa1ff,0xffcf,0x7914,0,13,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 diff --git a/prover/zkevm/prover/ecdsa/txn_signature.go b/prover/zkevm/prover/ecdsa/txn_signature.go index 1d8915332a3..d5743c15588 100644 --- a/prover/zkevm/prover/ecdsa/txn_signature.go +++ b/prover/zkevm/prover/ecdsa/txn_signature.go @@ -1,6 +1,7 @@ package ecdsa import ( + "fmt" "github.com/consensys/linea-monorepo/prover/crypto/keccak" "github.com/consensys/linea-monorepo/prover/maths/common/smartvectors" "github.com/consensys/linea-monorepo/prover/maths/common/vector" @@ -9,6 +10,7 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" sym "github.com/consensys/linea-monorepo/prover/symbolic" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" commonconstraints "github.com/consensys/linea-monorepo/prover/zkevm/prover/common/common_constraints" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" ) @@ -21,8 +23,7 @@ import ( // columns for rlp-txn lives on the arithmetization side. type txSignature struct { Inputs *txSignatureInputs - txHashHi ifaces.Column - txHashLo ifaces.Column + txHash [common.NbLimbU256]ifaces.Column isTxHash ifaces.Column // provider for keccak, Provider contains the inputs and outputs of keccak hash. @@ -35,17 +36,16 @@ type txSignatureInputs struct { } func newTxSignatures(comp *wizard.CompiledIOP, inp txSignatureInputs) *txSignature { - var ( - createCol = createColFn(comp, NAME_TXSIGNATURE, inp.ac.size) + var createCol = createColFn(comp, NAME_TXSIGNATURE, inp.ac.size) - res = &txSignature{ - txHashHi: createCol("TX_HASH_HI"), - txHashLo: createCol("TX_HASH_LO"), - isTxHash: createCol("TX_IS_HASH_HI"), + var res = &txSignature{ + isTxHash: createCol("TX_IS_HASH_HI"), + Inputs: &inp, + } - Inputs: &inp, - } - ) + for i := 0; i < common.NbLimbU256; i++ { + res.txHash[i] = createCol(fmt.Sprintf("TX_HASH_%d", i)) + } commonconstraints.MustBeBinary(comp, res.isTxHash) @@ -57,19 +57,13 @@ func newTxSignatures(comp *wizard.CompiledIOP, inp txSignatureInputs) *txSignatu ) // txHashHi remains the same between two fetchings. - comp.InsertGlobal(0, "txHashHI_REMAIN_SAME", - sym.Mul(inp.ac.IsActive, - sym.Sub(1, inp.ac.IsFetching), - sym.Sub(res.txHashHi, column.Shift(res.txHashHi, -1))), - ) - - // txHashLo remains the same between two fetchings. - comp.InsertGlobal(0, "txHashLO_REMAIN_SAME", - sym.Mul(inp.ac.IsActive, - sym.Sub(1, inp.ac.IsFetching), - sym.Sub(res.txHashLo, column.Shift(res.txHashLo, -1)), - ), - ) + for i := 0; i < common.NbLimbU256; i++ { + comp.InsertGlobal(0, ifaces.QueryIDf("txHash_REMAIN_SAME_%d", i), + sym.Mul(inp.ac.IsActive, + sym.Sub(1, inp.ac.IsFetching), + sym.Sub(res.txHash[i], column.Shift(res.txHash[i], -1))), + ) + } res.provider = res.GetProvider(comp, inp.RlpTxn) @@ -93,8 +87,8 @@ func (txn *txSignature) GetProvider(comp *wizard.CompiledIOP, rlpTxn generic.Gen // it builds an infoModule from native columns func (txn *txSignature) buildInfoModule() generic.GenInfoModule { info := generic.GenInfoModule{ - HashHi: txn.txHashHi, - HashLo: txn.txHashLo, + HashHi: txn.txHash[:common.NbLimbU128], + HashLo: txn.txHash[common.NbLimbU128:], IsHashHi: txn.isTxHash, IsHashLo: txn.isTxHash, } @@ -107,33 +101,39 @@ func (txn *txSignature) assignTxSignature(run *wizard.ProverRuntime, nbActualEcR var ( nbEcRecover = nbActualEcRecover n = startAt(nbEcRecover) - hashHi = vector.Repeat(field.Zero(), n) - hashLo = vector.Repeat(field.Zero(), n) isTxHash = vector.Repeat(field.Zero(), n) size = txn.Inputs.ac.size permTrace = keccak.GenerateTrace(txn.Inputs.RlpTxn.ScanStreams(run)) - v, w field.Element + + hashColumns [common.NbLimbU256][]field.Element ) + for i := 0; i < common.NbLimbU256; i++ { + hashColumns[i] = vector.Repeat(field.Zero(), n) + } + for _, digest := range permTrace.HashOutPut { - hi := digest[:halfDigest] - lo := digest[halfDigest:] + hashLimbs := SplitBytes(digest[:]) - v.SetBytes(hi[:]) - w.SetBytes(lo[:]) + // Initialize limb values for each column of txHash + for j, limb := range hashLimbs { + var element field.Element + element.SetBytes(limb[:]) + + repeat := vector.Repeat(element, nbRowsPerTxSign) + hashColumns[j] = append(hashColumns[j], repeat...) + } - repeatLo := vector.Repeat(w, nbRowsPerTxSign) - repeatHi := vector.Repeat(v, nbRowsPerTxSign) repeatIsTxHash := vector.Repeat(field.Zero(), nbRowsPerTxSign-1) - hashHi = append(hashHi, repeatHi...) - hashLo = append(hashLo, repeatLo...) isTxHash = append(isTxHash, field.One()) isTxHash = append(isTxHash, repeatIsTxHash...) } - run.AssignColumn(txn.txHashHi.GetColID(), smartvectors.RightZeroPadded(hashHi, size)) - run.AssignColumn(txn.txHashLo.GetColID(), smartvectors.RightZeroPadded(hashLo, size)) + for i := 0; i < common.NbLimbU256; i++ { + run.AssignColumn(txn.txHash[i].GetColID(), smartvectors.RightZeroPadded(hashColumns[i], size)) + } + run.AssignColumn(txn.isTxHash.GetColID(), smartvectors.RightZeroPadded(isTxHash, size)) } diff --git a/prover/zkevm/prover/ecdsa/unaligned_gnark.go b/prover/zkevm/prover/ecdsa/unaligned_gnark.go index 0396eca4e57..105d1aaf44d 100644 --- a/prover/zkevm/prover/ecdsa/unaligned_gnark.go +++ b/prover/zkevm/prover/ecdsa/unaligned_gnark.go @@ -1,6 +1,10 @@ package ecdsa import ( + "fmt" + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/projection" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" "math/big" "github.com/consensys/gnark-crypto/ecc/secp256k1/ecdsa" @@ -8,7 +12,6 @@ import ( "github.com/consensys/linea-monorepo/prover/maths/field" "github.com/consensys/linea-monorepo/prover/protocol/column" "github.com/consensys/linea-monorepo/prover/protocol/dedicated" - "github.com/consensys/linea-monorepo/prover/protocol/dedicated/projection" "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" sym "github.com/consensys/linea-monorepo/prover/symbolic" @@ -17,13 +20,17 @@ import ( const ( nbRowsPerPublicKey = 4 + + // gnarkDataLeftAlignmentOffset is the number of bits that were offset in UnalignedGnarkData.GnarkData. + gnarkDataLeftAlignmentOffset = (generic.TotalLimbSize - generic.TotalLimbSize/common.NbLimbU128) * 8 ) type UnalignedGnarkData struct { IsPublicKey ifaces.Column GnarkIndex ifaces.Column GnarkPublicKeyIndex ifaces.Column - GnarkData ifaces.Column + GnarkData [common.NbLimbU128]ifaces.Column + GnarkDataLA [common.NbLimbU128]ifaces.Column // auxiliary columns isIndex0 ifaces.Column @@ -48,10 +55,9 @@ type unalignedGnarkDataSource struct { IsFetching ifaces.Column IsData ifaces.Column IsRes ifaces.Column - Limb ifaces.Column + Limb [common.NbLimbU128]ifaces.Column SuccessBit ifaces.Column - TxHashHi ifaces.Column - TxHashLo ifaces.Column + TxHash [common.NbLimbU256]ifaces.Column } // TxSignatureGetter is a function that is expected a signature for a transaction @@ -65,7 +71,6 @@ func newUnalignedGnarkData(comp *wizard.CompiledIOP, size int, src *unalignedGna IsPublicKey: createCol("IS_PUBLIC_KEY"), GnarkIndex: createCol("GNARK_INDEX"), GnarkPublicKeyIndex: createCol("GNARK_PUBLIC_KEY_INDEX"), - GnarkData: createCol("GNARK_DATA"), isEcrecoverAndFetching: createCol("IS_ECRECOVER_AND_FETCHING"), isNotPublicKeyAndPushing: createCol("IS_NOT_PUBLIC_KEY_AND_PUSHING"), @@ -73,11 +78,17 @@ func newUnalignedGnarkData(comp *wizard.CompiledIOP, size int, src *unalignedGna size: size, } + for i := 0; i < common.NbLimbU128; i++ { + res.GnarkDataLA[i] = createCol(fmt.Sprintf("GNARK_DATA_LA_%d", i)) + res.GnarkData[i] = createCol(fmt.Sprintf("GNARK_DATA_%d", i)) + } + res.csDataIds(comp) res.csIndex(comp, src) res.csProjectionEcRecover(comp, src) res.csTxHash(comp, src) res.csTxEcRecoverBit(comp, src) + res.csGnarkDataLeftAligned(comp, src) // we do not have to constrain the public key as it will be done in the // address sub-module @@ -105,25 +116,43 @@ func (d *UnalignedGnarkData) assignUnalignedGnarkData(run *wizard.ProverRuntime, var ( sourceSource = run.GetColumn(src.Source.GetColID()) sourceIsActive = run.GetColumn(src.IsActive.GetColID()) - sourceLimb = run.GetColumn(src.Limb.GetColID()) sourceSuccessBit = run.GetColumn(src.SuccessBit.GetColID()) - sourceTxHashHi = run.GetColumn(src.TxHashHi.GetColID()) - sourceTxHashLo = run.GetColumn(src.TxHashLo.GetColID()) + + sourceLimb [common.NbLimbU128]ifaces.ColAssignment + sourceTxHash [common.NbLimbU256]ifaces.ColAssignment ) - if sourceSource.Len() != d.size || sourceIsActive.Len() != d.size || sourceLimb.Len() != d.size || sourceSuccessBit.Len() != d.size || sourceTxHashHi.Len() != d.size || sourceTxHashLo.Len() != d.size { + for i := 0; i < common.NbLimbU128; i++ { + sourceLimb[i] = run.GetColumn(src.Limb[i].GetColID()) + + if sourceLimb[i].Len() != d.size { + panic("unexpected source limb length") + } + } + + for i := 0; i < common.NbLimbU256; i++ { + sourceTxHash[i] = run.GetColumn(src.TxHash[i].GetColID()) + + if sourceTxHash[i].Len() != d.size { + panic("unexpected source hash length") + } + } + + if sourceSource.Len() != d.size || sourceIsActive.Len() != d.size || sourceSuccessBit.Len() != d.size { panic("unexpected source length") } - var resIsPublicKey, resGnarkIndex, resGnarkPkIndex, resGnarkData []field.Element - txCount := 0 + var resIsPublicKey, resGnarkIndex, resGnarkPkIndex []field.Element + var resGnarkDataLA [common.NbLimbU128][]field.Element + var resGnarkData [common.NbLimbU128][]field.Element + var txCount = 0 for i := 0; i < d.size; { var ( isActive = sourceIsActive.Get(i) source = sourceSource.Get(i) - rows = make([]field.Element, nbRowsPerGnarkPushing) + rows = make([]field.Element, nbRowsPerGnarkPushing*common.NbLimbU128) buf [32]byte prehashedMsg [32]byte r, s, v = new(big.Int), new(big.Int), new(big.Int) @@ -132,66 +161,119 @@ func (d *UnalignedGnarkData) assignUnalignedGnarkData(run *wizard.ProverRuntime, ) if isActive.IsOne() && source.Cmp(&SOURCE_ECRECOVER) == 0 { + // we copy the data from ecrecover prependZeroCount = nbRowsPerEcRecFetching + // we copy the data from ecrecover - rows[12] = sourceSuccessBit.Get(i) - rows[13] = field.NewElement(1) + var successBitLimbs [common.NbLimbU128]field.Element + successBitLimbs[common.NbLimbU128-1] = sourceSuccessBit.Get(i) + + for j, limb := range successBitLimbs { + rows[12*common.NbLimbU128+j] = limb + } + + var oneLimbs [common.NbLimbU128]field.Element + oneLimbs[common.NbLimbU128-1] = field.NewElement(1) + + for j, limb := range oneLimbs { + rows[13*common.NbLimbU128+j] = limb + } // copy h0, h1, r0, r1, s0, s1, v0, v1 for j := 0; j < 8; j++ { - rows[4+j] = sourceLimb.Get(i + j) + for k := 0; k < common.NbLimbU128; k++ { + colOffset := j * common.NbLimbU128 + rows[4*common.NbLimbU128+colOffset+k] = sourceLimb[k].Get(i + j) + } + } + + var txBts []byte + for _, txHighBtsRow := range rows[4*common.NbLimbU128 : 6*common.NbLimbU128] { + bytes := txHighBtsRow.Bytes() + txBts = append(txBts, bytes[30:]...) + } + + copy(prehashedMsg[:], txBts[:]) + + var vBts []byte + for _, vBtsRow := range rows[6*common.NbLimbU128 : 8*common.NbLimbU128] { + bytes := vBtsRow.Bytes() + vBts = append(vBts, bytes[30:]...) } - txHighBts := rows[4].Bytes() - txLowBts := rows[5].Bytes() - copy(prehashedMsg[:16], txHighBts[16:]) - copy(prehashedMsg[16:], txLowBts[16:]) - v0Bts := rows[6].Bytes() - v1Bts := rows[7].Bytes() - copy(buf[:16], v0Bts[16:]) - copy(buf[16:], v1Bts[16:]) - v.SetBytes(buf[:]) - r0Bts := rows[8].Bytes() - r1Bts := rows[9].Bytes() - copy(buf[:16], r0Bts[16:]) - copy(buf[16:], r1Bts[16:]) - r.SetBytes(buf[:]) - s0Bts := rows[10].Bytes() - s1Bts := rows[11].Bytes() - copy(buf[:16], s0Bts[16:]) - copy(buf[16:], s1Bts[16:]) - s.SetBytes(buf[:]) + + v.SetBytes(vBts) + + var rBts []byte + for _, rBtsRow := range rows[8*common.NbLimbU128 : 10*common.NbLimbU128] { + bytes := rBtsRow.Bytes() + rBts = append(rBts, bytes[30:]...) + } + + r.SetBytes(rBts) + + var sBts []byte + for _, sBtsRow := range rows[10*common.NbLimbU128 : 12*common.NbLimbU128] { + bytes := sBtsRow.Bytes() + sBts = append(sBts, bytes[30:]...) + } + + s.SetBytes(sBts) i += NB_ECRECOVER_INPUTS } else if isActive.IsOne() && source.Cmp(&SOURCE_TX) == 0 { prependZeroCount = nbRowsPerTxSignFetching + // we copy the data from the transcation - rows[12] = field.NewElement(1) // always succeeds, we only include valid transactions - rows[13] = field.NewElement(0) + var successBitLimbs [common.NbLimbU128]field.Element + successBitLimbs[common.NbLimbU128-1] = field.NewElement(1) // always succeeds, we only include valid transactions + + for j, limb := range successBitLimbs { + rows[12*common.NbLimbU128+j] = limb + } + + var zeroLimbs [common.NbLimbU128]field.Element + for j, limb := range zeroLimbs { + rows[13*common.NbLimbU128+j] = limb + } // copy txHashHi, txHashLo - rows[4] = sourceTxHashHi.Get(i) - rows[5] = sourceTxHashLo.Get(i) - - // get r, s, v corresponding to the transaction hash from the provider - txLow := sourceTxHashLo.Get(i) - txHigh := sourceTxHashHi.Get(i) - txLowBts := txLow.Bytes() - txHighBts := txHigh.Bytes() - copy(prehashedMsg[:16], txHighBts[16:]) - copy(prehashedMsg[16:], txLowBts[16:]) + for j := 0; j < common.NbLimbU256; j++ { + rows[4*common.NbLimbU128+j] = sourceTxHash[j].Get(i) + } + + var txBts []byte + for _, txHighBtsRow := range rows[4*common.NbLimbU128 : 6*common.NbLimbU128] { + bytes := txHighBtsRow.Bytes() + txBts = append(txBts, bytes[30:]...) + } + + copy(prehashedMsg[:], txBts[:]) + r, s, v, err = txSigs(txCount, prehashedMsg[:]) if err != nil { utils.Panic("error getting tx-signature err=%v, txNum=%v", err, txCount) } + v.FillBytes(buf[:]) - rows[6].SetBytes(buf[:16]) - rows[7].SetBytes(buf[16:]) + + vLimbs := SplitBytes(buf[:]) + for j, vLimb := range vLimbs { + rows[6*common.NbLimbU128+j].SetBytes(vLimb) + } + r.FillBytes(buf[:]) - rows[8].SetBytes(buf[:16]) - rows[9].SetBytes(buf[16:]) + + rLimbs := SplitBytes(buf[:]) + for j, rLimb := range rLimbs { + rows[8*common.NbLimbU128+j].SetBytes(rLimb) + } + s.FillBytes(buf[:]) - rows[10].SetBytes(buf[:16]) - rows[11].SetBytes(buf[16:]) + + sLimbs := SplitBytes(buf[:]) + for j, sLimb := range sLimbs { + rows[10*common.NbLimbU128+j].SetBytes(sLimb) + } i += NB_TX_INPUTS txCount++ @@ -208,12 +290,18 @@ func (d *UnalignedGnarkData) assignUnalignedGnarkData(run *wizard.ProverRuntime, if err != nil { utils.Panic("error recovering public: err=%v v=%v r=%v s=%v", err.Error(), v.Uint64()-27, r.String(), s.String()) } + pkx := pk.A.X.Bytes() - rows[0].SetBytes(pkx[:16]) - rows[1].SetBytes(pkx[16:]) + pkxLimbs := SplitBytes(pkx[:]) + for j, xLimb := range pkxLimbs { + rows[j].SetBytes(xLimb) + } + pky := pk.A.Y.Bytes() - rows[2].SetBytes(pky[:16]) - rows[3].SetBytes(pky[16:]) + pkyLimbs := SplitBytes(pky[:]) + for j, yLimb := range pkyLimbs { + rows[2*common.NbLimbU128+j].SetBytes(yLimb) + } resIsPublicKey = append(resIsPublicKey, make([]field.Element, prependZeroCount)...) for i := 0; i < 4; i++ { @@ -232,19 +320,42 @@ func (d *UnalignedGnarkData) assignUnalignedGnarkData(run *wizard.ProverRuntime, resGnarkIndex = append(resGnarkIndex, field.NewElement(uint64(i))) } - resGnarkData = append(resGnarkData, make([]field.Element, prependZeroCount)...) - resGnarkData = append(resGnarkData, rows...) + for j := 0; j < common.NbLimbU128; j++ { + resGnarkData[j] = append(resGnarkData[j], make([]field.Element, prependZeroCount)...) + resGnarkDataLA[j] = append(resGnarkDataLA[j], make([]field.Element, prependZeroCount)...) + } + + // Assign limb elements column by column + for j := 0; j < nbRowsPerGnarkPushing*common.NbLimbU128; j++ { + rowBytes := rows[j].Bytes() + bytes := [16]byte{} + copy(bytes[:], rowBytes[30:]) + + var elementLA field.Element + elementLA.SetBytes(bytes[:]) + + resGnarkData[j%common.NbLimbU128] = append(resGnarkData[j%common.NbLimbU128], rows[j]) + resGnarkDataLA[j%common.NbLimbU128] = append(resGnarkDataLA[j%common.NbLimbU128], elementLA) + } } // pad the vectors to the full size. It is expected in the hashing module // that the underlying vectors have same length. + resIsPublicKey = append(resIsPublicKey, make([]field.Element, d.size-len(resIsPublicKey))...) resGnarkIndex = append(resGnarkIndex, make([]field.Element, d.size-len(resGnarkIndex))...) resGnarkPkIndex = append(resGnarkPkIndex, make([]field.Element, d.size-len(resGnarkPkIndex))...) - resGnarkData = append(resGnarkData, make([]field.Element, d.size-len(resGnarkData))...) + run.AssignColumn(d.IsPublicKey.GetColID(), smartvectors.RightZeroPadded(resIsPublicKey, d.size)) run.AssignColumn(d.GnarkIndex.GetColID(), smartvectors.RightZeroPadded(resGnarkIndex, d.size)) run.AssignColumn(d.GnarkPublicKeyIndex.GetColID(), smartvectors.RightZeroPadded(resGnarkPkIndex, d.size)) - run.AssignColumn(d.GnarkData.GetColID(), smartvectors.RightZeroPadded(resGnarkData, d.size)) + + for j := 0; j < common.NbLimbU128; j++ { + resGnarkDataLA[j] = append(resGnarkDataLA[j], make([]field.Element, d.size-len(resGnarkDataLA[j]))...) + resGnarkData[j] = append(resGnarkData[j], make([]field.Element, d.size-len(resGnarkData[j]))...) + + run.AssignColumn(d.GnarkDataLA[j].GetColID(), smartvectors.RightZeroPadded(resGnarkDataLA[j], d.size)) + run.AssignColumn(d.GnarkData[j].GetColID(), smartvectors.RightZeroPadded(resGnarkData[j], d.size)) + } } func (d *UnalignedGnarkData) assignHelperColumns(run *wizard.ProverRuntime, src *unalignedGnarkDataSource) { @@ -254,6 +365,7 @@ func (d *UnalignedGnarkData) assignHelperColumns(run *wizard.ProverRuntime, src sourceIsData := run.GetColumn(src.IsData.GetColID()) sourceIsPublicKey := run.GetColumn(d.IsPublicKey.GetColID()) sourceGnarkIndex := run.GetColumn(d.GnarkIndex.GetColID()) + if sourceSource.Len() != d.size || sourcIsFetching.Len() != d.size || sourceIsPushing.Len() != d.size || sourceIsPublicKey.Len() != d.size { utils.Panic("unexpected source length") } @@ -352,8 +464,8 @@ func (d *UnalignedGnarkData) csProjectionEcRecover(comp *wizard.CompiledIOP, src projection.InsertProjection( comp, ifaces.QueryIDf("%v_PROJECT_ECRECOVER", NAME_UNALIGNED_GNARKDATA), - []ifaces.Column{src.Limb}, - []ifaces.Column{d.GnarkData}, + src.Limb[:], + d.GnarkData[:], // Big Endian d.isEcrecoverAndFetching, d.isNotPublicKeyAndPushing, ) @@ -361,16 +473,19 @@ func (d *UnalignedGnarkData) csProjectionEcRecover(comp *wizard.CompiledIOP, src func (d *UnalignedGnarkData) csTxHash(comp *wizard.CompiledIOP, src *unalignedGnarkDataSource) { // that we have projected correctly txHashHi and txHashLo - comp.InsertGlobal( - ROUND_NR, - ifaces.QueryIDf("%v_%v", NAME_UNALIGNED_GNARKDATA, "TXHASH_HI"), - sym.Mul(d.isIndex4, src.Source, sym.Sub(d.GnarkData, src.TxHashHi)), - ) - comp.InsertGlobal( - ROUND_NR, - ifaces.QueryIDf("%v_%v", NAME_UNALIGNED_GNARKDATA, "TXHASH_LO"), - sym.Mul(d.isIndex5, src.Source, sym.Sub(d.GnarkData, src.TxHashLo)), - ) + for i := 0; i < common.NbLimbU128; i++ { + comp.InsertGlobal( + ROUND_NR, + ifaces.QueryIDf("%v_%v_%d", NAME_UNALIGNED_GNARKDATA, "TXHASH_HI", i), + sym.Mul(d.isIndex4, src.Source, sym.Sub(d.GnarkData[i], src.TxHash[i])), + ) + + comp.InsertGlobal( + ROUND_NR, + ifaces.QueryIDf("%v_%v_%d", NAME_UNALIGNED_GNARKDATA, "TXHASH_LO", i), + sym.Mul(d.isIndex5, src.Source, sym.Sub(d.GnarkData[i], src.TxHash[i+common.NbLimbU128])), + ) + } } func (d *UnalignedGnarkData) csTxEcRecoverBit(comp *wizard.CompiledIOP, src *unalignedGnarkDataSource) { @@ -380,9 +495,25 @@ func (d *UnalignedGnarkData) csTxEcRecoverBit(comp *wizard.CompiledIOP, src *una // additionally, we do not have to binary constrain as it is already // enforced inside gnark circuit - comp.InsertGlobal( - ROUND_NR, - ifaces.QueryIDf("%v_%v", NAME_UNALIGNED_GNARKDATA, "ECRECOVERBIT"), - sym.Mul(d.isIndex13, src.Source, d.GnarkData), - ) + + for i := 0; i < common.NbLimbU128; i++ { + comp.InsertGlobal( + ROUND_NR, + ifaces.QueryIDf("%v_%v_%d", NAME_UNALIGNED_GNARKDATA, "ECRECOVERBIT", i), + sym.Mul(d.isIndex13, src.Source, d.GnarkData[i]), + ) + } +} + +func (d *UnalignedGnarkData) csGnarkDataLeftAligned(comp *wizard.CompiledIOP, src *unalignedGnarkDataSource) { + // Ensures that GnarkDataLA is the same as GnarkData with some byte offset. The offset is performed by multiplying + // GnarkData by 2 ** (8 * gnarkDataLeftAlignmentOffset) where 8 - is the number of bits to shift. + + for i := 0; i < common.NbLimbU128; i++ { + comp.InsertGlobal( + ROUND_NR, + ifaces.QueryIDf("%v_%v_%d", NAME_UNALIGNED_GNARKDATA, "LEFT_ALIGNEMENT", i), + sym.Sub(sym.Mul(d.GnarkData[i], sym.Pow(2, gnarkDataLeftAlignmentOffset)), d.GnarkDataLA[i]), + ) + } } diff --git a/prover/zkevm/prover/ecdsa/unaligned_gnark_test.go b/prover/zkevm/prover/ecdsa/unaligned_gnark_test.go index 1575ed19024..5af0f33c0de 100644 --- a/prover/zkevm/prover/ecdsa/unaligned_gnark_test.go +++ b/prover/zkevm/prover/ecdsa/unaligned_gnark_test.go @@ -1,6 +1,8 @@ package ecdsa import ( + "fmt" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "os" "testing" @@ -27,33 +29,42 @@ func TestUnalignedGnarkDataAssign(t *testing.T) { IsPushing: ct.GetCommit(build, "IS_PUSHING"), IsFetching: ct.GetCommit(build, "IS_FETCHING"), IsActive: ct.GetCommit(build, "IS_ACTIVE"), - Limb: ct.GetCommit(build, "LIMB"), SuccessBit: ct.GetCommit(build, "SUCCESS_BIT"), IsData: ct.GetCommit(build, "IS_DATA"), IsRes: ct.GetCommit(build, "IS_RES"), - TxHashHi: ct.GetCommit(build, "TX_HASH_HI"), - TxHashLo: ct.GetCommit(build, "TX_HASH_LO"), } + + for i := 0; i < common.NbLimbU128; i++ { + uagSrc.Limb[i] = ct.GetCommit(build, fmt.Sprintf("LIMB_%d", i)) + } + + for i := 0; i < common.NbLimbU256; i++ { + uagSrc.TxHash[i] = ct.GetCommit(build, fmt.Sprintf("TX_HASH_%d", i)) + } + uag = newUnalignedGnarkData(build.CompiledIOP, ct.LenPadded(), uagSrc) }, dummy.Compile) proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) { - ct.Assign(run, - "SOURCE", - "IS_ACTIVE", - "IS_PUSHING", - "IS_FETCHING", - "LIMB", - "SUCCESS_BIT", - "IS_DATA", - "IS_RES", - "TX_HASH_HI", - "TX_HASH_LO") + var names = []string{"SOURCE", "IS_ACTIVE", "IS_PUSHING", "IS_FETCHING"} + for i := 0; i < common.NbLimbU128; i++ { + names = append(names, fmt.Sprintf("LIMB_%d", i)) + } + + names = append(names, "SUCCESS_BIT", "IS_DATA", "IS_RES") + for i := 0; i < common.NbLimbU256; i++ { + names = append(names, fmt.Sprintf("TX_HASH_%d", i)) + } + + ct.Assign(run, names...) uag.Assign(run, uagSrc, dummyTxSignatureGetter) - ct.CheckAssignment(run, - // TODO: add also auxiliary columns - string(uag.IsPublicKey.GetColID()), - string(uag.GnarkIndex.GetColID()), - string(uag.GnarkData.GetColID())) + + assignementNames := []string{string(uag.IsPublicKey.GetColID()), string(uag.GnarkIndex.GetColID())} + + for i := 0; i < common.NbLimbU128; i++ { + assignementNames = append(assignementNames, string(uag.GnarkData[i].GetColID())) + } + + ct.CheckAssignment(run, assignementNames...) }) if err := wizard.Verify(cmp, proof); err != nil { t.Fatal("proof failed", err) diff --git a/prover/zkevm/prover/ecdsa/utils_for_test.go b/prover/zkevm/prover/ecdsa/utils_for_test.go index 493c8a0c099..670bf70b511 100644 --- a/prover/zkevm/prover/ecdsa/utils_for_test.go +++ b/prover/zkevm/prover/ecdsa/utils_for_test.go @@ -1,6 +1,7 @@ package ecdsa import ( + "fmt" "github.com/consensys/linea-monorepo/prover/crypto/keccak" "github.com/consensys/linea-monorepo/prover/maths/common/smartvectors" "github.com/consensys/linea-monorepo/prover/maths/common/vector" @@ -8,23 +9,29 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" - "golang.org/x/crypto/sha3" ) func commitEcRecTxnData(comp *wizard.CompiledIOP, size1 int, size int, ac *antichamber) (td *txnData, ecRec *EcRecover) { td = &txnData{ - fromHi: comp.InsertCommit(0, ifaces.ColIDf("txn_data.FromHi"), size1), - fromLo: comp.InsertCommit(0, ifaces.ColIDf("txn_data.FromLo"), size1), - ct: comp.InsertCommit(0, ifaces.ColIDf("txn_data.CT"), size1), + ct: comp.InsertCommit(0, ifaces.ColIDf("txn_data.CT"), size1), + } + + for i := 0; i < common.NbLimbU256; i++ { + td.from[i] = comp.InsertCommit(0, ifaces.ColID(fmt.Sprintf("txndata.From_%d", i)), size1) } ecRec = &EcRecover{ - Limb: comp.InsertCommit(0, ifaces.ColIDf("ECRECOVER_LIMB"), size), EcRecoverIsRes: comp.InsertCommit(0, ifaces.ColIDf("ECRECOVER_ISRES"), size), } - ac.IsActive = comp.InsertCommit(0, ifaces.ColID("AntiChamber_IsActive"), size) + + for i := 0; i < common.NbLimbU128; i++ { + ecRec.Limb[i] = comp.InsertCommit(0, ifaces.ColIDf("ECRECOVER_LIMB_%d", i), size) + } + + ac.IsActive = comp.InsertCommit(0, "AntiChamber_IsActive", size) return td, ecRec } @@ -36,12 +43,15 @@ func AssignEcRecTxnData( td *txnData, ecRec *EcRecover, ac *antichamber, ) { - - permTrace := keccak.GenerateTrace(gbm.ScanStreams(run)) + streams := gbm.ScanStreams(run) + permTrace := keccak.GenerateTrace(streams) // now assign ecRecover.Limb and txn_data.From from the permutation trace. isEcRecRes := make([]field.Element, nbEcRec*nbRowsPerEcRec) - ecRecLimb := make([]field.Element, nbEcRec*nbRowsPerEcRec) + ecRecLimb := make([][]field.Element, common.NbLimbU128) + for i := range ecRecLimb { + ecRecLimb[i] = make([]field.Element, nbEcRec*nbRowsPerEcRec) + } nbRowsPerTxInTxnData := 9 var ctWit []field.Element @@ -51,35 +61,57 @@ func AssignEcRecTxnData( } } - fromHi := make([]field.Element, nbTxS*nbRowsPerTxInTxnData) - fromLo := make([]field.Element, nbTxS*nbRowsPerTxInTxnData) + // Initialize an array of from limbs columns + from := make([][]field.Element, 0, common.NbLimbU256) + for i := 0; i < common.NbLimbU256; i++ { + from = append(from, make([]field.Element, nbTxS*nbRowsPerTxInTxnData)) + } + offSetEcRec := 0 if nbEcRec+nbTxS != len(permTrace.HashOutPut) { utils.Panic("the number of generated hash %v should be %v + %v", len(permTrace.HashOutPut), nbEcRec, nbTxS) } - for i, hashRes := range permTrace.HashOutPut { + for i, hashRes := range permTrace.HashOutPut { if i < nbEcRec { isEcRecRes[i*nbRowsPerEcRec+offSetEcRec] = field.One() isEcRecRes[i*nbRowsPerEcRec+offSetEcRec+1] = field.One() - ecRecLimb[i*nbRowsPerEcRec+offSetEcRec].SetBytes(hashRes[halfDigest-trimmingSize : halfDigest]) - ecRecLimb[i*nbRowsPerEcRec+offSetEcRec+1].SetBytes(hashRes[halfDigest:]) + ecRecHiLimbs := SplitBytes(hashRes[addressTrimmedBytes:halfDigest]) + ecRecLoLimbs := SplitBytes(hashRes[halfDigest:]) + + for j := 0; j < common.NbLimbU128; j++ { + if j >= addressTrimmedColumns { + ecRecLimb[j][i*nbRowsPerEcRec+offSetEcRec].SetBytes(ecRecHiLimbs[j-addressTrimmedColumns]) + } + + ecRecLimb[j][i*nbRowsPerEcRec+offSetEcRec+1].SetBytes(ecRecLoLimbs[j]) + } + + continue } else { + fromLimbs := SplitBytes(hashRes[:]) j := i - nbEcRec - fromHi[j*nbRowsPerTxInTxnData].SetBytes(hashRes[halfDigest-trimmingSize : halfDigest]) - fromLo[j*nbRowsPerTxInTxnData].SetBytes(hashRes[halfDigest:]) + for k, limb := range fromLimbs { + // Initialize limb values for each column of from + from[k][j*nbRowsPerTxInTxnData].SetBytes(limb[:]) + } } } run.AssignColumn(ecRec.EcRecoverIsRes.GetColID(), smartvectors.RightZeroPadded(isEcRecRes, size)) - run.AssignColumn(ecRec.Limb.GetColID(), smartvectors.RightZeroPadded(ecRecLimb, size)) + + for i := 0; i < common.NbLimbU128; i++ { + run.AssignColumn(ecRec.Limb[i].GetColID(), smartvectors.RightZeroPadded(ecRecLimb[i], size)) + } // they are arithmetization columns, so LeftZeroPad - run.AssignColumn(td.fromHi.GetColID(), smartvectors.LeftZeroPadded(fromHi, sizeTxnData)) - run.AssignColumn(td.fromLo.GetColID(), smartvectors.LeftZeroPadded(fromLo, sizeTxnData)) + for i := 0; i < common.NbLimbU256; i++ { + run.AssignColumn(td.from[i].GetColID(), smartvectors.LeftZeroPadded(from[i], sizeTxnData)) + } + run.AssignColumn(td.ct.GetColID(), smartvectors.LeftZeroPadded(ctWit, sizeTxnData)) effectiveSize := nbEcRec*nbRowsPerEcRec + nbTxS*nbRowsPerTxSign @@ -115,9 +147,11 @@ func (td *txnData) assignTxnDataFromPK( utils.Panic("error generating signature") } buf := pk.A.RawBytes() + hasher.Write(buf[:]) res := hasher.Sum(nil) hasher.Reset() + pkHash = append(pkHash, res) } @@ -131,28 +165,39 @@ func (td *txnData) assignTxnDataFromPK( } // populate the columns FromHi and FromLo - fromHi := make([]field.Element, maxNbTx*nbRowsPerTxInTxnData) - fromLo := make([]field.Element, maxNbTx*nbRowsPerTxInTxnData) + from := make([][]field.Element, 0, common.NbLimbU256) + for i := 0; i < common.NbLimbU256; i++ { + from = append(from, make([]field.Element, maxNbTx*nbRowsPerTxInTxnData)) + } for i := 0; i < len(pkHash); i++ { - fromHi[i*nbRowsPerTxInTxnData].SetBytes(pkHash[i][halfDigest-trimmingSize : halfDigest]) - fromLo[i*nbRowsPerTxInTxnData].SetBytes(pkHash[i][halfDigest:]) + fromLimbs := SplitBytes(pkHash[i]) + for j, limb := range fromLimbs { + // Initialize limb values for each column of from + from[j][i*nbRowsPerTxInTxnData].SetBytes(limb[:]) + } } // these are arithmetization columns, so LeftZeroPad - run.AssignColumn(td.fromHi.GetColID(), smartvectors.LeftZeroPadded(fromHi, ac.Inputs.settings.sizeTxnData(nbRowsPerTxInTxnData))) - run.AssignColumn(td.fromLo.GetColID(), smartvectors.LeftZeroPadded(fromLo, ac.Inputs.settings.sizeTxnData(nbRowsPerTxInTxnData))) + for i := 0; i < common.NbLimbU256; i++ { + run.AssignColumn(td.from[i].GetColID(), smartvectors.LeftZeroPadded(from[i], ac.Inputs.settings.sizeTxnData(nbRowsPerTxInTxnData))) + } + run.AssignColumn(td.ct.GetColID(), smartvectors.LeftZeroPadded(ctWit, ac.Inputs.settings.sizeTxnData(nbRowsPerTxInTxnData))) } // it commits to the txn_data func commitTxnData(comp *wizard.CompiledIOP, limits *Settings, nbRowsPerTxInTxnData int) (td *txnData) { size := limits.sizeTxnData(nbRowsPerTxInTxnData) + td = &txnData{ - fromHi: comp.InsertCommit(0, ifaces.ColIDf("txn_data.FromHi"), size), - fromLo: comp.InsertCommit(0, ifaces.ColIDf("txn_data.FromLo"), size), - ct: comp.InsertCommit(0, ifaces.ColIDf("txn_data.CT"), size), + ct: comp.InsertCommit(0, ifaces.ColIDf("txn_data.CT"), size), } + + for i := 0; i < common.NbLimbU256; i++ { + td.from[i] = comp.InsertCommit(0, ifaces.ColIDf("txn_data.From_%d", i), size) + } + return td } diff --git a/prover/zkevm/prover/ecpair/circuits.go b/prover/zkevm/prover/ecpair/circuits.go index 0eb12266933..5061c72e173 100644 --- a/prover/zkevm/prover/ecpair/circuits.go +++ b/prover/zkevm/prover/ecpair/circuits.go @@ -11,6 +11,7 @@ import ( "github.com/consensys/gnark/std/math/bitslice" "github.com/consensys/gnark/std/math/emulated" "github.com/consensys/gnark/std/math/emulated/emparams" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) var fpParams sw_bn254.BaseField @@ -20,9 +21,9 @@ type ( fpElement = emulated.Element[emparams.BN254Fp] ) -// G1ElementWizard represents G1 element as Wizard limbs (2 limbs of 128 bits) +// G1ElementWizard represents G1 element as Wizard limbs (8 columns, 2 limbs of 128 bits) type G1ElementWizard struct { - P [nbG1Limbs]frontend.Variable + P [nbG1Limbs * common.NbLimbU128]frontend.Variable } // ToG1Element converts G1ElementWizard to G1Affine used in circuit @@ -42,9 +43,9 @@ func (c *G1ElementWizard) ToG1Element(api frontend.API, fp *emulated.Field[sw_bn return P } -// G2ElementWizard represents G2 element as Wizard limbs (4 limbs of 128 bits) +// G2ElementWizard represents G2 element as Wizard limbs (8 columns, 4 limbs of 16 bits) type G2ElementWizard struct { - Q [nbG2Limbs]frontend.Variable + Q [nbG2Limbs * common.NbLimbU128]frontend.Variable } // ToG2Element converts G2ElementWizard to G2Affine used in circuit @@ -90,7 +91,7 @@ func (c *G2ElementWizard) ToG2Element(api frontend.API, fp *emulated.Field[sw_bn // GtElementWizard represents Gt element as Wizard limbs (24 limbs of 128 bits) type GtElementWizard struct { - T [nbGtLimbs]frontend.Variable + T [nbGtLimbs * common.NbLimbU128]frontend.Variable } // ToGtElement converts GtElementWizard to target group element used in circuit @@ -108,30 +109,30 @@ func (c *GtElementWizard) ToGtElement(api frontend.API, fp *emulated.Field[sw_bn C1B2XLimbs := make([]frontend.Variable, fpParams.NbLimbs()) C1B2YLimbs := make([]frontend.Variable, fpParams.NbLimbs()) - C0B0XLimbs[2], C0B0XLimbs[3] = bitslice.Partition(api, c.T[0], 64, bitslice.WithNbDigits(128)) - C0B0XLimbs[0], C0B0XLimbs[1] = bitslice.Partition(api, c.T[1], 64, bitslice.WithNbDigits(128)) - C0B0YLimbs[2], C0B0YLimbs[3] = bitslice.Partition(api, c.T[2], 64, bitslice.WithNbDigits(128)) - C0B0YLimbs[0], C0B0YLimbs[1] = bitslice.Partition(api, c.T[3], 64, bitslice.WithNbDigits(128)) - C0B1XLimbs[2], C0B1XLimbs[3] = bitslice.Partition(api, c.T[4], 64, bitslice.WithNbDigits(128)) - C0B1XLimbs[0], C0B1XLimbs[1] = bitslice.Partition(api, c.T[5], 64, bitslice.WithNbDigits(128)) - C0B1YLimbs[2], C0B1YLimbs[3] = bitslice.Partition(api, c.T[6], 64, bitslice.WithNbDigits(128)) - C0B1YLimbs[0], C0B1YLimbs[1] = bitslice.Partition(api, c.T[7], 64, bitslice.WithNbDigits(128)) - C0B2XLimbs[2], C0B2XLimbs[3] = bitslice.Partition(api, c.T[8], 64, bitslice.WithNbDigits(128)) - C0B2XLimbs[0], C0B2XLimbs[1] = bitslice.Partition(api, c.T[9], 64, bitslice.WithNbDigits(128)) - C0B2YLimbs[2], C0B2YLimbs[3] = bitslice.Partition(api, c.T[10], 64, bitslice.WithNbDigits(128)) - C0B2YLimbs[0], C0B2YLimbs[1] = bitslice.Partition(api, c.T[11], 64, bitslice.WithNbDigits(128)) - C1B0XLimbs[2], C1B0XLimbs[3] = bitslice.Partition(api, c.T[12], 64, bitslice.WithNbDigits(128)) - C1B0XLimbs[0], C1B0XLimbs[1] = bitslice.Partition(api, c.T[13], 64, bitslice.WithNbDigits(128)) - C1B0YLimbs[2], C1B0YLimbs[3] = bitslice.Partition(api, c.T[14], 64, bitslice.WithNbDigits(128)) - C1B0YLimbs[0], C1B0YLimbs[1] = bitslice.Partition(api, c.T[15], 64, bitslice.WithNbDigits(128)) - C1B1XLimbs[2], C1B1XLimbs[3] = bitslice.Partition(api, c.T[16], 64, bitslice.WithNbDigits(128)) - C1B1XLimbs[0], C1B1XLimbs[1] = bitslice.Partition(api, c.T[17], 64, bitslice.WithNbDigits(128)) - C1B1YLimbs[2], C1B1YLimbs[3] = bitslice.Partition(api, c.T[18], 64, bitslice.WithNbDigits(128)) - C1B1YLimbs[0], C1B1YLimbs[1] = bitslice.Partition(api, c.T[19], 64, bitslice.WithNbDigits(128)) - C1B2XLimbs[2], C1B2XLimbs[3] = bitslice.Partition(api, c.T[20], 64, bitslice.WithNbDigits(128)) - C1B2XLimbs[0], C1B2XLimbs[1] = bitslice.Partition(api, c.T[21], 64, bitslice.WithNbDigits(128)) - C1B2YLimbs[2], C1B2YLimbs[3] = bitslice.Partition(api, c.T[22], 64, bitslice.WithNbDigits(128)) - C1B2YLimbs[0], C1B2YLimbs[1] = bitslice.Partition(api, c.T[23], 64, bitslice.WithNbDigits(128)) + //C0B0XLimbs[2], C0B0XLimbs[3] = bitslice.Partition(api, c.T[0], 64, bitslice.WithNbDigits(128)) + //C0B0XLimbs[0], C0B0XLimbs[1] = bitslice.Partition(api, c.T[1], 64, bitslice.WithNbDigits(128)) + //C0B0YLimbs[2], C0B0YLimbs[3] = bitslice.Partition(api, c.T[2], 64, bitslice.WithNbDigits(128)) + //C0B0YLimbs[0], C0B0YLimbs[1] = bitslice.Partition(api, c.T[3], 64, bitslice.WithNbDigits(128)) + //C0B1XLimbs[2], C0B1XLimbs[3] = bitslice.Partition(api, c.T[4], 64, bitslice.WithNbDigits(128)) + //C0B1XLimbs[0], C0B1XLimbs[1] = bitslice.Partition(api, c.T[5], 64, bitslice.WithNbDigits(128)) + //C0B1YLimbs[2], C0B1YLimbs[3] = bitslice.Partition(api, c.T[6], 64, bitslice.WithNbDigits(128)) + //C0B1YLimbs[0], C0B1YLimbs[1] = bitslice.Partition(api, c.T[7], 64, bitslice.WithNbDigits(128)) + //C0B2XLimbs[2], C0B2XLimbs[3] = bitslice.Partition(api, c.T[8], 64, bitslice.WithNbDigits(128)) + //C0B2XLimbs[0], C0B2XLimbs[1] = bitslice.Partition(api, c.T[9], 64, bitslice.WithNbDigits(128)) + //C0B2YLimbs[2], C0B2YLimbs[3] = bitslice.Partition(api, c.T[10], 64, bitslice.WithNbDigits(128)) + //C0B2YLimbs[0], C0B2YLimbs[1] = bitslice.Partition(api, c.T[11], 64, bitslice.WithNbDigits(128)) + //C1B0XLimbs[2], C1B0XLimbs[3] = bitslice.Partition(api, c.T[12], 64, bitslice.WithNbDigits(128)) + //C1B0XLimbs[0], C1B0XLimbs[1] = bitslice.Partition(api, c.T[13], 64, bitslice.WithNbDigits(128)) + //C1B0YLimbs[2], C1B0YLimbs[3] = bitslice.Partition(api, c.T[14], 64, bitslice.WithNbDigits(128)) + //C1B0YLimbs[0], C1B0YLimbs[1] = bitslice.Partition(api, c.T[15], 64, bitslice.WithNbDigits(128)) + //C1B1XLimbs[2], C1B1XLimbs[3] = bitslice.Partition(api, c.T[16], 64, bitslice.WithNbDigits(128)) + //C1B1XLimbs[0], C1B1XLimbs[1] = bitslice.Partition(api, c.T[17], 64, bitslice.WithNbDigits(128)) + //C1B1YLimbs[2], C1B1YLimbs[3] = bitslice.Partition(api, c.T[18], 64, bitslice.WithNbDigits(128)) + //C1B1YLimbs[0], C1B1YLimbs[1] = bitslice.Partition(api, c.T[19], 64, bitslice.WithNbDigits(128)) + //C1B2XLimbs[2], C1B2XLimbs[3] = bitslice.Partition(api, c.T[20], 64, bitslice.WithNbDigits(128)) + //C1B2XLimbs[0], C1B2XLimbs[1] = bitslice.Partition(api, c.T[21], 64, bitslice.WithNbDigits(128)) + //C1B2YLimbs[2], C1B2YLimbs[3] = bitslice.Partition(api, c.T[22], 64, bitslice.WithNbDigits(128)) + //C1B2YLimbs[0], C1B2YLimbs[1] = bitslice.Partition(api, c.T[23], 64, bitslice.WithNbDigits(128)) e12Tower := [12]*fpElement{ fp.NewElement(C0B0XLimbs), @@ -184,7 +185,7 @@ func (c *MultiG2GroupcheckCircuit) Define(api frontend.API) error { // G2GroupCheckInstance is a single instance of G2 group check. type G2GroupCheckInstance struct { Q G2ElementWizard - IsSuccess frontend.Variable + IsSuccess [common.NbLimbU128]frontend.Variable } func (c *G2GroupCheckInstance) Check(api frontend.API, fp *emulated.Field[sw_bn254.BaseField], pairing *sw_bn254.Pairing) error { @@ -194,7 +195,7 @@ func (c *G2GroupCheckInstance) Check(api frontend.API, fp *emulated.Field[sw_bn2 return nil } -// MultiG1GroupcheckCircuit is a circuit that checks multiple Miller loop +// MultiMillerLoopMulCircuit is a circuit that checks multiple Miller loop // computation correctness. Use [newMultiMillerLoopMulCircuit] to create a new // instance with bounded number of allowed checks. type MultiMillerLoopMulCircuit struct { @@ -277,7 +278,7 @@ type MillerLoopFinalExpInstance struct { Prev GtElementWizard P G1ElementWizard Q G2ElementWizard - Expected [2]frontend.Variable + Expected [2 * common.NbLimbU128]frontend.Variable } func (c *MillerLoopFinalExpInstance) Check(api frontend.API, fp *emulated.Field[sw_bn254.BaseField], pairing *sw_bn254.Pairing) error { diff --git a/prover/zkevm/prover/ecpair/ecpair.go b/prover/zkevm/prover/ecpair/ecpair.go index 52f882d0a0d..ba2abd883b0 100644 --- a/prover/zkevm/prover/ecpair/ecpair.go +++ b/prover/zkevm/prover/ecpair/ecpair.go @@ -4,6 +4,8 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" + "fmt" ) func createColFn(comp *wizard.CompiledIOP, rootName string, size int) func(name string) ifaces.Column { @@ -55,25 +57,31 @@ type ECPair struct { AlignedG2MembershipData *plonk.Alignment AlignedMillerLoopCircuit *plonk.Alignment AlignedFinalExpCircuit *plonk.Alignment + + flattenLimbsMillerLoop *common.FlattenColumn + flattenLimbsFinalExp *common.FlattenColumn + flattenLimbsG2Membership *common.FlattenColumn } func NewECPairZkEvm(comp *wizard.CompiledIOP, limits *Limits) *ECPair { - return newECPair( - comp, - limits, - &ECPairSource{ - CsEcpairing: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_ECPAIRING"), - ID: comp.Columns.GetHandle("ecdata.ID"), - Limb: comp.Columns.GetHandle("ecdata.LIMB"), - SuccessBit: comp.Columns.GetHandle("ecdata.SUCCESS_BIT"), - Index: comp.Columns.GetHandle("ecdata.INDEX"), - IsEcPairingData: comp.Columns.GetHandle("ecdata.IS_ECPAIRING_DATA"), - IsEcPairingResult: comp.Columns.GetHandle("ecdata.IS_ECPAIRING_RESULT"), - AccPairings: comp.Columns.GetHandle("ecdata.ACC_PAIRINGS"), - TotalPairings: comp.Columns.GetHandle("ecdata.TOTAL_PAIRINGS"), - CsG2Membership: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_G2_MEMBERSHIP"), - }, - ).WithG2MembershipCircuit(comp). + source := &ECPairSource{ + CsEcpairing: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_ECPAIRING"), + ID: comp.Columns.GetHandle("ecdata.ID"), + SuccessBit: comp.Columns.GetHandle("ecdata.SUCCESS_BIT"), + Index: comp.Columns.GetHandle("ecdata.INDEX"), + IsEcPairingData: comp.Columns.GetHandle("ecdata.IS_ECPAIRING_DATA"), + IsEcPairingResult: comp.Columns.GetHandle("ecdata.IS_ECPAIRING_RESULT"), + AccPairings: comp.Columns.GetHandle("ecdata.ACC_PAIRINGS"), + TotalPairings: comp.Columns.GetHandle("ecdata.TOTAL_PAIRINGS"), + CsG2Membership: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_G2_MEMBERSHIP"), + } + + for i := 0; i < common.NbLimbU128; i++ { + source.Limbs[i] = comp.Columns.GetHandle(ifaces.ColIDf("ecdata.LIMB_%d", i)) + } + + return newECPair(comp, limits, source). + WithG2MembershipCircuit(comp). WithPairingCircuit(comp, plonk.WithRangecheck(16, 6, true)) } @@ -123,11 +131,15 @@ func newECPair(comp *wizard.CompiledIOP, limits *Limits, ecSource *ECPairSource) // WithPairingCircuit attaches the gnark circuit to the ECPair module for // enforcing the pairing checks. func (ec *ECPair) WithPairingCircuit(comp *wizard.CompiledIOP, options ...plonk.Option) *ECPair { + ec.flattenLimbsMillerLoop = common.NewFlattenColumn(comp, common.NbLimbU128, + ec.UnalignedPairingData.Limbs[:], ec.UnalignedPairingData.ToMillerLoopCircuitMask) + ec.flattenLimbsMillerLoop.CsFlattenProjection(comp) + alignInputMillerLoop := &plonk.CircuitAlignmentInput{ Round: roundNr, Name: nameAlignmentMillerLoop, - DataToCircuit: ec.UnalignedPairingData.Limb, - DataToCircuitMask: ec.UnalignedPairingData.ToMillerLoopCircuitMask, + DataToCircuit: ec.flattenLimbsMillerLoop.Limbs(), + DataToCircuitMask: ec.flattenLimbsMillerLoop.Mask(), Circuit: newMultiMillerLoopMulCircuit(ec.NbMillerLoopInputInstances), InputFiller: inputFillerMillerLoop, PlonkOptions: options, @@ -135,11 +147,15 @@ func (ec *ECPair) WithPairingCircuit(comp *wizard.CompiledIOP, options ...plonk. } ec.AlignedMillerLoopCircuit = plonk.DefineAlignment(comp, alignInputMillerLoop) + ec.flattenLimbsFinalExp = common.NewFlattenColumn(comp, common.NbLimbU128, + ec.UnalignedPairingData.Limbs[:], ec.UnalignedPairingData.ToFinalExpCircuitMask) + ec.flattenLimbsFinalExp.CsFlattenProjection(comp) + alignInputFinalExp := &plonk.CircuitAlignmentInput{ Round: roundNr, Name: nameAlignmentFinalExp, - DataToCircuit: ec.UnalignedPairingData.Limb, - DataToCircuitMask: ec.UnalignedPairingData.ToFinalExpCircuitMask, + DataToCircuit: ec.flattenLimbsFinalExp.Limbs(), + DataToCircuitMask: ec.flattenLimbsFinalExp.Mask(), Circuit: newMultiMillerLoopFinalExpCircuit(ec.NbFinalExpInputInstances), InputFiller: inputFillerFinalExp, PlonkOptions: options, @@ -153,11 +169,15 @@ func (ec *ECPair) WithPairingCircuit(comp *wizard.CompiledIOP, options ...plonk. // WithG2MembershipCircuit attaches the gnark circuit to the ECPair module for // enforcing the G2 membership checks. func (ec *ECPair) WithG2MembershipCircuit(comp *wizard.CompiledIOP, options ...plonk.Option) *ECPair { + ec.flattenLimbsG2Membership = common.NewFlattenColumn(comp, common.NbLimbU128, + ec.UnalignedG2MembershipData.Limbs[:], ec.UnalignedG2MembershipData.ToG2MembershipCircuitMask) + ec.flattenLimbsG2Membership.CsFlattenProjection(comp) + alignInputG2Membership := &plonk.CircuitAlignmentInput{ Round: roundNr, Name: nameAlignmentG2Subgroup, - DataToCircuit: ec.UnalignedG2MembershipData.Limb, - DataToCircuitMask: ec.UnalignedG2MembershipData.ToG2MembershipCircuitMask, + DataToCircuit: ec.flattenLimbsG2Membership.Limbs(), + DataToCircuitMask: ec.flattenLimbsG2Membership.Mask(), Circuit: newMultiG2GroupcheckCircuit(ec.NbG2MembershipInputInstances), InputFiller: inputFillerG2Membership, PlonkOptions: options, @@ -174,7 +194,7 @@ func (ec *ECPair) WithG2MembershipCircuit(comp *wizard.CompiledIOP, options ...p type ECPairSource struct { ID ifaces.Column Index ifaces.Column - Limb ifaces.Column + Limbs [common.NbLimbU128]ifaces.Column SuccessBit ifaces.Column AccPairings ifaces.Column TotalPairings ifaces.Column @@ -199,7 +219,7 @@ type UnalignedG2MembershipData struct { IsPulling ifaces.Column IsComputed ifaces.Column - Limb ifaces.Column + Limbs [common.NbLimbU128]ifaces.Column SuccessBit ifaces.Column ToG2MembershipCircuitMask ifaces.Column } @@ -208,13 +228,18 @@ func newUnalignedG2MembershipData(comp *wizard.CompiledIOP, limits *Limits) *Una size := limits.sizeECPair() createCol := createColFn(comp, nameG2Data, size) - return &UnalignedG2MembershipData{ + res := &UnalignedG2MembershipData{ IsPulling: createCol("IS_PULLING"), IsComputed: createCol("IS_COMPUTED"), - Limb: createCol("LIMB"), SuccessBit: createCol("SUCCESS_BIT"), ToG2MembershipCircuitMask: createCol("TO_G2_MEMBERSHIP_CIRCUIT"), } + + for i := 0; i < common.NbLimbU128; i++ { + res.Limbs[i] = createCol(fmt.Sprintf("LIMB_%d", i)) + } + + return res } // UnalignedPairingData represents the unaligned columns for the pairing data. @@ -236,7 +261,7 @@ type UnalignedPairingData struct { InstanceID ifaces.Column PairID ifaces.Column TotalPairs ifaces.Column - Limb ifaces.Column + Limbs [common.NbLimbU128]ifaces.Column Index ifaces.Column ToMillerLoopCircuitMask ifaces.Column @@ -252,11 +277,10 @@ func newUnalignedPairingData(comp *wizard.CompiledIOP, limits *Limits) *Unaligne size := limits.sizeECPair() createCol := createColFn(comp, namePairingData, size) - return &UnalignedPairingData{ + res := &UnalignedPairingData{ IsActive: createCol("IS_ACTIVE"), IsPulling: createCol("IS_PULLING"), IsComputed: createCol("IS_COMPUTED"), - Limb: createCol("LIMB"), InstanceID: createCol("INSTANCE_ID"), PairID: createCol("PAIR_ID"), TotalPairs: createCol("TOTAL_PAIRS"), @@ -271,4 +295,10 @@ func newUnalignedPairingData(comp *wizard.CompiledIOP, limits *Limits) *Unaligne IsAccumulatorInit: createCol("IS_ACCUMULATOR_INIT"), Index: createCol("INDEX"), } + + for i := 0; i < common.NbLimbU128; i++ { + res.Limbs[i] = createCol(fmt.Sprintf("LIMB_%d", i)) + } + + return res } diff --git a/prover/zkevm/prover/ecpair/ecpair_assignment.go b/prover/zkevm/prover/ecpair/ecpair_assignment.go index 2cc78dcfafe..82011051475 100644 --- a/prover/zkevm/prover/ecpair/ecpair_assignment.go +++ b/prover/zkevm/prover/ecpair/ecpair_assignment.go @@ -41,39 +41,52 @@ func (ec *ECPair) Assign(run *wizard.ProverRuntime) { // assign the public inputs for gnark membership check circuit if ec.AlignedG2MembershipData != nil { + ec.flattenLimbsG2Membership.Run(run) ec.AlignedG2MembershipData.Assign(run) } // assign the public inputs for gnark Miller loop circuit if ec.AlignedMillerLoopCircuit != nil { + ec.flattenLimbsMillerLoop.Run(run) ec.AlignedMillerLoopCircuit.Assign(run) } // assign the public inputs for gnark final exponentiation circuit if ec.AlignedFinalExpCircuit != nil { + ec.flattenLimbsFinalExp.Run(run) ec.AlignedFinalExpCircuit.Assign(run) } } func (ec *ECPair) assignPairingData(run *wizard.ProverRuntime) { var ( + srcLimbs [common.NbLimbU128][]field.Element + srcIsPairing = ec.ECPairSource.CsEcpairing.GetColAssignment(run).IntoRegVecSaveAlloc() - srcLimbs = ec.ECPairSource.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() srcIsData = ec.ECPairSource.IsEcPairingData.GetColAssignment(run).IntoRegVecSaveAlloc() srcIsRes = ec.ECPairSource.IsEcPairingResult.GetColAssignment(run).IntoRegVecSaveAlloc() srcID = ec.ECPairSource.ID.GetColAssignment(run).IntoRegVecSaveAlloc() ) - if len(srcIsPairing) != len(srcLimbs) || len(srcIsPairing) != len(srcIsData) || len(srcIsPairing) != len(srcIsRes) { + if len(srcIsPairing) != len(srcIsData) || len(srcIsPairing) != len(srcIsRes) { utils.Panic("ECPair: input length mismatch") } + for k := range common.NbLimbU128 { + srcLimbs[k] = ec.ECPairSource.Limbs[k].GetColAssignment(run).IntoRegVecSaveAlloc() + + if len(srcLimbs[k]) != len(srcIsPairing) { + utils.Panic("ECPair: LIMB_%d input length mismatch", k) + } + } + var ( - inputResult [2]field.Element - pairingInG1 [][nbG1Limbs]field.Element - pairingInG2 [][nbG2Limbs]field.Element + inputResult [common.NbLimbU128]ResultLimbs + pairingInG1 [common.NbLimbU128][]G1Limbs + pairingInG2 [common.NbLimbU128][]G2Limbs ) var ( + dstLimb [common.NbLimbU128]*common.VectorBuilder + dstIsActive = common.NewVectorBuilder(ec.UnalignedPairingData.IsActive) - dstLimb = common.NewVectorBuilder(ec.UnalignedPairingData.Limb) dstToMillerLoop = common.NewVectorBuilder(ec.UnalignedPairingData.ToMillerLoopCircuitMask) dstToFinalExp = common.NewVectorBuilder(ec.UnalignedPairingData.ToFinalExpCircuitMask) dstIsPulling = common.NewVectorBuilder(ec.UnalignedPairingData.IsPulling) @@ -91,7 +104,11 @@ func (ec *ECPair) assignPairingData(run *wizard.ProverRuntime) { dstIsResult = common.NewVectorBuilder(ec.UnalignedPairingData.IsResultOfInstance) ) - for currPos := 0; currPos < len(srcLimbs); { + for k := range common.NbLimbU128 { + dstLimb[k] = common.NewVectorBuilder(ec.UnalignedPairingData.Limbs[k]) + } + + for currPos := 0; currPos < len(srcLimbs[0]); { // we need to check if the current position is a pairing or not. If not, // then skip it. // @@ -122,19 +139,32 @@ func (ec *ECPair) assignPairingData(run *wizard.ProverRuntime) { } nbActualTotalPairs := len(actualInputs) // now, we have continous chunk of data that is for the pairing. Prepare it for processing. - pairingInG1 = make([][nbG1Limbs]field.Element, nbActualTotalPairs) - pairingInG2 = make([][nbG2Limbs]field.Element, nbActualTotalPairs) + for k := range common.NbLimbU128 { + pairingInG1[k] = make([]G1Limbs, nbActualTotalPairs) + pairingInG2[k] = make([]G2Limbs, nbActualTotalPairs) + } + for ii, i := range actualInputs { for j := 0; j < nbG1Limbs; j++ { - pairingInG1[ii][j] = srcLimbs[currPos+i*(nbG1Limbs+nbG2Limbs)+j] + for k := range common.NbLimbU128 { + pairingInG1[k][ii][j] = srcLimbs[k][currPos+i*(nbG1Limbs+nbG2Limbs)+j] + } } for j := 0; j < nbG2Limbs; j++ { - pairingInG2[ii][j] = srcLimbs[currPos+i*(nbG1Limbs+nbG2Limbs)+nbG1Limbs+j] + for k := range common.NbLimbU128 { + pairingInG2[k][ii][j] = srcLimbs[k][currPos+i*(nbG1Limbs+nbG2Limbs)+nbG1Limbs+j] + } } } - inputResult[0] = srcLimbs[currPos+nbInputs*(nbG1Limbs+nbG2Limbs)] - inputResult[1] = srcLimbs[currPos+nbInputs*(nbG1Limbs+nbG2Limbs)+1] + + for k := range common.NbLimbU128 { + inputResult[k][0] = srcLimbs[k][currPos+nbInputs*(nbG1Limbs+nbG2Limbs)] + inputResult[k][1] = srcLimbs[k][currPos+nbInputs*(nbG1Limbs+nbG2Limbs)+1] + } limbs := processPairingData(pairingInG1, pairingInG2, inputResult) + + limbsLen := len(limbs[0]) + instanceId := srcID[currPos] // processed data has the input limbs, but we have entered the intermediate Gt accumulator values @@ -144,8 +174,11 @@ func (ec *ECPair) assignPairingData(run *wizard.ProverRuntime) { // - the instance id // - the index of the current limb // - activeness of the submodule - for i := 0; i < len(limbs); i++ { - dstLimb.PushField(limbs[i]) + for i := 0; i < limbsLen; i++ { + for k := range common.NbLimbU128 { + dstLimb[k].PushField(limbs[k][i]) + } + if i == 0 { dstIsFirstLine.PushOne() } else { @@ -295,8 +328,10 @@ func (ec *ECPair) assignPairingData(run *wizard.ProverRuntime) { currPos += nbInputs*(nbG1Limbs+nbG2Limbs) + 2 } // Finally, we pad and assign the assigned data. + for i := range common.NbLimbU128 { + dstLimb[i].PadAndAssign(run, field.Zero()) + } dstIsActive.PadAndAssign(run, field.Zero()) - dstLimb.PadAndAssign(run, field.Zero()) dstPairId.PadAndAssign(run, field.Zero()) dstTotalPairs.PadAndAssign(run, field.Zero()) dstToMillerLoop.PadAndAssign(run, field.Zero()) @@ -314,18 +349,34 @@ func (ec *ECPair) assignPairingData(run *wizard.ProverRuntime) { dstIsResult.PadAndAssign(run, field.Zero()) } -func processPairingData(pairingInG1 [][nbG1Limbs]field.Element, pairingInG2 [][nbG2Limbs]field.Element, inputResult [2]field.Element) []field.Element { - var res []field.Element +func processPairingData( + pairingInG1 [common.NbLimbU128][]G1Limbs, + pairingInG2 [common.NbLimbU128][]G2Limbs, + inputResult [common.NbLimbU128]ResultLimbs, +) [common.NbLimbU128][]field.Element { + var res [common.NbLimbU128][]field.Element var acc bn254.GT acc.SetOne() - for i := 0; i < len(pairingInG1); i++ { + + pairingLength := len(pairingInG1[0]) + for i := 0; i < pairingLength; i++ { accLimbs := convGtGnarkToWizard(acc) - res = append(res, accLimbs[:]...) - res = append(res, pairingInG1[i][:]...) - res = append(res, pairingInG2[i][:]...) - inG1 := convG1WizardToGnark(pairingInG1[i]) - inG2 := convG2WizardToGnark(pairingInG2[i]) + + var toGnarkG1Limbs [common.NbLimbU128]G1Limbs + var toGnarkG2Limbs [common.NbLimbU128]G2Limbs + + for j := range common.NbLimbU128 { + res[j] = append(res[j], accLimbs[j][:]...) + res[j] = append(res[j], pairingInG1[j][i][:]...) + res[j] = append(res[j], pairingInG2[j][i][:]...) + + toGnarkG1Limbs[j] = pairingInG1[j][i] + toGnarkG2Limbs[j] = pairingInG2[j][i] + } + + inG1 := convG1WizardToGnark(toGnarkG1Limbs) + inG2 := convG2WizardToGnark(toGnarkG2Limbs) // Miller loop with and without line precomputations give different // results. As in-circuit we're using the variant with precomputation @@ -341,47 +392,76 @@ func processPairingData(pairingInG1 [][nbG1Limbs]field.Element, pairingInG2 [][n } acc.Mul(&acc, &mlres) - if i != len(pairingInG1)-1 { + if i != pairingLength-1 { accLimbs = convGtGnarkToWizard(acc) - res = append(res, accLimbs[:]...) + for j := range common.NbLimbU128 { + res[j] = append(res[j], accLimbs[j][:]...) + } } } - res = append(res, inputResult[:]...) + + for j := range common.NbLimbU128 { + res[j] = append(res[j], inputResult[j][:]...) + } + return res } func (ec *ECPair) assignMembershipData(run *wizard.ProverRuntime) { var ( + srcLimbs [common.NbLimbU128][]field.Element + srcIsG2 = ec.ECPairSource.CsG2Membership.GetColAssignment(run).IntoRegVecSaveAlloc() - srcLimbs = ec.ECPairSource.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() srcSuccessBit = ec.ECPairSource.SuccessBit.GetColAssignment(run).IntoRegVecSaveAlloc() ) - if len(srcIsG2) != len(srcLimbs) || len(srcIsG2) != len(srcSuccessBit) { + if len(srcIsG2) != len(srcSuccessBit) { utils.Panic("ECPair: input length mismatch") } + + for k := range common.NbLimbU128 { + srcLimbs[k] = ec.ECPairSource.Limbs[k].GetColAssignment(run).IntoRegVecSaveAlloc() + + if len(srcLimbs[k]) != len(srcIsG2) { + utils.Panic("ECPair: LIMB_%d input length mismatch", k) + } + } + var ( - dstLimb = common.NewVectorBuilder(ec.UnalignedG2MembershipData.Limb) + dstLimb [common.NbLimbU128]*common.VectorBuilder + dstMask = common.NewVectorBuilder(ec.UnalignedG2MembershipData.ToG2MembershipCircuitMask) dstIsPulling = common.NewVectorBuilder(ec.UnalignedG2MembershipData.IsPulling) dstIsComputed = common.NewVectorBuilder(ec.UnalignedG2MembershipData.IsComputed) dstSuccessBit = common.NewVectorBuilder(ec.UnalignedG2MembershipData.SuccessBit) ) - for currPos := 0; currPos < len(srcLimbs); { + for k := range common.NbLimbU128 { + dstLimb[k] = common.NewVectorBuilder(ec.UnalignedG2MembershipData.Limbs[k]) + } + + for currPos := 0; currPos < len(srcLimbs[0]); { if srcIsG2[currPos].IsZero() { currPos++ continue } // push the G2 limbs for i := 0; i < nbG2Limbs; i++ { - dstLimb.PushField(srcLimbs[currPos+i]) + for k := range common.NbLimbU128 { + dstLimb[k].PushField(srcLimbs[k][currPos+i]) + } + dstSuccessBit.PushField(srcSuccessBit[currPos]) dstMask.PushOne() dstIsPulling.PushOne() dstIsComputed.PushZero() } - // push the expected success bit - dstLimb.PushField(srcSuccessBit[currPos]) + // push the expected success bit to the last limb column, + // while the rest of the columns are zero. + for k := range common.NbLimbU128 - 1 { + dstLimb[k].PushZero() + } + dstLimb[common.NbLimbU128-1].PushField(srcSuccessBit[currPos]) + dstSuccessBit.PushField(srcSuccessBit[currPos]) dstMask.PushOne() dstIsPulling.PushZero() @@ -390,7 +470,9 @@ func (ec *ECPair) assignMembershipData(run *wizard.ProverRuntime) { currPos += nbG2Limbs } - dstLimb.PadAndAssign(run, field.Zero()) + for k := range common.NbLimbU128 { + dstLimb[k].PadAndAssign(run, field.Zero()) + } dstSuccessBit.PadAndAssign(run, field.Zero()) dstMask.PadAndAssign(run, field.Zero()) dstIsPulling.PadAndAssign(run, field.Zero()) diff --git a/prover/zkevm/prover/ecpair/ecpair_constraints.go b/prover/zkevm/prover/ecpair/ecpair_constraints.go index cae32bf682b..04a48d47fc2 100644 --- a/prover/zkevm/prover/ecpair/ecpair_constraints.go +++ b/prover/zkevm/prover/ecpair/ecpair_constraints.go @@ -10,6 +10,7 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/wizard" sym "github.com/consensys/linea-monorepo/prover/symbolic" common "github.com/consensys/linea-monorepo/prover/zkevm/prover/common/common_constraints" + bcommon "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) func (ec *ECPair) csIsActiveActivation(comp *wizard.CompiledIOP) { @@ -36,34 +37,36 @@ func (ec *ECPair) csFlagConsistency(comp *wizard.CompiledIOP) { } func (ec *ECPair) csOffWhenInactive(comp *wizard.CompiledIOP) { - // nothing is set when inactive - common.MustZeroWhenInactive(comp, ec.IsActive, + cols := []ifaces.Column{ ec.UnalignedPairingData.InstanceID, ec.UnalignedPairingData.PairID, ec.UnalignedPairingData.TotalPairs, - ec.UnalignedPairingData.Limb, ec.UnalignedPairingData.Index, ec.UnalignedPairingData.IsFirstLineOfInstance, ec.UnalignedPairingData.IsFirstLineOfPrevAccumulator, ec.UnalignedPairingData.IsFirstLineOfCurrAccumulator, - ec.UnalignedG2MembershipData.Limb, ec.UnalignedG2MembershipData.SuccessBit, - ) + } + cols = append(cols, ec.UnalignedPairingData.Limbs[:]...) + cols = append(cols, ec.UnalignedG2MembershipData.Limbs[:]...) + + // nothing is set when inactive + common.MustZeroWhenInactive(comp, ec.IsActive, cols...) } func (ec *ECPair) csProjections(comp *wizard.CompiledIOP) { // we project data from the arithmetization correctly to the unaligned part of the circuit projection.InsertProjection( comp, ifaces.QueryIDf("%v_PROJECTION_PAIRING", nameECPair), - []ifaces.Column{ec.ECPairSource.Limb, ec.ECPairSource.ID, ec.ECPairSource.IsEcPairingResult}, - []ifaces.Column{ec.UnalignedPairingData.Limb, ec.UnalignedPairingData.InstanceID, ec.UnalignedPairingData.IsResultOfInstance}, + append(ec.ECPairSource.Limbs[:], ec.ECPairSource.ID, ec.ECPairSource.IsEcPairingResult), + append(ec.UnalignedPairingData.Limbs[:], ec.UnalignedPairingData.InstanceID, ec.UnalignedPairingData.IsResultOfInstance), ec.ECPairSource.CsEcpairing, ec.UnalignedPairingData.IsPulling, ) projection.InsertProjection( comp, ifaces.QueryIDf("%v_PROJECTION_MEMBERSHIP", nameECPair), - []ifaces.Column{ec.ECPairSource.Limb, ec.ECPairSource.SuccessBit}, - []ifaces.Column{ec.UnalignedG2MembershipData.Limb, ec.UnalignedG2MembershipData.SuccessBit}, + append(ec.ECPairSource.Limbs[:], ec.ECPairSource.SuccessBit), + append(ec.UnalignedG2MembershipData.Limbs[:], ec.UnalignedG2MembershipData.SuccessBit), ec.ECPairSource.CsG2Membership, ec.UnalignedG2MembershipData.IsPulling, ) } @@ -72,10 +75,29 @@ func (ec *ECPair) csMembershipComputedResult(comp *wizard.CompiledIOP) { // when row is IS_COMPUTED, then this corresponds to the result of the G2 // membership check. In the source it is in separate column and we have to // show that it corresponds to the column (but in previous row). + + // as the limbs divide into 8 columns, first 7 of them are 0. + for i := range bcommon.NbLimbU128 - 1 { + comp.InsertGlobal( + roundNr, + ifaces.QueryIDf("%v_MEMBERSHIP_CHECK_RESULT_EMPTY_LIMB_%d", nameECPair, i), + sym.Mul( + ec.UnalignedG2MembershipData.IsComputed, + ec.UnalignedG2MembershipData.Limbs[i], + ), + ) + } + comp.InsertGlobal( roundNr, ifaces.QueryIDf("%v_MEMBERSHIP_CHECK_RESULT", nameECPair), - sym.Mul(ec.UnalignedG2MembershipData.IsComputed, sym.Sub(ec.UnalignedG2MembershipData.Limb, column.Shift(ec.UnalignedG2MembershipData.SuccessBit, -1))), + sym.Mul( + ec.UnalignedG2MembershipData.IsComputed, + sym.Sub( + ec.UnalignedG2MembershipData.Limbs[bcommon.NbLimbU128-1], + column.Shift(ec.UnalignedG2MembershipData.SuccessBit, -1), + ), + ), ) } @@ -131,11 +153,26 @@ func (ec *ECPair) csAccumulatorInit(comp *wizard.CompiledIOP) { // we omit range checking as the limbs will be projected to the gnark // circuit which already performs range checking for 128 bit limbs. + // as the limbs divide into 8 columns, first 7 of them are 0 + for i := 0; i < bcommon.NbLimbU128-1; i++ { + comp.InsertGlobal( + roundNr, + ifaces.QueryIDf("%v_ACCUMULATOR_INIT_EMPTY_LIMB_%d", nameECPair, i), + sym.Mul( + ec.UnalignedPairingData.IsActive, + ec.UnalignedPairingData.IsFirstLineOfInstance, + ec.UnalignedPairingData.Limbs[i], + ), + ) + } + + lastLimbCol := ec.UnalignedPairingData.Limbs[bcommon.NbLimbU128-1] + // first HI=0, LO=1 - accLimbSum := sym.Add(ec.UnalignedPairingData.Limb, sym.Sub(column.Shift(ec.UnalignedPairingData.Limb, 1), 1)) + accLimbSum := sym.Add(lastLimbCol, sym.Sub(column.Shift(lastLimbCol, 1), 1)) for i := 2; i < nbGtLimbs; i++ { // rest HI=0, LO=0 - accLimbSum = sym.Add(accLimbSum, column.Shift(ec.UnalignedPairingData.Limb, i)) + accLimbSum = sym.Add(accLimbSum, column.Shift(lastLimbCol, i)) } comp.InsertGlobal( @@ -154,7 +191,7 @@ func (ec *ECPair) csAccumulatorConsistency(comp *wizard.CompiledIOP) { projection.InsertProjection( comp, ifaces.QueryIDf("%v_ACCUMULATOR_CONSISTENCY", nameECPair), - []ifaces.Column{ec.UnalignedPairingData.Limb}, []ifaces.Column{ec.UnalignedPairingData.Limb}, + ec.UnalignedPairingData.Limbs[:], ec.UnalignedPairingData.Limbs[:], ec.UnalignedPairingData.IsAccumulatorCurr, ec.UnalignedPairingData.IsAccumulatorPrev, ) } diff --git a/prover/zkevm/prover/ecpair/ecpair_test.go b/prover/zkevm/prover/ecpair/ecpair_test.go index 1a91e1c2db5..1d091d6441a 100644 --- a/prover/zkevm/prover/ecpair/ecpair_test.go +++ b/prover/zkevm/prover/ecpair/ecpair_test.go @@ -8,6 +8,8 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils/csvtraces" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" + "fmt" ) type pairingDataTestCase struct { @@ -111,12 +113,15 @@ func testModule(t *testing.T, tc pairingDataTestCase, withPairingCircuit, withG2 CsG2Membership: inpCt.GetCommit(build, "ECDATA_CS_G2_MEMBERSHIP"), IsEcPairingData: inpCt.GetCommit(build, "ECDATA_IS_DATA"), IsEcPairingResult: inpCt.GetCommit(build, "ECDATA_IS_RES"), - Limb: inpCt.GetCommit(build, "ECDATA_LIMB"), SuccessBit: inpCt.GetCommit(build, "ECDATA_SUCCESS_BIT"), AccPairings: inpCt.GetCommit(build, "ECDATA_ACC_PAIRINGS"), TotalPairings: inpCt.GetCommit(build, "ECDATA_TOTAL_PAIRINGS"), } + for i := range common.NbLimbU128 { + inp.Limbs[i] = inpCt.GetCommit(build, fmt.Sprintf("ECDATA_LIMB_%d", i)) + } + mod = newECPair(build.CompiledIOP, limits, inp) if withPairingCircuit { mod.WithPairingCircuit(build.CompiledIOP, plonk.WithRangecheck(16, 6, false)) @@ -134,7 +139,14 @@ func testModule(t *testing.T, tc pairingDataTestCase, withPairingCircuit, withG2 "ECDATA_CS_G2_MEMBERSHIP", "ECDATA_IS_DATA", "ECDATA_IS_RES", - "ECDATA_LIMB", + "ECDATA_LIMB_0", + "ECDATA_LIMB_1", + "ECDATA_LIMB_2", + "ECDATA_LIMB_3", + "ECDATA_LIMB_4", + "ECDATA_LIMB_5", + "ECDATA_LIMB_6", + "ECDATA_LIMB_7", "ECDATA_SUCCESS_BIT", "ECDATA_ACC_PAIRINGS", "ECDATA_TOTAL_PAIRINGS", @@ -159,7 +171,14 @@ func testModule(t *testing.T, tc pairingDataTestCase, withPairingCircuit, withG2 "ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC", "ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR", "ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT", - "ECPAIR_UNALIGNED_PAIRING_DATA_LIMB", + "ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_0", + "ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_1", + "ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_2", + "ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_3", + "ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_4", + "ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_5", + "ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_6", + "ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_7", "ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT", "ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT", ) @@ -169,7 +188,14 @@ func testModule(t *testing.T, tc pairingDataTestCase, withPairingCircuit, withG2 "ECPAIR_IS_ACTIVE", "ECPAIR_UNALIGNED_G2_DATA_IS_PULLING", "ECPAIR_UNALIGNED_G2_DATA_IS_COMPUTED", - "ECPAIR_UNALIGNED_G2_DATA_LIMB", + "ECPAIR_UNALIGNED_G2_DATA_LIMB_0", + "ECPAIR_UNALIGNED_G2_DATA_LIMB_1", + "ECPAIR_UNALIGNED_G2_DATA_LIMB_2", + "ECPAIR_UNALIGNED_G2_DATA_LIMB_3", + "ECPAIR_UNALIGNED_G2_DATA_LIMB_4", + "ECPAIR_UNALIGNED_G2_DATA_LIMB_5", + "ECPAIR_UNALIGNED_G2_DATA_LIMB_6", + "ECPAIR_UNALIGNED_G2_DATA_LIMB_7", "ECPAIR_UNALIGNED_G2_DATA_TO_G2_MEMBERSHIP_CIRCUIT", "ECPAIR_UNALIGNED_G2_DATA_SUCCESS_BIT", ) diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_double_pair_input.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_double_pair_input.csv index fdffd45b1cc..c7c8f5eb280 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_double_pair_input.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_double_pair_input.csv @@ -1,27 +1,27 @@ -ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_TOTAL_PAIRINGS,ECDATA_ACC_PAIRINGS,ECDATA_LIMB,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES -0,1,0,0,2,1,0x13364879816394e38a2d72bde23bda93,1,1,0 -0,1,0,1,2,1,0xcd39885c6bfdedbc45e6bafcfc8fa685,1,1,0 -0,1,0,2,2,1,0x0e0e4c9d03746d287b341d52461946a1,1,1,0 -0,1,0,3,2,1,0xc865002c35ba9bd6b789fc26a526d121,1,1,0 -0,1,0,4,2,1,0x0e82be8514331e947408a3a27a54d580,1,1,0 -0,1,0,5,2,1,0x9866db37d74db5abc7de8f0d3d0f7ee3,1,1,0 -0,1,0,6,2,1,0x0f89c9a7bb2eb9418d2d89310306196d,1,1,0 -0,1,0,7,2,1,0xf1ae8d9de0173f3e1151487bb5157cd7,1,1,0 -0,1,0,8,2,1,0x10b30b9925aace81dcec2ccce77c3eea,1,1,0 -0,1,0,9,2,1,0xa949c366d7cd71a6a6748bcdd996b762,1,1,0 -0,1,0,10,2,1,0x11497987c563ade267b3bdfcc9c04022,1,1,0 -0,1,0,11,2,1,0x3e25664c3bcdd28858b1daa7ac249034,1,1,0 -0,1,0,12,2,2,0x0b9624a62e115247146d4643e8d4daf0,1,1,0 -0,1,0,13,2,2,0x7ff180000fcf9f02c84cc5692b2c0526,1,1,0 -0,1,0,14,2,2,0x1cb9908c06bf3099f1538277102b31e3,1,1,0 -0,1,0,15,2,2,0x1d022dc64770bc130df14daef72830e4,1,1,0 -0,1,0,16,2,2,0x2977858b214a3cb43fa4024976dd1675,1,1,0 -0,1,0,17,2,2,0x9b1bf5367e6318da3545e697b9931671,1,1,0 -0,1,0,18,2,2,0x06fcfd4b9ca03fb145ff273e480efda3,1,1,0 -0,1,0,19,2,2,0xc8a7aef64882efcbd8920b4458e1ef3d,1,1,0 -0,1,0,20,2,2,0x281508326108309778f9cdf9c39a4c4d,1,1,0 -0,1,0,21,2,2,0xc90a405c0cfbfd5d20fec4e47acce66f,1,1,0 -0,1,0,22,2,2,0x10d24b6f0b87c1e3f78b80b967bac765,1,1,0 -0,1,0,23,2,2,0x763f38c53a4377e9a97e2761758a92f1,1,1,0 -0,1,0,0,2,0,0x0,1,0,1 -0,1,0,1,2,0,0x1,1,0,1 \ No newline at end of file +ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_TOTAL_PAIRINGS,ECDATA_ACC_PAIRINGS,ECDATA_LIMB_0,ECDATA_LIMB_1,ECDATA_LIMB_2,ECDATA_LIMB_3,ECDATA_LIMB_4,ECDATA_LIMB_5,ECDATA_LIMB_6,ECDATA_LIMB_7,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES +0,1,0,0,2,1,0x1336,0x4879,0x8163,0x94e3,0x8a2d,0x72bd,0xe23b,0xda93,1,1,0 +0,1,0,1,2,1,0xcd39,0x885c,0x6bfd,0xedbc,0x45e6,0xbafc,0xfc8f,0xa685,1,1,0 +0,1,0,2,2,1,0x0e0e,0x4c9d,0x0374,0x6d28,0x7b34,0x1d52,0x4619,0x46a1,1,1,0 +0,1,0,3,2,1,0xc865,0x002c,0x35ba,0x9bd6,0xb789,0xfc26,0xa526,0xd121,1,1,0 +0,1,0,4,2,1,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,1,1,0 +0,1,0,5,2,1,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,1,1,0 +0,1,0,6,2,1,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,1,1,0 +0,1,0,7,2,1,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,1,1,0 +0,1,0,8,2,1,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,1,1,0 +0,1,0,9,2,1,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,1,1,0 +0,1,0,10,2,1,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,1,1,0 +0,1,0,11,2,1,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,1,1,0 +0,1,0,12,2,2,0x0b96,0x24a6,0x2e11,0x5247,0x146d,0x4643,0xe8d4,0xdaf0,1,1,0 +0,1,0,13,2,2,0x7ff1,0x8000,0x0fcf,0x9f02,0xc84c,0xc569,0x2b2c,0x0526,1,1,0 +0,1,0,14,2,2,0x1cb9,0x908c,0x06bf,0x3099,0xf153,0x8277,0x102b,0x31e3,1,1,0 +0,1,0,15,2,2,0x1d02,0x2dc6,0x4770,0xbc13,0x0df1,0x4dae,0xf728,0x30e4,1,1,0 +0,1,0,16,2,2,0x2977,0x858b,0x214a,0x3cb4,0x3fa4,0x0249,0x76dd,0x1675,1,1,0 +0,1,0,17,2,2,0x9b1b,0xf536,0x7e63,0x18da,0x3545,0xe697,0xb993,0x1671,1,1,0 +0,1,0,18,2,2,0x06fc,0xfd4b,0x9ca0,0x3fb1,0x45ff,0x273e,0x480e,0xfda3,1,1,0 +0,1,0,19,2,2,0xc8a7,0xaef6,0x4882,0xefcb,0xd892,0x0b44,0x58e1,0xef3d,1,1,0 +0,1,0,20,2,2,0x2815,0x0832,0x6108,0x3097,0x78f9,0xcdf9,0xc39a,0x4c4d,1,1,0 +0,1,0,21,2,2,0xc90a,0x405c,0x0cfb,0xfd5d,0x20fe,0xc4e4,0x7acc,0xe66f,1,1,0 +0,1,0,22,2,2,0x10d2,0x4b6f,0x0b87,0xc1e3,0xf78b,0x80b9,0x67ba,0xc765,1,1,0 +0,1,0,23,2,2,0x763f,0x38c5,0x3a43,0x77e9,0xa97e,0x2761,0x758a,0x92f1,1,1,0 +0,1,0,0,2,0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,0,1 +0,1,0,1,2,0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,1,0,1 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_double_pair_module.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_double_pair_module.csv index 033e3a87650..b043dd6c9ae 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_double_pair_module.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_double_pair_module.csv @@ -1,129 +1,129 @@ -ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT -0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x1,0x1,0x0 -0x1,0x1,0x2,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x3,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x4,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x5,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x6,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x7,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x8,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x9,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xa,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xb,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xc,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xd,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xe,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xf,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x10,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x11,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x12,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x13,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x14,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x15,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x16,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x17,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x13364879816394e38a2d72bde23bda93,0x1,0x0 -0x1,0x1,0x19,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xcd39885c6bfdedbc45e6bafcfc8fa685,0x1,0x0 -0x1,0x1,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xe0e4c9d03746d287b341d52461946a1,0x1,0x0 -0x1,0x1,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xc865002c35ba9bd6b789fc26a526d121,0x1,0x0 -0x1,0x1,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xe82be8514331e947408a3a27a54d580,0x1,0x0 -0x1,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x9866db37d74db5abc7de8f0d3d0f7ee3,0x1,0x0 -0x1,0x1,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf89c9a7bb2eb9418d2d89310306196d,0x1,0x0 -0x1,0x1,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf1ae8d9de0173f3e1151487bb5157cd7,0x1,0x0 -0x1,0x1,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x10b30b9925aace81dcec2ccce77c3eea,0x1,0x0 -0x1,0x1,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa949c366d7cd71a6a6748bcdd996b762,0x1,0x0 -0x1,0x1,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x11497987c563ade267b3bdfcc9c04022,0x1,0x0 -0x1,0x1,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3e25664c3bcdd28858b1daa7ac249034,0x1,0x0 -0x1,0x1,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x1fc57e97fc7f579bbc2ba220d9b10d46,0x1,0x0 -0x1,0x1,0x25,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4c95627608bdbb0235762c7048400f93,0x1,0x0 -0x1,0x1,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2b4305dcdfcf51d41a169cbe7b4e89d4,0x1,0x0 -0x1,0x1,0x27,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x59f4578a51cdbe050925fc0b9312aa86,0x1,0x0 -0x1,0x1,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1133d6c9d0cacf4e7cd03b8ae8654f3b,0x1,0x0 -0x1,0x1,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xfbfc80323c91c70825d4aa8accfd77b8,0x1,0x0 -0x1,0x1,0x2a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2b45ce688738a571621b63dba9880856,0x1,0x0 -0x1,0x1,0x2b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x9dd4ff917cefc257d7cfe3ea571e206a,0x1,0x0 -0x1,0x1,0x2c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x653b8af047158278411df902874a82a,0x1,0x0 -0x1,0x1,0x2d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x401206aafb12aa7c2d704f51f115d8c2,0x1,0x0 -0x1,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1373a842ceca78f2ae076804f168559c,0x1,0x0 -0x1,0x1,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1781cbb3451085c1166bdadbc7c92688,0x1,0x0 -0x1,0x1,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2c8c1f272129cf6b0866ad1d8f3ac818,0x1,0x0 -0x1,0x1,0x31,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2f12833bfd8a1711d7947461776699df,0x1,0x0 -0x1,0x1,0x32,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x16e10599cfcd3537d808d197ce64c2c5,0x1,0x0 -0x1,0x1,0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xdaf005b2c0be94b08c52e30acfb098e,0x1,0x0 -0x1,0x1,0x34,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd5d04cfad426760d9019d3d15b98aee,0x1,0x0 -0x1,0x1,0x35,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x8c37f28a10bb3cfa2f3971505c77db23,0x1,0x0 -0x1,0x1,0x36,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x22af99c52785193aa8920826c0d96380,0x1,0x0 -0x1,0x1,0x37,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xe8213976bbbab27922a2cd8c8fe4adeb,0x1,0x0 -0x1,0x1,0x38,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xa6356a8a0caaec7d1a28661b990a20b,0x1,0x0 -0x1,0x1,0x39,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x217f227c48e2682613693d3afb8231e,0x1,0x0 -0x1,0x1,0x3a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x5641ef4d251e87484afef7cae876258,0x1,0x0 -0x1,0x1,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xc199d8553a68a9408d2603bd9ff29c36,0x1,0x0 -0x1,0x1,0x3c,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1fc57e97fc7f579bbc2ba220d9b10d46,0x0,0x1 -0x1,0x1,0x3d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4c95627608bdbb0235762c7048400f93,0x0,0x1 -0x1,0x1,0x3e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2b4305dcdfcf51d41a169cbe7b4e89d4,0x0,0x1 -0x1,0x1,0x3f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x59f4578a51cdbe050925fc0b9312aa86,0x0,0x1 -0x1,0x1,0x40,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1133d6c9d0cacf4e7cd03b8ae8654f3b,0x0,0x1 -0x1,0x1,0x41,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xfbfc80323c91c70825d4aa8accfd77b8,0x0,0x1 -0x1,0x1,0x42,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2b45ce688738a571621b63dba9880856,0x0,0x1 -0x1,0x1,0x43,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x9dd4ff917cefc257d7cfe3ea571e206a,0x0,0x1 -0x1,0x1,0x44,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x653b8af047158278411df902874a82a,0x0,0x1 -0x1,0x1,0x45,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x401206aafb12aa7c2d704f51f115d8c2,0x0,0x1 -0x1,0x1,0x46,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1373a842ceca78f2ae076804f168559c,0x0,0x1 -0x1,0x1,0x47,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1781cbb3451085c1166bdadbc7c92688,0x0,0x1 -0x1,0x1,0x48,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2c8c1f272129cf6b0866ad1d8f3ac818,0x0,0x1 -0x1,0x1,0x49,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2f12833bfd8a1711d7947461776699df,0x0,0x1 -0x1,0x1,0x4a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x16e10599cfcd3537d808d197ce64c2c5,0x0,0x1 -0x1,0x1,0x4b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xdaf005b2c0be94b08c52e30acfb098e,0x0,0x1 -0x1,0x1,0x4c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd5d04cfad426760d9019d3d15b98aee,0x0,0x1 -0x1,0x1,0x4d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x8c37f28a10bb3cfa2f3971505c77db23,0x0,0x1 -0x1,0x1,0x4e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x22af99c52785193aa8920826c0d96380,0x0,0x1 -0x1,0x1,0x4f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xe8213976bbbab27922a2cd8c8fe4adeb,0x0,0x1 -0x1,0x1,0x50,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xa6356a8a0caaec7d1a28661b990a20b,0x0,0x1 -0x1,0x1,0x51,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x217f227c48e2682613693d3afb8231e,0x0,0x1 -0x1,0x1,0x52,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x5641ef4d251e87484afef7cae876258,0x0,0x1 -0x1,0x1,0x53,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xc199d8553a68a9408d2603bd9ff29c36,0x0,0x1 -0x1,0x1,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xb9624a62e115247146d4643e8d4daf0,0x0,0x1 -0x1,0x1,0x55,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x7ff180000fcf9f02c84cc5692b2c0526,0x0,0x1 -0x1,0x1,0x56,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1cb9908c06bf3099f1538277102b31e3,0x0,0x1 -0x1,0x1,0x57,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1d022dc64770bc130df14daef72830e4,0x0,0x1 -0x1,0x1,0x58,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2977858b214a3cb43fa4024976dd1675,0x0,0x1 -0x1,0x1,0x59,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x9b1bf5367e6318da3545e697b9931671,0x0,0x1 -0x1,0x1,0x5a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x6fcfd4b9ca03fb145ff273e480efda3,0x0,0x1 -0x1,0x1,0x5b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xc8a7aef64882efcbd8920b4458e1ef3d,0x0,0x1 -0x1,0x1,0x5c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x281508326108309778f9cdf9c39a4c4d,0x0,0x1 -0x1,0x1,0x5d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xc90a405c0cfbfd5d20fec4e47acce66f,0x0,0x1 -0x1,0x1,0x5e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x10d24b6f0b87c1e3f78b80b967bac765,0x0,0x1 -0x1,0x1,0x5f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x763f38c53a4377e9a97e2761758a92f1,0x0,0x1 -0x1,0x1,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0,0x0,0x1 -0x1,0x1,0x61,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x1,0x0,0x1 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_0,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_1,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_2,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_3,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_4,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_5,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_6,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_7,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT +0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x1,0x0 +0x1,0x1,0x2,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x3,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x4,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x5,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x6,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x7,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x8,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x9,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xa,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xb,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xc,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xd,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xe,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xf,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x10,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x11,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x12,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x13,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x14,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x15,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x16,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x17,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x1336,0x4879,0x8163,0x94e3,0x8a2d,0x72bd,0xe23b,0xda93,0x1,0x0 +0x1,0x1,0x19,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xcd39,0x885c,0x6bfd,0xedbc,0x45e6,0xbafc,0xfc8f,0xa685,0x1,0x0 +0x1,0x1,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0e0e,0x4c9d,0x0374,0x6d28,0x7b34,0x1d52,0x4619,0x46a1,0x1,0x0 +0x1,0x1,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xc865,0x002c,0x35ba,0x9bd6,0xb789,0xfc26,0xa526,0xd121,0x1,0x0 +0x1,0x1,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,0x1,0x0 +0x1,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,0x1,0x0 +0x1,0x1,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,0x1,0x0 +0x1,0x1,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,0x1,0x0 +0x1,0x1,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,0x1,0x0 +0x1,0x1,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,0x1,0x0 +0x1,0x1,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,0x1,0x0 +0x1,0x1,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,0x1,0x0 +0x1,0x1,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x1fc5,0x7e97,0xfc7f,0x579b,0xbc2b,0xa220,0xd9b1,0x0d46,0x1,0x0 +0x1,0x1,0x25,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4c95,0x6276,0x08bd,0xbb02,0x3576,0x2c70,0x4840,0x0f93,0x1,0x0 +0x1,0x1,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2b43,0x05dc,0xdfcf,0x51d4,0x1a16,0x9cbe,0x7b4e,0x89d4,0x1,0x0 +0x1,0x1,0x27,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x59f4,0x578a,0x51cd,0xbe05,0x0925,0xfc0b,0x9312,0xaa86,0x1,0x0 +0x1,0x1,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1133,0xd6c9,0xd0ca,0xcf4e,0x7cd0,0x3b8a,0xe865,0x4f3b,0x1,0x0 +0x1,0x1,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xfbfc,0x8032,0x3c91,0xc708,0x25d4,0xaa8a,0xccfd,0x77b8,0x1,0x0 +0x1,0x1,0x2a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2b45,0xce68,0x8738,0xa571,0x621b,0x63db,0xa988,0x0856,0x1,0x0 +0x1,0x1,0x2b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x9dd4,0xff91,0x7cef,0xc257,0xd7cf,0xe3ea,0x571e,0x206a,0x1,0x0 +0x1,0x1,0x2c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0653,0xb8af,0x0471,0x5827,0x8411,0xdf90,0x2874,0xa82a,0x1,0x0 +0x1,0x1,0x2d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4012,0x06aa,0xfb12,0xaa7c,0x2d70,0x4f51,0xf115,0xd8c2,0x1,0x0 +0x1,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1373,0xa842,0xceca,0x78f2,0xae07,0x6804,0xf168,0x559c,0x1,0x0 +0x1,0x1,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1781,0xcbb3,0x4510,0x85c1,0x166b,0xdadb,0xc7c9,0x2688,0x1,0x0 +0x1,0x1,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2c8c,0x1f27,0x2129,0xcf6b,0x0866,0xad1d,0x8f3a,0xc818,0x1,0x0 +0x1,0x1,0x31,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2f12,0x833b,0xfd8a,0x1711,0xd794,0x7461,0x7766,0x99df,0x1,0x0 +0x1,0x1,0x32,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x16e1,0x0599,0xcfcd,0x3537,0xd808,0xd197,0xce64,0xc2c5,0x1,0x0 +0x1,0x1,0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0daf,0x005b,0x2c0b,0xe94b,0x08c5,0x2e30,0xacfb,0x098e,0x1,0x0 +0x1,0x1,0x34,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0d5d,0x04cf,0xad42,0x6760,0xd901,0x9d3d,0x15b9,0x8aee,0x1,0x0 +0x1,0x1,0x35,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x8c37,0xf28a,0x10bb,0x3cfa,0x2f39,0x7150,0x5c77,0xdb23,0x1,0x0 +0x1,0x1,0x36,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x22af,0x99c5,0x2785,0x193a,0xa892,0x0826,0xc0d9,0x6380,0x1,0x0 +0x1,0x1,0x37,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xe821,0x3976,0xbbba,0xb279,0x22a2,0xcd8c,0x8fe4,0xadeb,0x1,0x0 +0x1,0x1,0x38,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0a63,0x56a8,0xa0ca,0xaec7,0xd1a2,0x8661,0xb990,0xa20b,0x1,0x0 +0x1,0x1,0x39,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0217,0xf227,0xc48e,0x2682,0x6136,0x93d3,0xafb8,0x231e,0x1,0x0 +0x1,0x1,0x3a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0564,0x1ef4,0xd251,0xe874,0x84af,0xef7c,0xae87,0x6258,0x1,0x0 +0x1,0x1,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xc199,0xd855,0x3a68,0xa940,0x8d26,0x03bd,0x9ff2,0x9c36,0x1,0x0 +0x1,0x1,0x3c,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1fc5,0x7e97,0xfc7f,0x579b,0xbc2b,0xa220,0xd9b1,0x0d46,0x0,0x1 +0x1,0x1,0x3d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4c95,0x6276,0x08bd,0xbb02,0x3576,0x2c70,0x4840,0x0f93,0x0,0x1 +0x1,0x1,0x3e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2b43,0x05dc,0xdfcf,0x51d4,0x1a16,0x9cbe,0x7b4e,0x89d4,0x0,0x1 +0x1,0x1,0x3f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x59f4,0x578a,0x51cd,0xbe05,0x0925,0xfc0b,0x9312,0xaa86,0x0,0x1 +0x1,0x1,0x40,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1133,0xd6c9,0xd0ca,0xcf4e,0x7cd0,0x3b8a,0xe865,0x4f3b,0x0,0x1 +0x1,0x1,0x41,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xfbfc,0x8032,0x3c91,0xc708,0x25d4,0xaa8a,0xccfd,0x77b8,0x0,0x1 +0x1,0x1,0x42,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2b45,0xce68,0x8738,0xa571,0x621b,0x63db,0xa988,0x0856,0x0,0x1 +0x1,0x1,0x43,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x9dd4,0xff91,0x7cef,0xc257,0xd7cf,0xe3ea,0x571e,0x206a,0x0,0x1 +0x1,0x1,0x44,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0653,0xb8af,0x0471,0x5827,0x8411,0xdf90,0x2874,0xa82a,0x0,0x1 +0x1,0x1,0x45,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4012,0x06aa,0xfb12,0xaa7c,0x2d70,0x4f51,0xf115,0xd8c2,0x0,0x1 +0x1,0x1,0x46,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1373,0xa842,0xceca,0x78f2,0xae07,0x6804,0xf168,0x559c,0x0,0x1 +0x1,0x1,0x47,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1781,0xcbb3,0x4510,0x85c1,0x166b,0xdadb,0xc7c9,0x2688,0x0,0x1 +0x1,0x1,0x48,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2c8c,0x1f27,0x2129,0xcf6b,0x0866,0xad1d,0x8f3a,0xc818,0x0,0x1 +0x1,0x1,0x49,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2f12,0x833b,0xfd8a,0x1711,0xd794,0x7461,0x7766,0x99df,0x0,0x1 +0x1,0x1,0x4a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x16e1,0x0599,0xcfcd,0x3537,0xd808,0xd197,0xce64,0xc2c5,0x0,0x1 +0x1,0x1,0x4b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0daf,0x005b,0x2c0b,0xe94b,0x08c5,0x2e30,0xacfb,0x098e,0x0,0x1 +0x1,0x1,0x4c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0d5d,0x04cf,0xad42,0x6760,0xd901,0x9d3d,0x15b9,0x8aee,0x0,0x1 +0x1,0x1,0x4d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x8c37,0xf28a,0x10bb,0x3cfa,0x2f39,0x7150,0x5c77,0xdb23,0x0,0x1 +0x1,0x1,0x4e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x22af,0x99c5,0x2785,0x193a,0xa892,0x0826,0xc0d9,0x6380,0x0,0x1 +0x1,0x1,0x4f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xe821,0x3976,0xbbba,0xb279,0x22a2,0xcd8c,0x8fe4,0xadeb,0x0,0x1 +0x1,0x1,0x50,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0a63,0x56a8,0xa0ca,0xaec7,0xd1a2,0x8661,0xb990,0xa20b,0x0,0x1 +0x1,0x1,0x51,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0217,0xf227,0xc48e,0x2682,0x6136,0x93d3,0xafb8,0x231e,0x0,0x1 +0x1,0x1,0x52,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0564,0x1ef4,0xd251,0xe874,0x84af,0xef7c,0xae87,0x6258,0x0,0x1 +0x1,0x1,0x53,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xc199,0xd855,0x3a68,0xa940,0x8d26,0x03bd,0x9ff2,0x9c36,0x0,0x1 +0x1,0x1,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x0b96,0x24a6,0x2e11,0x5247,0x146d,0x4643,0xe8d4,0xdaf0,0x0,0x1 +0x1,0x1,0x55,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x7ff1,0x8000,0x0fcf,0x9f02,0xc84c,0xc569,0x2b2c,0x0526,0x0,0x1 +0x1,0x1,0x56,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1cb9,0x908c,0x06bf,0x3099,0xf153,0x8277,0x102b,0x31e3,0x0,0x1 +0x1,0x1,0x57,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1d02,0x2dc6,0x4770,0xbc13,0x0df1,0x4dae,0xf728,0x30e4,0x0,0x1 +0x1,0x1,0x58,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2977,0x858b,0x214a,0x3cb4,0x3fa4,0x0249,0x76dd,0x1675,0x0,0x1 +0x1,0x1,0x59,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x9b1b,0xf536,0x7e63,0x18da,0x3545,0xe697,0xb993,0x1671,0x0,0x1 +0x1,0x1,0x5a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x06fc,0xfd4b,0x9ca0,0x3fb1,0x45ff,0x273e,0x480e,0xfda3,0x0,0x1 +0x1,0x1,0x5b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xc8a7,0xaef6,0x4882,0xefcb,0xd892,0x0b44,0x58e1,0xef3d,0x0,0x1 +0x1,0x1,0x5c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2815,0x0832,0x6108,0x3097,0x78f9,0xcdf9,0xc39a,0x4c4d,0x0,0x1 +0x1,0x1,0x5d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xc90a,0x405c,0x0cfb,0xfd5d,0x20fe,0xc4e4,0x7acc,0xe66f,0x0,0x1 +0x1,0x1,0x5e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x10d2,0x4b6f,0x0b87,0xc1e3,0xf78b,0x80b9,0x67ba,0xc765,0x0,0x1 +0x1,0x1,0x5f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x763f,0x38c5,0x3a43,0x77e9,0xa97e,0x2761,0x758a,0x92f1,0x0,0x1 +0x1,0x1,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x1,0x1,0x61,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0,0x1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_empty.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_empty.csv index b4822fd8f7d..b9c42d2ada9 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_empty.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_empty.csv @@ -1,2 +1,2 @@ -ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_LIMB,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES -0,0,0,0,0,0,0,0,0,0 \ No newline at end of file +ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_LIMB_0,ECDATA_LIMB_1,ECDATA_LIMB_2,ECDATA_LIMB_3,ECDATA_LIMB_4,ECDATA_LIMB_5,ECDATA_LIMB_6,ECDATA_LIMB_7,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_empty_module.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_empty_module.csv index 0b22726c436..df2f4038213 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_empty_module.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_empty_module.csv @@ -1 +1 @@ -ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT +ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_0,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_1,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_2,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_3,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_4,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_5,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_6,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_7,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_failing_double_pair_input.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_failing_double_pair_input.csv index 1830f5e45fc..a412e0c4ce9 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_failing_double_pair_input.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_failing_double_pair_input.csv @@ -1,27 +1,27 @@ -ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_LIMB,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES -0,1,0,0,1,2,0x219db76fd15c77e92376ec7ccdf3795a,1,1,0 -0,1,0,1,1,2,0x96b20b521116027d63df9d7a4d76bcef,1,1,0 -0,1,0,2,1,2,0x0692f74fd48f12f945546eb1daaa688b,1,1,0 -0,1,0,3,1,2,0xe31ef7b9f6338c8c452d69a386f0a098,1,1,0 -0,1,0,4,1,2,0x0f679eca6f21e702c5613627661a31b7,1,1,0 -0,1,0,5,1,2,0xa5b99a766175a8ceebadf12135d8c0a0,1,1,0 -0,1,0,6,1,2,0x0a23a4431ea9ca09eb5787a8a0a7bb52,1,1,0 -0,1,0,7,1,2,0x30a7cf5dc4fbf71edbda6ae0faca4000,1,1,0 -0,1,0,8,1,2,0x0715261e3e5eb7991d5dbe83f4cd963c,1,1,0 -0,1,0,9,1,2,0xd8eb1975c583801573dc432c2c677165,1,1,0 -0,1,0,10,1,2,0x142ed84e025468f2aa7a6fe50839c23a,1,1,0 -0,1,0,11,1,2,0xa3e99559088d53289092e02ffd59e84d,1,1,0 -0,1,0,12,2,2,0x1ae800da67a6c22f94d05578d1361f25,1,1,0 -0,1,0,13,2,2,0x422a9f478669101d5b117f57fcb741e1,1,1,0 -0,1,0,14,2,2,0x15ded9e40e5489c82b473115f1d4b409,1,1,0 -0,1,0,15,2,2,0x9e93aa996ad2346e8b46a2aa0db7832c,1,1,0 -0,1,0,16,2,2,0x2e1b4d36165dbb3f03664c4e77181c95,1,1,0 -0,1,0,17,2,2,0x285a1f1bb08fac1599d9c06095085cf0,1,1,0 -0,1,0,18,2,2,0x286dcf3fe302f14b9df2d19119a97c81,1,1,0 -0,1,0,19,2,2,0x70a68443dafe5001dcc450abf66cb1b9,1,1,0 -0,1,0,20,2,2,0x23e5cf5e441d3d12e4b63d4d16eea2dd,1,1,0 -0,1,0,21,2,2,0xdc6005a79a59c812fbd4050870691a91,1,1,0 -0,1,0,22,2,2,0x11cfc60ff4ceb85b8af413347b760f13,1,1,0 -0,1,0,23,2,2,0x4325aead086b2761e0a16039ab1f12aa,1,1,0 -0,1,0,0,0,2,0x0,1,0,1 -0,1,0,1,0,2,0x0,1,0,1 \ No newline at end of file +ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_LIMB_0,ECDATA_LIMB_1,ECDATA_LIMB_2,ECDATA_LIMB_3,ECDATA_LIMB_4,ECDATA_LIMB_5,ECDATA_LIMB_6,ECDATA_LIMB_7,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES +0,1,0,0,1,2,0x219d,0xb76f,0xd15c,0x77e9,0x2376,0xec7c,0xcdf3,0x795a,1,1,0 +0,1,0,1,1,2,0x96b2,0x0b52,0x1116,0x027d,0x63df,0x9d7a,0x4d76,0xbcef,1,1,0 +0,1,0,2,1,2,0x0692,0xf74f,0xd48f,0x12f9,0x4554,0x6eb1,0xdaaa,0x688b,1,1,0 +0,1,0,3,1,2,0xe31e,0xf7b9,0xf633,0x8c8c,0x452d,0x69a3,0x86f0,0xa098,1,1,0 +0,1,0,4,1,2,0x0f67,0x9eca,0x6f21,0xe702,0xc561,0x3627,0x661a,0x31b7,1,1,0 +0,1,0,5,1,2,0xa5b9,0x9a76,0x6175,0xa8ce,0xebad,0xf121,0x35d8,0xc0a0,1,1,0 +0,1,0,6,1,2,0x0a23,0xa443,0x1ea9,0xca09,0xeb57,0x87a8,0xa0a7,0xbb52,1,1,0 +0,1,0,7,1,2,0x30a7,0xcf5d,0xc4fb,0xf71e,0xdbda,0x6ae0,0xfaca,0x4000,1,1,0 +0,1,0,8,1,2,0x0715,0x261e,0x3e5e,0xb799,0x1d5d,0xbe83,0xf4cd,0x963c,1,1,0 +0,1,0,9,1,2,0xd8eb,0x1975,0xc583,0x8015,0x73dc,0x432c,0x2c67,0x7165,1,1,0 +0,1,0,10,1,2,0x142e,0xd84e,0x0254,0x68f2,0xaa7a,0x6fe5,0x0839,0xc23a,1,1,0 +0,1,0,11,1,2,0xa3e9,0x9559,0x088d,0x5328,0x9092,0xe02f,0xfd59,0xe84d,1,1,0 +0,1,0,12,2,2,0x1ae8,0x00da,0x67a6,0xc22f,0x94d0,0x5578,0xd136,0x1f25,1,1,0 +0,1,0,13,2,2,0x422a,0x9f47,0x8669,0x101d,0x5b11,0x7f57,0xfcb7,0x41e1,1,1,0 +0,1,0,14,2,2,0x15de,0xd9e4,0x0e54,0x89c8,0x2b47,0x3115,0xf1d4,0xb409,1,1,0 +0,1,0,15,2,2,0x9e93,0xaa99,0x6ad2,0x346e,0x8b46,0xa2aa,0x0db7,0x832c,1,1,0 +0,1,0,16,2,2,0x2e1b,0x4d36,0x165d,0xbb3f,0x0366,0x4c4e,0x7718,0x1c95,1,1,0 +0,1,0,17,2,2,0x285a,0x1f1b,0xb08f,0xac15,0x99d9,0xc060,0x9508,0x5cf0,1,1,0 +0,1,0,18,2,2,0x286d,0xcf3f,0xe302,0xf14b,0x9df2,0xd191,0x19a9,0x7c81,1,1,0 +0,1,0,19,2,2,0x70a6,0x8443,0xdafe,0x5001,0xdcc4,0x50ab,0xf66c,0xb1b9,1,1,0 +0,1,0,20,2,2,0x23e5,0xcf5e,0x441d,0x3d12,0xe4b6,0x3d4d,0x16ee,0xa2dd,1,1,0 +0,1,0,21,2,2,0xdc60,0x05a7,0x9a59,0xc812,0xfbd4,0x0508,0x7069,0x1a91,1,1,0 +0,1,0,22,2,2,0x11cf,0xc60f,0xf4ce,0xb85b,0x8af4,0x1334,0x7b76,0x0f13,1,1,0 +0,1,0,23,2,2,0x4325,0xaead,0x086b,0x2761,0xe0a1,0x6039,0xab1f,0x12aa,1,1,0 +0,1,0,0,0,2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,0,1 +0,1,0,1,0,2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,0,1 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_failing_double_pair_module.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_failing_double_pair_module.csv index 602be4f741d..2fe612d6523 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_failing_double_pair_module.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_failing_double_pair_module.csv @@ -1,129 +1,129 @@ -ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT -0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x1,0x1,0x0 -0x1,0x1,0x2,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x3,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x4,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x5,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x6,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x7,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x8,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x9,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xa,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xb,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xc,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xd,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xe,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xf,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x10,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x11,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x12,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x13,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x14,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x15,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x16,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x17,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x219db76fd15c77e92376ec7ccdf3795a,0x1,0x0 -0x1,0x1,0x19,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x96b20b521116027d63df9d7a4d76bcef,0x1,0x0 -0x1,0x1,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x692f74fd48f12f945546eb1daaa688b,0x1,0x0 -0x1,0x1,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xe31ef7b9f6338c8c452d69a386f0a098,0x1,0x0 -0x1,0x1,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf679eca6f21e702c5613627661a31b7,0x1,0x0 -0x1,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa5b99a766175a8ceebadf12135d8c0a0,0x1,0x0 -0x1,0x1,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa23a4431ea9ca09eb5787a8a0a7bb52,0x1,0x0 -0x1,0x1,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x30a7cf5dc4fbf71edbda6ae0faca4000,0x1,0x0 -0x1,0x1,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x715261e3e5eb7991d5dbe83f4cd963c,0x1,0x0 -0x1,0x1,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xd8eb1975c583801573dc432c2c677165,0x1,0x0 -0x1,0x1,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x142ed84e025468f2aa7a6fe50839c23a,0x1,0x0 -0x1,0x1,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa3e99559088d53289092e02ffd59e84d,0x1,0x0 -0x1,0x1,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x2519fb9fc917e5401ef8ae1dc4e0fcf6,0x1,0x0 -0x1,0x1,0x25,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xe73ec610c73dedfaecdc78b4cfed5fae,0x1,0x0 -0x1,0x1,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x532dd87a224b3c74c0972336084d8cf,0x1,0x0 -0x1,0x1,0x27,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd63ea1761e1b3eb06330f9a70a334bb3,0x1,0x0 -0x1,0x1,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1be66119d8e9cb15799f97c5765a4f8f,0x1,0x0 -0x1,0x1,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x7945a28f14dda8ff8d91e8e7472250dc,0x1,0x0 -0x1,0x1,0x2a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1445016cdd9b1f1521bc8554163ed0d8,0x1,0x0 -0x1,0x1,0x2b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1d69bb89e43261ea0cd55460902d1502,0x1,0x0 -0x1,0x1,0x2c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x27c2852669c9bb985bb057af1b521490,0x1,0x0 -0x1,0x1,0x2d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x9e44217a7c12ccc32c1a38dfddb3e4f9,0x1,0x0 -0x1,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x213cd09f21a19a3ba7bf07cfb2af15db,0x1,0x0 -0x1,0x1,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x484f312ecb72e9937bb9d118dc40bb98,0x1,0x0 -0x1,0x1,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x278d3989a6a313a5ae46832637fb035d,0x1,0x0 -0x1,0x1,0x31,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x27160f6e52a0177a893c3b8cfc3a16dd,0x1,0x0 -0x1,0x1,0x32,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xf2867d79c66c1b03b24b76190f1cddb,0x1,0x0 -0x1,0x1,0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x507f66b1e126b7d5f6b8fb575b98f4e3,0x1,0x0 -0x1,0x1,0x34,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x190f41a349878e7007fa72a919920ebe,0x1,0x0 -0x1,0x1,0x35,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4afaca4694c9b0a0848e46598d1f80fd,0x1,0x0 -0x1,0x1,0x36,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x274ebf234ca143dd8a07c1ffff2ed891,0x1,0x0 -0x1,0x1,0x37,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xb7638a696e66fe108cb6a122e36c2c9d,0x1,0x0 -0x1,0x1,0x38,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x26f9711c5e431d68483d1c20ad498818,0x1,0x0 -0x1,0x1,0x39,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2f3ae73e50cb72160c69a85e3b6cf774,0x1,0x0 -0x1,0x1,0x3a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x967d0cd5a60dd7aedeb12ef807e2ce8,0x1,0x0 -0x1,0x1,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x43aad3aff198259e8706389ab5add7c1,0x1,0x0 -0x1,0x1,0x3c,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2519fb9fc917e5401ef8ae1dc4e0fcf6,0x0,0x1 -0x1,0x1,0x3d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xe73ec610c73dedfaecdc78b4cfed5fae,0x0,0x1 -0x1,0x1,0x3e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x532dd87a224b3c74c0972336084d8cf,0x0,0x1 -0x1,0x1,0x3f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd63ea1761e1b3eb06330f9a70a334bb3,0x0,0x1 -0x1,0x1,0x40,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1be66119d8e9cb15799f97c5765a4f8f,0x0,0x1 -0x1,0x1,0x41,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x7945a28f14dda8ff8d91e8e7472250dc,0x0,0x1 -0x1,0x1,0x42,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1445016cdd9b1f1521bc8554163ed0d8,0x0,0x1 -0x1,0x1,0x43,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1d69bb89e43261ea0cd55460902d1502,0x0,0x1 -0x1,0x1,0x44,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x27c2852669c9bb985bb057af1b521490,0x0,0x1 -0x1,0x1,0x45,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x9e44217a7c12ccc32c1a38dfddb3e4f9,0x0,0x1 -0x1,0x1,0x46,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x213cd09f21a19a3ba7bf07cfb2af15db,0x0,0x1 -0x1,0x1,0x47,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x484f312ecb72e9937bb9d118dc40bb98,0x0,0x1 -0x1,0x1,0x48,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x278d3989a6a313a5ae46832637fb035d,0x0,0x1 -0x1,0x1,0x49,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x27160f6e52a0177a893c3b8cfc3a16dd,0x0,0x1 -0x1,0x1,0x4a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xf2867d79c66c1b03b24b76190f1cddb,0x0,0x1 -0x1,0x1,0x4b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x507f66b1e126b7d5f6b8fb575b98f4e3,0x0,0x1 -0x1,0x1,0x4c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x190f41a349878e7007fa72a919920ebe,0x0,0x1 -0x1,0x1,0x4d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4afaca4694c9b0a0848e46598d1f80fd,0x0,0x1 -0x1,0x1,0x4e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x274ebf234ca143dd8a07c1ffff2ed891,0x0,0x1 -0x1,0x1,0x4f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xb7638a696e66fe108cb6a122e36c2c9d,0x0,0x1 -0x1,0x1,0x50,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x26f9711c5e431d68483d1c20ad498818,0x0,0x1 -0x1,0x1,0x51,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2f3ae73e50cb72160c69a85e3b6cf774,0x0,0x1 -0x1,0x1,0x52,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x967d0cd5a60dd7aedeb12ef807e2ce8,0x0,0x1 -0x1,0x1,0x53,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x43aad3aff198259e8706389ab5add7c1,0x0,0x1 -0x1,0x1,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1ae800da67a6c22f94d05578d1361f25,0x0,0x1 -0x1,0x1,0x55,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x422a9f478669101d5b117f57fcb741e1,0x0,0x1 -0x1,0x1,0x56,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x15ded9e40e5489c82b473115f1d4b409,0x0,0x1 -0x1,0x1,0x57,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x9e93aa996ad2346e8b46a2aa0db7832c,0x0,0x1 -0x1,0x1,0x58,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2e1b4d36165dbb3f03664c4e77181c95,0x0,0x1 -0x1,0x1,0x59,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x285a1f1bb08fac1599d9c06095085cf0,0x0,0x1 -0x1,0x1,0x5a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x286dcf3fe302f14b9df2d19119a97c81,0x0,0x1 -0x1,0x1,0x5b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x70a68443dafe5001dcc450abf66cb1b9,0x0,0x1 -0x1,0x1,0x5c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x23e5cf5e441d3d12e4b63d4d16eea2dd,0x0,0x1 -0x1,0x1,0x5d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xdc6005a79a59c812fbd4050870691a91,0x0,0x1 -0x1,0x1,0x5e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x11cfc60ff4ceb85b8af413347b760f13,0x0,0x1 -0x1,0x1,0x5f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x4325aead086b2761e0a16039ab1f12aa,0x0,0x1 -0x1,0x1,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0,0x0,0x1 -0x1,0x1,0x61,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0,0x0,0x1 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_0,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_1,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_2,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_3,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_4,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_5,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_6,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_7,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT +0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x1,0x0 +0x1,0x1,0x2,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x3,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x4,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x5,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x6,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x7,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x8,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x9,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xa,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xb,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xc,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xd,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xe,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xf,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x10,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x11,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x12,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x13,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x14,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x15,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x16,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x17,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x219d,0xb76f,0xd15c,0x77e9,0x2376,0xec7c,0xcdf3,0x795a,0x1,0x0 +0x1,0x1,0x19,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x96b2,0x0b52,0x1116,0x027d,0x63df,0x9d7a,0x4d76,0xbcef,0x1,0x0 +0x1,0x1,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0692,0xf74f,0xd48f,0x12f9,0x4554,0x6eb1,0xdaaa,0x688b,0x1,0x0 +0x1,0x1,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xe31e,0xf7b9,0xf633,0x8c8c,0x452d,0x69a3,0x86f0,0xa098,0x1,0x0 +0x1,0x1,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0f67,0x9eca,0x6f21,0xe702,0xc561,0x3627,0x661a,0x31b7,0x1,0x0 +0x1,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa5b9,0x9a76,0x6175,0xa8ce,0xebad,0xf121,0x35d8,0xc0a0,0x1,0x0 +0x1,0x1,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0a23,0xa443,0x1ea9,0xca09,0xeb57,0x87a8,0xa0a7,0xbb52,0x1,0x0 +0x1,0x1,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x30a7,0xcf5d,0xc4fb,0xf71e,0xdbda,0x6ae0,0xfaca,0x4000,0x1,0x0 +0x1,0x1,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0715,0x261e,0x3e5e,0xb799,0x1d5d,0xbe83,0xf4cd,0x963c,0x1,0x0 +0x1,0x1,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xd8eb,0x1975,0xc583,0x8015,0x73dc,0x432c,0x2c67,0x7165,0x1,0x0 +0x1,0x1,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x142e,0xd84e,0x0254,0x68f2,0xaa7a,0x6fe5,0x0839,0xc23a,0x1,0x0 +0x1,0x1,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa3e9,0x9559,0x088d,0x5328,0x9092,0xe02f,0xfd59,0xe84d,0x1,0x0 +0x1,0x1,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x2519,0xfb9f,0xc917,0xe540,0x1ef8,0xae1d,0xc4e0,0xfcf6,0x1,0x0 +0x1,0x1,0x25,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xe73e,0xc610,0xc73d,0xedfa,0xecdc,0x78b4,0xcfed,0x5fae,0x1,0x0 +0x1,0x1,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0532,0xdd87,0xa224,0xb3c7,0x4c09,0x7233,0x6084,0xd8cf,0x1,0x0 +0x1,0x1,0x27,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd63e,0xa176,0x1e1b,0x3eb0,0x6330,0xf9a7,0x0a33,0x4bb3,0x1,0x0 +0x1,0x1,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1be6,0x6119,0xd8e9,0xcb15,0x799f,0x97c5,0x765a,0x4f8f,0x1,0x0 +0x1,0x1,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x7945,0xa28f,0x14dd,0xa8ff,0x8d91,0xe8e7,0x4722,0x50dc,0x1,0x0 +0x1,0x1,0x2a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1445,0x016c,0xdd9b,0x1f15,0x21bc,0x8554,0x163e,0xd0d8,0x1,0x0 +0x1,0x1,0x2b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1d69,0xbb89,0xe432,0x61ea,0x0cd5,0x5460,0x902d,0x1502,0x1,0x0 +0x1,0x1,0x2c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x27c2,0x8526,0x69c9,0xbb98,0x5bb0,0x57af,0x1b52,0x1490,0x1,0x0 +0x1,0x1,0x2d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x9e44,0x217a,0x7c12,0xccc3,0x2c1a,0x38df,0xddb3,0xe4f9,0x1,0x0 +0x1,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x213c,0xd09f,0x21a1,0x9a3b,0xa7bf,0x07cf,0xb2af,0x15db,0x1,0x0 +0x1,0x1,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x484f,0x312e,0xcb72,0xe993,0x7bb9,0xd118,0xdc40,0xbb98,0x1,0x0 +0x1,0x1,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x278d,0x3989,0xa6a3,0x13a5,0xae46,0x8326,0x37fb,0x035d,0x1,0x0 +0x1,0x1,0x31,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2716,0x0f6e,0x52a0,0x177a,0x893c,0x3b8c,0xfc3a,0x16dd,0x1,0x0 +0x1,0x1,0x32,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0f28,0x67d7,0x9c66,0xc1b0,0x3b24,0xb761,0x90f1,0xcddb,0x1,0x0 +0x1,0x1,0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x507f,0x66b1,0xe126,0xb7d5,0xf6b8,0xfb57,0x5b98,0xf4e3,0x1,0x0 +0x1,0x1,0x34,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x190f,0x41a3,0x4987,0x8e70,0x07fa,0x72a9,0x1992,0x0ebe,0x1,0x0 +0x1,0x1,0x35,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4afa,0xca46,0x94c9,0xb0a0,0x848e,0x4659,0x8d1f,0x80fd,0x1,0x0 +0x1,0x1,0x36,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x274e,0xbf23,0x4ca1,0x43dd,0x8a07,0xc1ff,0xff2e,0xd891,0x1,0x0 +0x1,0x1,0x37,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xb763,0x8a69,0x6e66,0xfe10,0x8cb6,0xa122,0xe36c,0x2c9d,0x1,0x0 +0x1,0x1,0x38,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x26f9,0x711c,0x5e43,0x1d68,0x483d,0x1c20,0xad49,0x8818,0x1,0x0 +0x1,0x1,0x39,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2f3a,0xe73e,0x50cb,0x7216,0x0c69,0xa85e,0x3b6c,0xf774,0x1,0x0 +0x1,0x1,0x3a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0967,0xd0cd,0x5a60,0xdd7a,0xedeb,0x12ef,0x807e,0x2ce8,0x1,0x0 +0x1,0x1,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x43aa,0xd3af,0xf198,0x259e,0x8706,0x389a,0xb5ad,0xd7c1,0x1,0x0 +0x1,0x1,0x3c,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2519,0xfb9f,0xc917,0xe540,0x1ef8,0xae1d,0xc4e0,0xfcf6,0x0,0x1 +0x1,0x1,0x3d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xe73e,0xc610,0xc73d,0xedfa,0xecdc,0x78b4,0xcfed,0x5fae,0x0,0x1 +0x1,0x1,0x3e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0532,0xdd87,0xa224,0xb3c7,0x4c09,0x7233,0x6084,0xd8cf,0x0,0x1 +0x1,0x1,0x3f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd63e,0xa176,0x1e1b,0x3eb0,0x6330,0xf9a7,0x0a33,0x4bb3,0x0,0x1 +0x1,0x1,0x40,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1be6,0x6119,0xd8e9,0xcb15,0x799f,0x97c5,0x765a,0x4f8f,0x0,0x1 +0x1,0x1,0x41,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x7945,0xa28f,0x14dd,0xa8ff,0x8d91,0xe8e7,0x4722,0x50dc,0x0,0x1 +0x1,0x1,0x42,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1445,0x016c,0xdd9b,0x1f15,0x21bc,0x8554,0x163e,0xd0d8,0x0,0x1 +0x1,0x1,0x43,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1d69,0xbb89,0xe432,0x61ea,0x0cd5,0x5460,0x902d,0x1502,0x0,0x1 +0x1,0x1,0x44,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x27c2,0x8526,0x69c9,0xbb98,0x5bb0,0x57af,0x1b52,0x1490,0x0,0x1 +0x1,0x1,0x45,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x9e44,0x217a,0x7c12,0xccc3,0x2c1a,0x38df,0xddb3,0xe4f9,0x0,0x1 +0x1,0x1,0x46,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x213c,0xd09f,0x21a1,0x9a3b,0xa7bf,0x07cf,0xb2af,0x15db,0x0,0x1 +0x1,0x1,0x47,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x484f,0x312e,0xcb72,0xe993,0x7bb9,0xd118,0xdc40,0xbb98,0x0,0x1 +0x1,0x1,0x48,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x278d,0x3989,0xa6a3,0x13a5,0xae46,0x8326,0x37fb,0x035d,0x0,0x1 +0x1,0x1,0x49,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2716,0x0f6e,0x52a0,0x177a,0x893c,0x3b8c,0xfc3a,0x16dd,0x0,0x1 +0x1,0x1,0x4a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0f28,0x67d7,0x9c66,0xc1b0,0x3b24,0xb761,0x90f1,0xcddb,0x0,0x1 +0x1,0x1,0x4b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x507f,0x66b1,0xe126,0xb7d5,0xf6b8,0xfb57,0x5b98,0xf4e3,0x0,0x1 +0x1,0x1,0x4c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x190f,0x41a3,0x4987,0x8e70,0x07fa,0x72a9,0x1992,0x0ebe,0x0,0x1 +0x1,0x1,0x4d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4afa,0xca46,0x94c9,0xb0a0,0x848e,0x4659,0x8d1f,0x80fd,0x0,0x1 +0x1,0x1,0x4e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x274e,0xbf23,0x4ca1,0x43dd,0x8a07,0xc1ff,0xff2e,0xd891,0x0,0x1 +0x1,0x1,0x4f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xb763,0x8a69,0x6e66,0xfe10,0x8cb6,0xa122,0xe36c,0x2c9d,0x0,0x1 +0x1,0x1,0x50,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x26f9,0x711c,0x5e43,0x1d68,0x483d,0x1c20,0xad49,0x8818,0x0,0x1 +0x1,0x1,0x51,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2f3a,0xe73e,0x50cb,0x7216,0x0c69,0xa85e,0x3b6c,0xf774,0x0,0x1 +0x1,0x1,0x52,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0967,0xd0cd,0x5a60,0xdd7a,0xedeb,0x12ef,0x807e,0x2ce8,0x0,0x1 +0x1,0x1,0x53,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x43aa,0xd3af,0xf198,0x259e,0x8706,0x389a,0xb5ad,0xd7c1,0x0,0x1 +0x1,0x1,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1ae8,0x00da,0x67a6,0xc22f,0x94d0,0x5578,0xd136,0x1f25,0x0,0x1 +0x1,0x1,0x55,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x422a,0x9f47,0x8669,0x101d,0x5b11,0x7f57,0xfcb7,0x41e1,0x0,0x1 +0x1,0x1,0x56,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x15de,0xd9e4,0x0e54,0x89c8,0x2b47,0x3115,0xf1d4,0xb409,0x0,0x1 +0x1,0x1,0x57,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x9e93,0xaa99,0x6ad2,0x346e,0x8b46,0xa2aa,0x0db7,0x832c,0x0,0x1 +0x1,0x1,0x58,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2e1b,0x4d36,0x165d,0xbb3f,0x0366,0x4c4e,0x7718,0x1c95,0x0,0x1 +0x1,0x1,0x59,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x285a,0x1f1b,0xb08f,0xac15,0x99d9,0xc060,0x9508,0x5cf0,0x0,0x1 +0x1,0x1,0x5a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x286d,0xcf3f,0xe302,0xf14b,0x9df2,0xd191,0x19a9,0x7c81,0x0,0x1 +0x1,0x1,0x5b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x70a6,0x8443,0xdafe,0x5001,0xdcc4,0x50ab,0xf66c,0xb1b9,0x0,0x1 +0x1,0x1,0x5c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x23e5,0xcf5e,0x441d,0x3d12,0xe4b6,0x3d4d,0x16ee,0xa2dd,0x0,0x1 +0x1,0x1,0x5d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xdc60,0x05a7,0x9a59,0xc812,0xfbd4,0x0508,0x7069,0x1a91,0x0,0x1 +0x1,0x1,0x5e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x11cf,0xc60f,0xf4ce,0xb85b,0x8af4,0x1334,0x7b76,0x0f13,0x0,0x1 +0x1,0x1,0x5f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x4325,0xaead,0x086b,0x2761,0xe0a1,0x6039,0xab1f,0x12aa,0x0,0x1 +0x1,0x1,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x1,0x1,0x61,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_g2_both_cases_input.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_g2_both_cases_input.csv index 64be617cd80..aae2332ac19 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_g2_both_cases_input.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_g2_both_cases_input.csv @@ -1,25 +1,25 @@ -ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_LIMB,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES -0,0,1,0,0,0,0x1d3df5be6084324da6333a6ad1367091,0,1,0 -0,0,1,1,0,0,0xca9fbceb70179ec484543a58b8cb5d63,0,1,0 -0,0,1,2,0,0,0x119606e6d3ea97cea4eff54433f5c7db,0,1,0 -0,0,1,3,0,0,0xc026b8d0670ddfbe6441e31225028d31,0,1,0 -0,0,1,4,0,0,0x199a12247d5ad88dfaca291ae8b2326b,0,1,0 -0,0,1,5,0,0,0x1b0b8c0efd5e083d0bc8b411a9d48e59,0,1,0 -0,0,1,6,0,0,0x1b9a36ea373fe2c5b713557042ce6deb,0,1,0 -0,0,1,7,0,0,0x2907d34e12be595f9bbe84c144de86ef,0,1,0 -1,0,1,0,0,0,0x15ce93f1b1c4946dd6cfbb3d287d9c9a,0,1,0 -1,0,1,1,0,0,0x1cdedb264bda7aada0844416d8a47a63,0,1,0 -1,0,1,2,0,0,0x07192b9fd0e2a32e3e1caa8e59462b75,0,1,0 -1,0,1,3,0,0,0x7326d48f641924e6a1d00d66478913eb,0,1,0 -1,0,1,4,0,0,0x06e1f5e20f68f6dfa8a91a3bea048df6,0,1,0 -1,0,1,5,0,0,0x6d9eaf56cc7f11215401f7e05027e0c6,0,1,0 -1,0,1,6,0,0,0x0fa65a9b48ba018361ed081e3b9e9584,0,1,0 -1,0,1,7,0,0,0x51de5d9e8ae0bd251833ebb4b2fafc96,0,1,0 -2,0,1,0,0,0,0x0e82be8514331e947408a3a27a54d580,1,1,0 -2,0,1,1,0,0,0x9866db37d74db5abc7de8f0d3d0f7ee3,1,1,0 -2,0,1,2,0,0,0x0f89c9a7bb2eb9418d2d89310306196d,1,1,0 -2,0,1,3,0,0,0xf1ae8d9de0173f3e1151487bb5157cd7,1,1,0 -2,0,1,4,0,0,0x10b30b9925aace81dcec2ccce77c3eea,1,1,0 -2,0,1,5,0,0,0xa949c366d7cd71a6a6748bcdd996b762,1,1,0 -2,0,1,6,0,0,0x11497987c563ade267b3bdfcc9c04022,1,1,0 -2,0,1,7,0,0,0x3e25664c3bcdd28858b1daa7ac249034,1,1,0 \ No newline at end of file +ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_LIMB_0,ECDATA_LIMB_1,ECDATA_LIMB_2,ECDATA_LIMB_3,ECDATA_LIMB_4,ECDATA_LIMB_5,ECDATA_LIMB_6,ECDATA_LIMB_7,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES +0,0,1,0,0,0,0x1d3d,0xf5be,0x6084,0x324d,0xa633,0x3a6a,0xd136,0x7091,0,1,0 +0,0,1,1,0,0,0xca9f,0xbceb,0x7017,0x9ec4,0x8454,0x3a58,0xb8cb,0x5d63,0,1,0 +0,0,1,2,0,0,0x1196,0x06e6,0xd3ea,0x97ce,0xa4ef,0xf544,0x33f5,0xc7db,0,1,0 +0,0,1,3,0,0,0xc026,0xb8d0,0x670d,0xdfbe,0x6441,0xe312,0x2502,0x8d31,0,1,0 +0,0,1,4,0,0,0x199a,0x1224,0x7d5a,0xd88d,0xfaca,0x291a,0xe8b2,0x326b,0,1,0 +0,0,1,5,0,0,0x1b0b,0x8c0e,0xfd5e,0x083d,0x0bc8,0xb411,0xa9d4,0x8e59,0,1,0 +0,0,1,6,0,0,0x1b9a,0x36ea,0x373f,0xe2c5,0xb713,0x5570,0x42ce,0x6deb,0,1,0 +0,0,1,7,0,0,0x2907,0xd34e,0x12be,0x595f,0x9bbe,0x84c1,0x44de,0x86ef,0,1,0 +1,0,1,0,0,0,0x15ce,0x93f1,0xb1c4,0x946d,0xd6cf,0xbb3d,0x287d,0x9c9a,0,1,0 +1,0,1,1,0,0,0x1cde,0xdb26,0x4bda,0x7aad,0xa084,0x4416,0xd8a4,0x7a63,0,1,0 +1,0,1,2,0,0,0x0719,0x2b9f,0xd0e2,0xa32e,0x3e1c,0xaa8e,0x5946,0x2b75,0,1,0 +1,0,1,3,0,0,0x7326,0xd48f,0x6419,0x24e6,0xa1d0,0x0d66,0x4789,0x13eb,0,1,0 +1,0,1,4,0,0,0x06e1,0xf5e2,0x0f68,0xf6df,0xa8a9,0x1a3b,0xea04,0x8df6,0,1,0 +1,0,1,5,0,0,0x6d9e,0xaf56,0xcc7f,0x1121,0x5401,0xf7e0,0x5027,0xe0c6,0,1,0 +1,0,1,6,0,0,0x0fa6,0x5a9b,0x48ba,0x0183,0x61ed,0x081e,0x3b9e,0x9584,0,1,0 +1,0,1,7,0,0,0x51de,0x5d9e,0x8ae0,0xbd25,0x1833,0xebb4,0xb2fa,0xfc96,0,1,0 +2,0,1,0,0,0,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,1,1,0 +2,0,1,1,0,0,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,1,1,0 +2,0,1,2,0,0,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,1,1,0 +2,0,1,3,0,0,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,1,1,0 +2,0,1,4,0,0,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,1,1,0 +2,0,1,5,0,0,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,1,1,0 +2,0,1,6,0,0,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,1,1,0 +2,0,1,7,0,0,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,1,1,0 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_g2_both_cases_module.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_g2_both_cases_module.csv index f1b88e77f46..a9e7c2d8ff9 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_g2_both_cases_module.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_g2_both_cases_module.csv @@ -1,33 +1,33 @@ -ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_G2_DATA_IS_PULLING,ECPAIR_UNALIGNED_G2_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_G2_DATA_LIMB,ECPAIR_UNALIGNED_G2_DATA_SUCCESS_BIT,ECPAIR_UNALIGNED_G2_DATA_TO_G2_MEMBERSHIP_CIRCUIT -0x1,0x1,0x0,0x1d3df5be6084324da6333a6ad1367091,0x0,0x1 -0x1,0x1,0x0,0xca9fbceb70179ec484543a58b8cb5d63,0x0,0x1 -0x1,0x1,0x0,0x119606e6d3ea97cea4eff54433f5c7db,0x0,0x1 -0x1,0x1,0x0,0xc026b8d0670ddfbe6441e31225028d31,0x0,0x1 -0x1,0x1,0x0,0x199a12247d5ad88dfaca291ae8b2326b,0x0,0x1 -0x1,0x1,0x0,0x1b0b8c0efd5e083d0bc8b411a9d48e59,0x0,0x1 -0x1,0x1,0x0,0x1b9a36ea373fe2c5b713557042ce6deb,0x0,0x1 -0x1,0x1,0x0,0x2907d34e12be595f9bbe84c144de86ef,0x0,0x1 -0x1,0x0,0x1,0x0,0x0,0x1 -0x1,0x1,0x0,0x15ce93f1b1c4946dd6cfbb3d287d9c9a,0x0,0x1 -0x1,0x1,0x0,0x1cdedb264bda7aada0844416d8a47a63,0x0,0x1 -0x1,0x1,0x0,0x07192b9fd0e2a32e3e1caa8e59462b75,0x0,0x1 -0x1,0x1,0x0,0x7326d48f641924e6a1d00d66478913eb,0x0,0x1 -0x1,0x1,0x0,0x06e1f5e20f68f6dfa8a91a3bea048df6,0x0,0x1 -0x1,0x1,0x0,0x6d9eaf56cc7f11215401f7e05027e0c6,0x0,0x1 -0x1,0x1,0x0,0x0fa65a9b48ba018361ed081e3b9e9584,0x0,0x1 -0x1,0x1,0x0,0x51de5d9e8ae0bd251833ebb4b2fafc96,0x0,0x1 -0x1,0x0,0x1,0x0,0x0,0x1 -0x1,0x1,0x0,0x0e82be8514331e947408a3a27a54d580,0x1,0x1 -0x1,0x1,0x0,0x9866db37d74db5abc7de8f0d3d0f7ee3,0x1,0x1 -0x1,0x1,0x0,0x0f89c9a7bb2eb9418d2d89310306196d,0x1,0x1 -0x1,0x1,0x0,0xf1ae8d9de0173f3e1151487bb5157cd7,0x1,0x1 -0x1,0x1,0x0,0x10b30b9925aace81dcec2ccce77c3eea,0x1,0x1 -0x1,0x1,0x0,0xa949c366d7cd71a6a6748bcdd996b762,0x1,0x1 -0x1,0x1,0x0,0x11497987c563ade267b3bdfcc9c04022,0x1,0x1 -0x1,0x1,0x0,0x3e25664c3bcdd28858b1daa7ac249034,0x1,0x1 -0x1,0x0,0x1,0x1,0x1,0x1 -0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0 +ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_G2_DATA_IS_PULLING,ECPAIR_UNALIGNED_G2_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_G2_DATA_LIMB_0,ECPAIR_UNALIGNED_G2_DATA_LIMB_1,ECPAIR_UNALIGNED_G2_DATA_LIMB_2,ECPAIR_UNALIGNED_G2_DATA_LIMB_3,ECPAIR_UNALIGNED_G2_DATA_LIMB_4,ECPAIR_UNALIGNED_G2_DATA_LIMB_5,ECPAIR_UNALIGNED_G2_DATA_LIMB_6,ECPAIR_UNALIGNED_G2_DATA_LIMB_7,ECPAIR_UNALIGNED_G2_DATA_SUCCESS_BIT,ECPAIR_UNALIGNED_G2_DATA_TO_G2_MEMBERSHIP_CIRCUIT +0x1,0x1,0x0,0x1d3d,0xf5be,0x6084,0x324d,0xa633,0x3a6a,0xd136,0x7091,0x0,0x1 +0x1,0x1,0x0,0xca9f,0xbceb,0x7017,0x9ec4,0x8454,0x3a58,0xb8cb,0x5d63,0x0,0x1 +0x1,0x1,0x0,0x1196,0x06e6,0xd3ea,0x97ce,0xa4ef,0xf544,0x33f5,0xc7db,0x0,0x1 +0x1,0x1,0x0,0xc026,0xb8d0,0x670d,0xdfbe,0x6441,0xe312,0x2502,0x8d31,0x0,0x1 +0x1,0x1,0x0,0x199a,0x1224,0x7d5a,0xd88d,0xfaca,0x291a,0xe8b2,0x326b,0x0,0x1 +0x1,0x1,0x0,0x1b0b,0x8c0e,0xfd5e,0x083d,0x0bc8,0xb411,0xa9d4,0x8e59,0x0,0x1 +0x1,0x1,0x0,0x1b9a,0x36ea,0x373f,0xe2c5,0xb713,0x5570,0x42ce,0x6deb,0x0,0x1 +0x1,0x1,0x0,0x2907,0xd34e,0x12be,0x595f,0x9bbe,0x84c1,0x44de,0x86ef,0x0,0x1 +0x1,0x0,0x1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x1,0x1,0x0,0x15ce,0x93f1,0xb1c4,0x946d,0xd6cf,0xbb3d,0x287d,0x9c9a,0x0,0x1 +0x1,0x1,0x0,0x1cde,0xdb26,0x4bda,0x7aad,0xa084,0x4416,0xd8a4,0x7a63,0x0,0x1 +0x1,0x1,0x0,0x0719,0x2b9f,0xd0e2,0xa32e,0x3e1c,0xaa8e,0x5946,0x2b75,0x0,0x1 +0x1,0x1,0x0,0x7326,0xd48f,0x6419,0x24e6,0xa1d0,0x0d66,0x4789,0x13eb,0x0,0x1 +0x1,0x1,0x0,0x06e1,0xf5e2,0x0f68,0xf6df,0xa8a9,0x1a3b,0xea04,0x8df6,0x0,0x1 +0x1,0x1,0x0,0x6d9e,0xaf56,0xcc7f,0x1121,0x5401,0xf7e0,0x5027,0xe0c6,0x0,0x1 +0x1,0x1,0x0,0x0fa6,0x5a9b,0x48ba,0x0183,0x61ed,0x081e,0x3b9e,0x9584,0x0,0x1 +0x1,0x1,0x0,0x51de,0x5d9e,0x8ae0,0xbd25,0x1833,0xebb4,0xb2fa,0xfc96,0x0,0x1 +0x1,0x0,0x1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x1,0x1,0x0,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,0x1,0x1 +0x1,0x1,0x0,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,0x1,0x1 +0x1,0x1,0x0,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,0x1,0x1 +0x1,0x1,0x0,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,0x1,0x1 +0x1,0x1,0x0,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,0x1,0x1 +0x1,0x1,0x0,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,0x1,0x1 +0x1,0x1,0x0,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,0x1,0x1 +0x1,0x1,0x0,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,0x1,0x1 +0x1,0x0,0x1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x1,0x1 +0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_regression_1_input.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_regression_1_input.csv index 278d9801bb7..c0e35a47fad 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_regression_1_input.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_regression_1_input.csv @@ -1,51 +1,51 @@ -ECDATA_CS_PAIRING,ECDATA_ID,ECDATA_LIMB,ECDATA_SUCCESS_BIT,ECDATA_INDEX,ECDATA_IS_DATA,ECDATA_IS_RES,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_CS_G2_MEMBERSHIP -0,29563,0x0,1,0,1,0,1,4,0 -0,29563,0x0,1,1,1,0,1,4,0 -0,29563,0x0,1,2,1,0,1,4,0 -0,29563,0x0,1,3,1,0,1,4,0 -0,29563,0x0,1,4,1,0,1,4,0 -0,29563,0x0,1,5,1,0,1,4,0 -0,29563,0x0,1,6,1,0,1,4,0 -0,29563,0x0,1,7,1,0,1,4,0 -0,29563,0x0,1,8,1,0,1,4,0 -0,29563,0x0,1,9,1,0,1,4,0 -0,29563,0x0,1,10,1,0,1,4,0 -0,29563,0x0,1,11,1,0,1,4,0 -1,29563,0x27c69626be302e46df0af1982d621c7b,1,12,1,0,2,4,0 -1,29563,0x358571d44f0c65c9207af46b2e4b9594,1,13,1,0,2,4,0 -1,29563,0x120b258a7d2bb21e213159d01dd4364f,1,14,1,0,2,4,0 -1,29563,0xa11f02c47337b94e73ce1ad65ee10ada,1,15,1,0,2,4,0 -1,29563,0xb7c8b8c2f08ad05c14efdb53212ef50,1,16,1,0,2,4,0 -1,29563,0x1ac66ce991a90c10c22608a6ef0c6daf,1,17,1,0,2,4,0 -1,29563,0xda86f1aa7f003fc49ba5257f6a1a31b,1,18,1,0,2,4,0 -1,29563,0x762fb2a71e26b2bf972ad9c5ce50aabd,1,19,1,0,2,4,0 -1,29563,0x20b3c0f5090994b976afe7fa30002668,1,20,1,0,2,4,0 -1,29563,0x9547288c6611bf5bb913d706309817fc,1,21,1,0,2,4,0 -1,29563,0x1b55dc31de4c20571c178adea2e97fc6,1,22,1,0,2,4,0 -1,29563,0xb5745f4727165ab056c3150134fa6856,1,23,1,0,2,4,0 -1,29563,0x1996a3bf3f09f5c3d609d0341d07a22a,1,24,1,0,3,4,0 -1,29563,0x30cc16bfe7e74afdd0770ff169502c92,1,25,1,0,3,4,0 -1,29563,0x2c8c2d7e802418dea505c1856cb9f95b,1,26,1,0,3,4,0 -1,29563,0x1ca0a26bec7e4f73d03e9958dff2081a,1,27,1,0,3,4,0 -1,29563,0x198e9393920d483a7260bfb731fb5d25,1,28,1,0,3,4,0 -1,29563,0xf1aa493335a9e71297e485b7aef312c2,1,29,1,0,3,4,0 -1,29563,0x1800deef121f1e76426a00665e5c4479,1,30,1,0,3,4,0 -1,29563,0x674322d4f75edadd46debd5cd992f6ed,1,31,1,0,3,4,0 -1,29563,0x90689d0585ff075ec9e99ad690c3395,1,32,1,0,3,4,0 -1,29563,0xbc4b313370b38ef355acdadcd122975b,1,33,1,0,3,4,0 -1,29563,0x12c85ea5db8c6deb4aab71808dcb408f,1,34,1,0,3,4,0 -1,29563,0xe3d1e7690c43d37b4ce6cc0166fa7daa,1,35,1,0,3,4,0 -0,29563,0x0,1,36,1,0,4,4,0 -0,29563,0x0,1,37,1,0,4,4,0 -0,29563,0x0,1,38,1,0,4,4,0 -0,29563,0x0,1,39,1,0,4,4,0 -0,29563,0xed5b8a199985a625f5a0b6a44275b4c,1,40,1,0,4,4,1 -0,29563,0x48874ea094387e322a9a65548e55baaf,1,41,1,0,4,4,1 -0,29563,0x14c46c51fbb5b9e3d065addbcdd76571,1,42,1,0,4,4,1 -0,29563,0x12f73bbcdfecec743c83cd36cd6a11a0,1,43,1,0,4,4,1 -0,29563,0xa898f0e4144460a4a5a7018ceea8ab5,1,44,1,0,4,4,1 -0,29563,0x6732baf61e32b9873d6cef5cb8457cbe,1,45,1,0,4,4,1 -0,29563,0x3f6ad521b15ce41febd3ec0579fa48f,1,46,1,0,4,4,1 -0,29563,0xd563b64f31711e6e2b133b1fc2dd4588,1,47,1,0,4,4,1 -1,29563,0,1,0,0,1,0,4,0 -1,29563,0,1,1,0,1,0,4,0 \ No newline at end of file +ECDATA_CS_PAIRING,ECDATA_ID,ECDATA_LIMB_0,ECDATA_LIMB_1,ECDATA_LIMB_2,ECDATA_LIMB_3,ECDATA_LIMB_4,ECDATA_LIMB_5,ECDATA_LIMB_6,ECDATA_LIMB_7,ECDATA_SUCCESS_BIT,ECDATA_INDEX,ECDATA_IS_DATA,ECDATA_IS_RES,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_CS_G2_MEMBERSHIP +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,0,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,1,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,2,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,3,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,4,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,5,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,6,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,7,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,8,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,9,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,10,1,0,1,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,11,1,0,1,4,0 +1,29563,0x27c6,0x9626,0xbe30,0x2e46,0xdf0a,0xf198,0x2d62,0x1c7b,1,12,1,0,2,4,0 +1,29563,0x3585,0x71d4,0x4f0c,0x65c9,0x207a,0xf46b,0x2e4b,0x9594,1,13,1,0,2,4,0 +1,29563,0x120b,0x258a,0x7d2b,0xb21e,0x2131,0x59d0,0x1dd4,0x364f,1,14,1,0,2,4,0 +1,29563,0xa11f,0x02c4,0x7337,0xb94e,0x73ce,0x1ad6,0x5ee1,0x0ada,1,15,1,0,2,4,0 +1,29563,0x0b7c,0x8b8c,0x2f08,0xad05,0xc14e,0xfdb5,0x3212,0xef50,1,16,1,0,2,4,0 +1,29563,0x1ac6,0x6ce9,0x91a9,0x0c10,0xc226,0x08a6,0xef0c,0x6daf,1,17,1,0,2,4,0 +1,29563,0x0da8,0x6f1a,0xa7f0,0x03fc,0x49ba,0x5257,0xf6a1,0xa31b,1,18,1,0,2,4,0 +1,29563,0x762f,0xb2a7,0x1e26,0xb2bf,0x972a,0xd9c5,0xce50,0xaabd,1,19,1,0,2,4,0 +1,29563,0x20b3,0xc0f5,0x0909,0x94b9,0x76af,0xe7fa,0x3000,0x2668,1,20,1,0,2,4,0 +1,29563,0x9547,0x288c,0x6611,0xbf5b,0xb913,0xd706,0x3098,0x17fc,1,21,1,0,2,4,0 +1,29563,0x1b55,0xdc31,0xde4c,0x2057,0x1c17,0x8ade,0xa2e9,0x7fc6,1,22,1,0,2,4,0 +1,29563,0xb574,0x5f47,0x2716,0x5ab0,0x56c3,0x1501,0x34fa,0x6856,1,23,1,0,2,4,0 +1,29563,0x1996,0xa3bf,0x3f09,0xf5c3,0xd609,0xd034,0x1d07,0xa22a,1,24,1,0,3,4,0 +1,29563,0x30cc,0x16bf,0xe7e7,0x4afd,0xd077,0x0ff1,0x6950,0x2c92,1,25,1,0,3,4,0 +1,29563,0x2c8c,0x2d7e,0x8024,0x18de,0xa505,0xc185,0x6cb9,0xf95b,1,26,1,0,3,4,0 +1,29563,0x1ca0,0xa26b,0xec7e,0x4f73,0xd03e,0x9958,0xdff2,0x081a,1,27,1,0,3,4,0 +1,29563,0x198e,0x9393,0x920d,0x483a,0x7260,0xbfb7,0x31fb,0x5d25,1,28,1,0,3,4,0 +1,29563,0xf1aa,0x4933,0x35a9,0xe712,0x97e4,0x85b7,0xaef3,0x12c2,1,29,1,0,3,4,0 +1,29563,0x1800,0xdeef,0x121f,0x1e76,0x426a,0x0066,0x5e5c,0x4479,1,30,1,0,3,4,0 +1,29563,0x6743,0x22d4,0xf75e,0xdadd,0x46de,0xbd5c,0xd992,0xf6ed,1,31,1,0,3,4,0 +1,29563,0x0906,0x89d0,0x585f,0xf075,0xec9e,0x99ad,0x690c,0x3395,1,32,1,0,3,4,0 +1,29563,0xbc4b,0x3133,0x70b3,0x8ef3,0x55ac,0xdadc,0xd122,0x975b,1,33,1,0,3,4,0 +1,29563,0x12c8,0x5ea5,0xdb8c,0x6deb,0x4aab,0x7180,0x8dcb,0x408f,1,34,1,0,3,4,0 +1,29563,0xe3d1,0xe769,0x0c43,0xd37b,0x4ce6,0xcc01,0x66fa,0x7daa,1,35,1,0,3,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,36,1,0,4,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,37,1,0,4,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,38,1,0,4,4,0 +0,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,39,1,0,4,4,0 +0,29563,0x0ed5,0xb8a1,0x9998,0x5a62,0x5f5a,0x0b6a,0x4427,0x5b4c,1,40,1,0,4,4,1 +0,29563,0x4887,0x4ea0,0x9438,0x7e32,0x2a9a,0x6554,0x8e55,0xbaaf,1,41,1,0,4,4,1 +0,29563,0x14c4,0x6c51,0xfbb5,0xb9e3,0xd065,0xaddb,0xcdd7,0x6571,1,42,1,0,4,4,1 +0,29563,0x12f7,0x3bbc,0xdfec,0xec74,0x3c83,0xcd36,0xcd6a,0x11a0,1,43,1,0,4,4,1 +0,29563,0x0a89,0x8f0e,0x4144,0x460a,0x4a5a,0x7018,0xceea,0x8ab5,1,44,1,0,4,4,1 +0,29563,0x6732,0xbaf6,0x1e32,0xb987,0x3d6c,0xef5c,0xb845,0x7cbe,1,45,1,0,4,4,1 +0,29563,0x03f6,0xad52,0x1b15,0xce41,0xfebd,0x3ec0,0x579f,0xa48f,1,46,1,0,4,4,1 +0,29563,0xd563,0xb64f,0x3171,0x1e6e,0x2b13,0x3b1f,0xc2dd,0x4588,1,47,1,0,4,4,1 +1,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,0,0,1,0,4,0 +1,29563,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,1,0,1,0,4,0 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_regression_1_module.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_regression_1_module.csv index 1e68c359643..19d0a025f96 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_regression_1_module.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_regression_1_module.csv @@ -1,129 +1,129 @@ -ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT -0x1,0x1,0x0,0x737b,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x1,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x1,0x1,0x0 -0x1,0x1,0x2,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x3,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x4,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x5,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x6,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x7,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x8,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x9,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xa,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xb,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xc,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xd,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xe,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xf,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x10,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x11,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x12,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x13,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x14,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x15,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x16,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x17,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x18,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x27c69626be302e46df0af1982d621c7b,0x1,0x0 -0x1,0x1,0x19,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x358571d44f0c65c9207af46b2e4b9594,0x1,0x0 -0x1,0x1,0x1a,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x120b258a7d2bb21e213159d01dd4364f,0x1,0x0 -0x1,0x1,0x1b,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa11f02c47337b94e73ce1ad65ee10ada,0x1,0x0 -0x1,0x1,0x1c,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xb7c8b8c2f08ad05c14efdb53212ef50,0x1,0x0 -0x1,0x1,0x1d,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x1ac66ce991a90c10c22608a6ef0c6daf,0x1,0x0 -0x1,0x1,0x1e,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xda86f1aa7f003fc49ba5257f6a1a31b,0x1,0x0 -0x1,0x1,0x1f,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x762fb2a71e26b2bf972ad9c5ce50aabd,0x1,0x0 -0x1,0x1,0x20,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x20b3c0f5090994b976afe7fa30002668,0x1,0x0 -0x1,0x1,0x21,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x9547288c6611bf5bb913d706309817fc,0x1,0x0 -0x1,0x1,0x22,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x1b55dc31de4c20571c178adea2e97fc6,0x1,0x0 -0x1,0x1,0x23,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xb5745f4727165ab056c3150134fa6856,0x1,0x0 -0x1,0x1,0x24,0x737b,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x1137fc12353dc8b52b4a9fddbbaa3a5b,0x1,0x0 -0x1,0x1,0x25,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x17cbb12b76d31ccc72553270b505ac54,0x1,0x0 -0x1,0x1,0x26,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x759e8fb6f8a80d8fce8efdbd26d82e4,0x1,0x0 -0x1,0x1,0x27,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x11a5b0cf036373ff04fa1590f8535f43,0x1,0x0 -0x1,0x1,0x28,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x28cb8ef1fb08ff271b49d1816a451dbd,0x1,0x0 -0x1,0x1,0x29,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x24cb561c666914c1966961e99226a0e7,0x1,0x0 -0x1,0x1,0x2a,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x269a2a32ca8a7ead6dc1acb9b671d45b,0x1,0x0 -0x1,0x1,0x2b,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd93846bfa6f32f7eb9458a7a98963640,0x1,0x0 -0x1,0x1,0x2c,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2eba69ac1e7fa1147b1dbdfde9190ebf,0x1,0x0 -0x1,0x1,0x2d,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x92b120d2f924214364944984c66619c9,0x1,0x0 -0x1,0x1,0x2e,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xb3539f69dc72810362b4aa2260e18cf,0x1,0x0 -0x1,0x1,0x2f,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x6e6230b3b5c234758d6944d67b361bfb,0x1,0x0 -0x1,0x1,0x30,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2ef88e7bca3f69d2612b56ce9699615f,0x1,0x0 -0x1,0x1,0x31,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x12f87428792a957fd1737013855ac876,0x1,0x0 -0x1,0x1,0x32,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x24f79206d5cb177e64b4d9053151ce77,0x1,0x0 -0x1,0x1,0x33,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xa45dabb1095f36a6edc58f5114644398,0x1,0x0 -0x1,0x1,0x34,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1db7f080e67a26c52952d71c7331ffbe,0x1,0x0 -0x1,0x1,0x35,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xdc137df9f4dd59feeb25c4f70d2ac3f5,0x1,0x0 -0x1,0x1,0x36,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1ad6a825f36bc860b8696c73736d33f8,0x1,0x0 -0x1,0x1,0x37,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd82bd185f505f0ff786cf2e68ba47da6,0x1,0x0 -0x1,0x1,0x38,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1606a45c154325213c755b01be9903fa,0x1,0x0 -0x1,0x1,0x39,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x419de110d5c0cce0a57990de0a7d1413,0x1,0x0 -0x1,0x1,0x3a,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x8646892bb422186785938a4e3b5d520,0x1,0x0 -0x1,0x1,0x3b,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xb7a6a2366c9bac68585391b8bd024367,0x1,0x0 -0x1,0x1,0x3c,0x737b,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1137fc12353dc8b52b4a9fddbbaa3a5b,0x0,0x1 -0x1,0x1,0x3d,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x17cbb12b76d31ccc72553270b505ac54,0x0,0x1 -0x1,0x1,0x3e,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x759e8fb6f8a80d8fce8efdbd26d82e4,0x0,0x1 -0x1,0x1,0x3f,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x11a5b0cf036373ff04fa1590f8535f43,0x0,0x1 -0x1,0x1,0x40,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x28cb8ef1fb08ff271b49d1816a451dbd,0x0,0x1 -0x1,0x1,0x41,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x24cb561c666914c1966961e99226a0e7,0x0,0x1 -0x1,0x1,0x42,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x269a2a32ca8a7ead6dc1acb9b671d45b,0x0,0x1 -0x1,0x1,0x43,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd93846bfa6f32f7eb9458a7a98963640,0x0,0x1 -0x1,0x1,0x44,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2eba69ac1e7fa1147b1dbdfde9190ebf,0x0,0x1 -0x1,0x1,0x45,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x92b120d2f924214364944984c66619c9,0x0,0x1 -0x1,0x1,0x46,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xb3539f69dc72810362b4aa2260e18cf,0x0,0x1 -0x1,0x1,0x47,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x6e6230b3b5c234758d6944d67b361bfb,0x0,0x1 -0x1,0x1,0x48,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2ef88e7bca3f69d2612b56ce9699615f,0x0,0x1 -0x1,0x1,0x49,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x12f87428792a957fd1737013855ac876,0x0,0x1 -0x1,0x1,0x4a,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x24f79206d5cb177e64b4d9053151ce77,0x0,0x1 -0x1,0x1,0x4b,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xa45dabb1095f36a6edc58f5114644398,0x0,0x1 -0x1,0x1,0x4c,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1db7f080e67a26c52952d71c7331ffbe,0x0,0x1 -0x1,0x1,0x4d,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xdc137df9f4dd59feeb25c4f70d2ac3f5,0x0,0x1 -0x1,0x1,0x4e,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1ad6a825f36bc860b8696c73736d33f8,0x0,0x1 -0x1,0x1,0x4f,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd82bd185f505f0ff786cf2e68ba47da6,0x0,0x1 -0x1,0x1,0x50,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1606a45c154325213c755b01be9903fa,0x0,0x1 -0x1,0x1,0x51,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x419de110d5c0cce0a57990de0a7d1413,0x0,0x1 -0x1,0x1,0x52,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x8646892bb422186785938a4e3b5d520,0x0,0x1 -0x1,0x1,0x53,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xb7a6a2366c9bac68585391b8bd024367,0x0,0x1 -0x1,0x1,0x54,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1996a3bf3f09f5c3d609d0341d07a22a,0x0,0x1 -0x1,0x1,0x55,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x30cc16bfe7e74afdd0770ff169502c92,0x0,0x1 -0x1,0x1,0x56,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2c8c2d7e802418dea505c1856cb9f95b,0x0,0x1 -0x1,0x1,0x57,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1ca0a26bec7e4f73d03e9958dff2081a,0x0,0x1 -0x1,0x1,0x58,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x198e9393920d483a7260bfb731fb5d25,0x0,0x1 -0x1,0x1,0x59,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xf1aa493335a9e71297e485b7aef312c2,0x0,0x1 -0x1,0x1,0x5a,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1800deef121f1e76426a00665e5c4479,0x0,0x1 -0x1,0x1,0x5b,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x674322d4f75edadd46debd5cd992f6ed,0x0,0x1 -0x1,0x1,0x5c,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x90689d0585ff075ec9e99ad690c3395,0x0,0x1 -0x1,0x1,0x5d,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xbc4b313370b38ef355acdadcd122975b,0x0,0x1 -0x1,0x1,0x5e,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x12c85ea5db8c6deb4aab71808dcb408f,0x0,0x1 -0x1,0x1,0x5f,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xe3d1e7690c43d37b4ce6cc0166fa7daa,0x0,0x1 -0x1,0x1,0x60,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0,0x0,0x1 -0x1,0x1,0x61,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0,0x0,0x1 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_0,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_1,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_2,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_3,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_4,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_5,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_6,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_7,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT +0x1,0x1,0x0,0x737b,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x1,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x1,0x0 +0x1,0x1,0x2,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x3,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x4,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x5,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x6,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x7,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x8,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x9,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xa,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xb,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xc,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xd,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xe,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xf,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x10,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x11,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x12,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x13,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x14,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x15,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x16,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x17,0x737b,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x18,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x27c6,0x9626,0xbe30,0x2e46,0xdf0a,0xf198,0x2d62,0x1c7b,0x1,0x0 +0x1,0x1,0x19,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3585,0x71d4,0x4f0c,0x65c9,0x207a,0xf46b,0x2e4b,0x9594,0x1,0x0 +0x1,0x1,0x1a,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x120b,0x258a,0x7d2b,0xb21e,0x2131,0x59d0,0x1dd4,0x364f,0x1,0x0 +0x1,0x1,0x1b,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa11f,0x02c4,0x7337,0xb94e,0x73ce,0x1ad6,0x5ee1,0x0ada,0x1,0x0 +0x1,0x1,0x1c,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0b7c,0x8b8c,0x2f08,0xad05,0xc14e,0xfdb5,0x3212,0xef50,0x1,0x0 +0x1,0x1,0x1d,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x1ac6,0x6ce9,0x91a9,0x0c10,0xc226,0x08a6,0xef0c,0x6daf,0x1,0x0 +0x1,0x1,0x1e,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0da8,0x6f1a,0xa7f0,0x03fc,0x49ba,0x5257,0xf6a1,0xa31b,0x1,0x0 +0x1,0x1,0x1f,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x762f,0xb2a7,0x1e26,0xb2bf,0x972a,0xd9c5,0xce50,0xaabd,0x1,0x0 +0x1,0x1,0x20,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x20b3,0xc0f5,0x0909,0x94b9,0x76af,0xe7fa,0x3000,0x2668,0x1,0x0 +0x1,0x1,0x21,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x9547,0x288c,0x6611,0xbf5b,0xb913,0xd706,0x3098,0x17fc,0x1,0x0 +0x1,0x1,0x22,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x1b55,0xdc31,0xde4c,0x2057,0x1c17,0x8ade,0xa2e9,0x7fc6,0x1,0x0 +0x1,0x1,0x23,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xb574,0x5f47,0x2716,0x5ab0,0x56c3,0x1501,0x34fa,0x6856,0x1,0x0 +0x1,0x1,0x24,0x737b,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x1137,0xfc12,0x353d,0xc8b5,0x2b4a,0x9fdd,0xbbaa,0x3a5b,0x1,0x0 +0x1,0x1,0x25,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x17cb,0xb12b,0x76d3,0x1ccc,0x7255,0x3270,0xb505,0xac54,0x1,0x0 +0x1,0x1,0x26,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0759,0xe8fb,0x6f8a,0x80d8,0xfce8,0xefdb,0xd26d,0x82e4,0x1,0x0 +0x1,0x1,0x27,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x11a5,0xb0cf,0x0363,0x73ff,0x04fa,0x1590,0xf853,0x5f43,0x1,0x0 +0x1,0x1,0x28,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x28cb,0x8ef1,0xfb08,0xff27,0x1b49,0xd181,0x6a45,0x1dbd,0x1,0x0 +0x1,0x1,0x29,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x24cb,0x561c,0x6669,0x14c1,0x9669,0x61e9,0x9226,0xa0e7,0x1,0x0 +0x1,0x1,0x2a,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x269a,0x2a32,0xca8a,0x7ead,0x6dc1,0xacb9,0xb671,0xd45b,0x1,0x0 +0x1,0x1,0x2b,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd938,0x46bf,0xa6f3,0x2f7e,0xb945,0x8a7a,0x9896,0x3640,0x1,0x0 +0x1,0x1,0x2c,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2eba,0x69ac,0x1e7f,0xa114,0x7b1d,0xbdfd,0xe919,0x0ebf,0x1,0x0 +0x1,0x1,0x2d,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x92b1,0x20d2,0xf924,0x2143,0x6494,0x4984,0xc666,0x19c9,0x1,0x0 +0x1,0x1,0x2e,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0b35,0x39f6,0x9dc7,0x2810,0x362b,0x4aa2,0x260e,0x18cf,0x1,0x0 +0x1,0x1,0x2f,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x6e62,0x30b3,0xb5c2,0x3475,0x8d69,0x44d6,0x7b36,0x1bfb,0x1,0x0 +0x1,0x1,0x30,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2ef8,0x8e7b,0xca3f,0x69d2,0x612b,0x56ce,0x9699,0x615f,0x1,0x0 +0x1,0x1,0x31,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x12f8,0x7428,0x792a,0x957f,0xd173,0x7013,0x855a,0xc876,0x1,0x0 +0x1,0x1,0x32,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x24f7,0x9206,0xd5cb,0x177e,0x64b4,0xd905,0x3151,0xce77,0x1,0x0 +0x1,0x1,0x33,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xa45d,0xabb1,0x095f,0x36a6,0xedc5,0x8f51,0x1464,0x4398,0x1,0x0 +0x1,0x1,0x34,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1db7,0xf080,0xe67a,0x26c5,0x2952,0xd71c,0x7331,0xffbe,0x1,0x0 +0x1,0x1,0x35,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xdc13,0x7df9,0xf4dd,0x59fe,0xeb25,0xc4f7,0x0d2a,0xc3f5,0x1,0x0 +0x1,0x1,0x36,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1ad6,0xa825,0xf36b,0xc860,0xb869,0x6c73,0x736d,0x33f8,0x1,0x0 +0x1,0x1,0x37,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd82b,0xd185,0xf505,0xf0ff,0x786c,0xf2e6,0x8ba4,0x7da6,0x1,0x0 +0x1,0x1,0x38,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1606,0xa45c,0x1543,0x2521,0x3c75,0x5b01,0xbe99,0x03fa,0x1,0x0 +0x1,0x1,0x39,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x419d,0xe110,0xd5c0,0xcce0,0xa579,0x90de,0x0a7d,0x1413,0x1,0x0 +0x1,0x1,0x3a,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0864,0x6892,0xbb42,0x2186,0x7859,0x38a4,0xe3b5,0xd520,0x1,0x0 +0x1,0x1,0x3b,0x737b,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xb7a6,0xa236,0x6c9b,0xac68,0x5853,0x91b8,0xbd02,0x4367,0x1,0x0 +0x1,0x1,0x3c,0x737b,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1137,0xfc12,0x353d,0xc8b5,0x2b4a,0x9fdd,0xbbaa,0x3a5b,0x0,0x1 +0x1,0x1,0x3d,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x17cb,0xb12b,0x76d3,0x1ccc,0x7255,0x3270,0xb505,0xac54,0x0,0x1 +0x1,0x1,0x3e,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0759,0xe8fb,0x6f8a,0x80d8,0xfce8,0xefdb,0xd26d,0x82e4,0x0,0x1 +0x1,0x1,0x3f,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x11a5,0xb0cf,0x0363,0x73ff,0x04fa,0x1590,0xf853,0x5f43,0x0,0x1 +0x1,0x1,0x40,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x28cb,0x8ef1,0xfb08,0xff27,0x1b49,0xd181,0x6a45,0x1dbd,0x0,0x1 +0x1,0x1,0x41,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x24cb,0x561c,0x6669,0x14c1,0x9669,0x61e9,0x9226,0xa0e7,0x0,0x1 +0x1,0x1,0x42,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x269a,0x2a32,0xca8a,0x7ead,0x6dc1,0xacb9,0xb671,0xd45b,0x0,0x1 +0x1,0x1,0x43,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd938,0x46bf,0xa6f3,0x2f7e,0xb945,0x8a7a,0x9896,0x3640,0x0,0x1 +0x1,0x1,0x44,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2eba,0x69ac,0x1e7f,0xa114,0x7b1d,0xbdfd,0xe919,0x0ebf,0x0,0x1 +0x1,0x1,0x45,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x92b1,0x20d2,0xf924,0x2143,0x6494,0x4984,0xc666,0x19c9,0x0,0x1 +0x1,0x1,0x46,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0b35,0x39f6,0x9dc7,0x2810,0x362b,0x4aa2,0x260e,0x18cf,0x0,0x1 +0x1,0x1,0x47,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x6e62,0x30b3,0xb5c2,0x3475,0x8d69,0x44d6,0x7b36,0x1bfb,0x0,0x1 +0x1,0x1,0x48,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2ef8,0x8e7b,0xca3f,0x69d2,0x612b,0x56ce,0x9699,0x615f,0x0,0x1 +0x1,0x1,0x49,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x12f8,0x7428,0x792a,0x957f,0xd173,0x7013,0x855a,0xc876,0x0,0x1 +0x1,0x1,0x4a,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x24f7,0x9206,0xd5cb,0x177e,0x64b4,0xd905,0x3151,0xce77,0x0,0x1 +0x1,0x1,0x4b,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xa45d,0xabb1,0x095f,0x36a6,0xedc5,0x8f51,0x1464,0x4398,0x0,0x1 +0x1,0x1,0x4c,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1db7,0xf080,0xe67a,0x26c5,0x2952,0xd71c,0x7331,0xffbe,0x0,0x1 +0x1,0x1,0x4d,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xdc13,0x7df9,0xf4dd,0x59fe,0xeb25,0xc4f7,0x0d2a,0xc3f5,0x0,0x1 +0x1,0x1,0x4e,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1ad6,0xa825,0xf36b,0xc860,0xb869,0x6c73,0x736d,0x33f8,0x0,0x1 +0x1,0x1,0x4f,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd82b,0xd185,0xf505,0xf0ff,0x786c,0xf2e6,0x8ba4,0x7da6,0x0,0x1 +0x1,0x1,0x50,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1606,0xa45c,0x1543,0x2521,0x3c75,0x5b01,0xbe99,0x03fa,0x0,0x1 +0x1,0x1,0x51,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x419d,0xe110,0xd5c0,0xcce0,0xa579,0x90de,0x0a7d,0x1413,0x0,0x1 +0x1,0x1,0x52,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0864,0x6892,0xbb42,0x2186,0x7859,0x38a4,0xe3b5,0xd520,0x0,0x1 +0x1,0x1,0x53,0x737b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xb7a6,0xa236,0x6c9b,0xac68,0x5853,0x91b8,0xbd02,0x4367,0x0,0x1 +0x1,0x1,0x54,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1996,0xa3bf,0x3f09,0xf5c3,0xd609,0xd034,0x1d07,0xa22a,0x0,0x1 +0x1,0x1,0x55,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x30cc,0x16bf,0xe7e7,0x4afd,0xd077,0x0ff1,0x6950,0x2c92,0x0,0x1 +0x1,0x1,0x56,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2c8c,0x2d7e,0x8024,0x18de,0xa505,0xc185,0x6cb9,0xf95b,0x0,0x1 +0x1,0x1,0x57,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1ca0,0xa26b,0xec7e,0x4f73,0xd03e,0x9958,0xdff2,0x081a,0x0,0x1 +0x1,0x1,0x58,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x198e,0x9393,0x920d,0x483a,0x7260,0xbfb7,0x31fb,0x5d25,0x0,0x1 +0x1,0x1,0x59,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xf1aa,0x4933,0x35a9,0xe712,0x97e4,0x85b7,0xaef3,0x12c2,0x0,0x1 +0x1,0x1,0x5a,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1800,0xdeef,0x121f,0x1e76,0x426a,0x0066,0x5e5c,0x4479,0x0,0x1 +0x1,0x1,0x5b,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x6743,0x22d4,0xf75e,0xdadd,0x46de,0xbd5c,0xd992,0xf6ed,0x0,0x1 +0x1,0x1,0x5c,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x0906,0x89d0,0x585f,0xf075,0xec9e,0x99ad,0x690c,0x3395,0x0,0x1 +0x1,0x1,0x5d,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xbc4b,0x3133,0x70b3,0x8ef3,0x55ac,0xdadc,0xd122,0x975b,0x0,0x1 +0x1,0x1,0x5e,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x12c8,0x5ea5,0xdb8c,0x6deb,0x4aab,0x7180,0x8dcb,0x408f,0x0,0x1 +0x1,0x1,0x5f,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xe3d1,0xe769,0x0c43,0xd37b,0x4ce6,0xcc01,0x66fa,0x7daa,0x0,0x1 +0x1,0x1,0x60,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x1,0x1,0x61,0x737b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_trace_input.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_trace_input.csv index 95d0ff534d3..538e4d37b20 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_trace_input.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_trace_input.csv @@ -1,39 +1,39 @@ -ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_TOTAL_PAIRINGS,ECDATA_ACC_PAIRINGS,ECDATA_LIMB,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES -0x3f,1,0,0,3,1,0x1395d002b3ca9180fb924650ef0656e,1,1,0 -0x3f,1,0,1,3,1,0xad838fd027d487fed681de0d674c30da,1,1,0 -0x3f,1,0,2,3,1,0x97c3a9a072f9c85edf7a36812f8ee05,1,1,0 -0x3f,1,0,3,3,1,0xe2cc73140749dcd7d29ceb34a8412188,1,1,0 -0x3f,1,0,4,3,1,0x2bd3295ff81c577fe772543783411c36,1,1,0 -0x3f,1,0,5,3,1,0xf463676d9692ca4250588fbad0b44dc7,1,1,0 -0x3f,1,0,6,3,1,0x7d8d8329e62324af8091e3a4ffe5a57,1,1,0 -0x3f,1,0,7,3,1,0xcb8664d1f5f6838c55261177118e9313,1,1,0 -0x3f,1,0,8,3,1,0x230f1851ba0d3d7d36c8603c7118c86b,1,1,0 -0x3f,1,0,9,3,1,0xd2b6a7a1610c4af9e907cb702beff1d8,1,1,0 -0x3f,1,0,10,3,1,0x12843e703009c1c1a2f1088dcf4d91e9,1,1,0 -0x3f,1,0,11,3,1,0xed43189aa6327cae9a68be22a1aee5cb,1,1,0 -0x3f,1,0,12,3,2,0x5dcb6449ff95e1a04c3132ce3be82a8,1,1,0 -0x3f,1,0,13,3,2,0x97811d2087e082e0399985449942a45b,1,1,0 -0x3f,1,0,14,3,2,0xcb5122006e9b7ceb5307fa4015b132b,1,1,0 -0x3f,1,0,15,3,2,0x3945bb972c83459f598659fc4b5a9d32,1,1,0 -0x3f,1,0,16,3,2,0x12618811f3e9fa06644d43cfe3f69c6c,1,1,0 -0x3f,1,0,17,3,2,0x17a738128de60f8f3ebb4266bab29be6,1,1,0 -0x3f,1,0,18,3,2,0xa5a6c2ec01c4d1374078ae1bbea91d,1,1,0 -0x3f,1,0,19,3,2,0xea8e938c1275226a1ce51db5e7de53d1,1,1,0 -0x3f,1,0,20,3,2,0x2da43ecc11a0095a72454bb08fb4d111,1,1,0 -0x3f,1,0,21,3,2,0x6facadcab482a1107ae67a12bb3c19f2,1,1,0 -0x3f,1,0,22,3,2,0x1e2f128bf79945a370324b82c36c1e63,1,1,0 -0x3f,1,0,23,3,2,0x509b122c023bd8163495526bb030a216,1,1,0 -0x3f,1,0,24,3,3,0x1296d042f33ccbb814746e187aa20af4,1,1,0 -0x3f,1,0,25,3,3,0x9bd503356de4846abee08da9e32ae2ac,1,1,0 -0x3f,1,0,26,3,3,0xb980019d2af83b353aa8c2efda45f16,1,1,0 -0x3f,1,0,27,3,3,0xce523b99452118be7ae5dd1e92e0e4ec,1,1,0 -0x3f,1,0,28,3,3,0x12cd1b1242354b35cd8d2493c487b52,1,1,0 -0x3f,1,0,29,3,3,0x411d111c80e8cfb97080e2db1af5f705,1,1,0 -0x3f,1,0,30,3,3,0x20ca232ed2582feeca2d56a589eec30c,1,1,0 -0x3f,1,0,31,3,3,0x27075a44aced8382d87cd43c011aeeb0,1,1,0 -0x3f,1,0,32,3,3,0x2df7d0d9ae47467ca500b528f38ac384,1,1,0 -0x3f,1,0,33,3,3,0x33885d6a59db6ecd7d27d37145e75360,1,1,0 -0x3f,1,0,34,3,3,0x1e4d8d4d8878cad4de8dbb31ec11d1ec,1,1,0 -0x3f,1,0,35,3,3,0xd7b40617c46bb7189ccab201b9bdbaab,1,1,0 -0x3f,1,0,0,3,0,0x0,1,0,1 -0x3f,1,0,1,3,0,0x1,1,0,1 +ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_TOTAL_PAIRINGS,ECDATA_ACC_PAIRINGS,ECDATA_LIMB_0,ECDATA_LIMB_1,ECDATA_LIMB_2,ECDATA_LIMB_3,ECDATA_LIMB_4,ECDATA_LIMB_5,ECDATA_LIMB_6,ECDATA_LIMB_7,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES +0x3f,1,0,0,3,1,0x0139,0x5d00,0x2b3c,0xa918,0x0fb9,0x2465,0x0ef0,0x656e,1,1,0 +0x3f,1,0,1,3,1,0xad83,0x8fd0,0x27d4,0x87fe,0xd681,0xde0d,0x674c,0x30da,1,1,0 +0x3f,1,0,2,3,1,0x097c,0x3a9a,0x072f,0x9c85,0xedf7,0xa368,0x12f8,0xee05,1,1,0 +0x3f,1,0,3,3,1,0xe2cc,0x7314,0x0749,0xdcd7,0xd29c,0xeb34,0xa841,0x2188,1,1,0 +0x3f,1,0,4,3,1,0x2bd3,0x295f,0xf81c,0x577f,0xe772,0x5437,0x8341,0x1c36,1,1,0 +0x3f,1,0,5,3,1,0xf463,0x676d,0x9692,0xca42,0x5058,0x8fba,0xd0b4,0x4dc7,1,1,0 +0x3f,1,0,6,3,1,0x07d8,0xd832,0x9e62,0x324a,0xf809,0x1e3a,0x4ffe,0x5a57,1,1,0 +0x3f,1,0,7,3,1,0xcb86,0x64d1,0xf5f6,0x838c,0x5526,0x1177,0x118e,0x9313,1,1,0 +0x3f,1,0,8,3,1,0x230f,0x1851,0xba0d,0x3d7d,0x36c8,0x603c,0x7118,0xc86b,1,1,0 +0x3f,1,0,9,3,1,0xd2b6,0xa7a1,0x610c,0x4af9,0xe907,0xcb70,0x2bef,0xf1d8,1,1,0 +0x3f,1,0,10,3,1,0x1284,0x3e70,0x3009,0xc1c1,0xa2f1,0x088d,0xcf4d,0x91e9,1,1,0 +0x3f,1,0,11,3,1,0xed43,0x189a,0xa632,0x7cae,0x9a68,0xbe22,0xa1ae,0xe5cb,1,1,0 +0x3f,1,0,12,3,2,0x05dc,0xb644,0x9ff9,0x5e1a,0x04c3,0x132c,0xe3be,0x82a8,1,1,0 +0x3f,1,0,13,3,2,0x9781,0x1d20,0x87e0,0x82e0,0x3999,0x8544,0x9942,0xa45b,1,1,0 +0x3f,1,0,14,3,2,0x0cb5,0x1220,0x06e9,0xb7ce,0xb530,0x7fa4,0x015b,0x132b,1,1,0 +0x3f,1,0,15,3,2,0x3945,0xbb97,0x2c83,0x459f,0x5986,0x59fc,0x4b5a,0x9d32,1,1,0 +0x3f,1,0,16,3,2,0x1261,0x8811,0xf3e9,0xfa06,0x644d,0x43cf,0xe3f6,0x9c6c,1,1,0 +0x3f,1,0,17,3,2,0x17a7,0x3812,0x8de6,0x0f8f,0x3ebb,0x4266,0xbab2,0x9be6,1,1,0 +0x3f,1,0,18,3,2,0x00a5,0xa6c2,0xec01,0xc4d1,0x3740,0x78ae,0x1bbe,0xa91d,1,1,0 +0x3f,1,0,19,3,2,0xea8e,0x938c,0x1275,0x226a,0x1ce5,0x1db5,0xe7de,0x53d1,1,1,0 +0x3f,1,0,20,3,2,0x2da4,0x3ecc,0x11a0,0x095a,0x7245,0x4bb0,0x8fb4,0xd111,1,1,0 +0x3f,1,0,21,3,2,0x6fac,0xadca,0xb482,0xa110,0x7ae6,0x7a12,0xbb3c,0x19f2,1,1,0 +0x3f,1,0,22,3,2,0x1e2f,0x128b,0xf799,0x45a3,0x7032,0x4b82,0xc36c,0x1e63,1,1,0 +0x3f,1,0,23,3,2,0x509b,0x122c,0x023b,0xd816,0x3495,0x526b,0xb030,0xa216,1,1,0 +0x3f,1,0,24,3,3,0x1296,0xd042,0xf33c,0xcbb8,0x1474,0x6e18,0x7aa2,0x0af4,1,1,0 +0x3f,1,0,25,3,3,0x9bd5,0x0335,0x6de4,0x846a,0xbee0,0x8da9,0xe32a,0xe2ac,1,1,0 +0x3f,1,0,26,3,3,0x0b98,0x0019,0xd2af,0x83b3,0x53aa,0x8c2e,0xfda4,0x5f16,1,1,0 +0x3f,1,0,27,3,3,0xce52,0x3b99,0x4521,0x18be,0x7ae5,0xdd1e,0x92e0,0xe4ec,1,1,0 +0x3f,1,0,28,3,3,0x012c,0xd1b1,0x2423,0x54b3,0x5cd8,0xd249,0x3c48,0x7b52,1,1,0 +0x3f,1,0,29,3,3,0x411d,0x111c,0x80e8,0xcfb9,0x7080,0xe2db,0x1af5,0xf705,1,1,0 +0x3f,1,0,30,3,3,0x20ca,0x232e,0xd258,0x2fee,0xca2d,0x56a5,0x89ee,0xc30c,1,1,0 +0x3f,1,0,31,3,3,0x2707,0x5a44,0xaced,0x8382,0xd87c,0xd43c,0x011a,0xeeb0,1,1,0 +0x3f,1,0,32,3,3,0x2df7,0xd0d9,0xae47,0x467c,0xa500,0xb528,0xf38a,0xc384,1,1,0 +0x3f,1,0,33,3,3,0x3388,0x5d6a,0x59db,0x6ecd,0x7d27,0xd371,0x45e7,0x5360,1,1,0 +0x3f,1,0,34,3,3,0x1e4d,0x8d4d,0x8878,0xcad4,0xde8d,0xbb31,0xec11,0xd1ec,1,1,0 +0x3f,1,0,35,3,3,0xd7b4,0x0617,0xc46b,0xb718,0x9cca,0xb201,0xb9bd,0xbaab,1,1,0 +0x3f,1,0,0,3,0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,0,1 +0x3f,1,0,1,3,0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,1,0,1 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_trace_module.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_trace_module.csv index 6426b418827..9571ea0faa8 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_trace_module.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_trace_module.csv @@ -1,257 +1,257 @@ -ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT -0x1,0x1,0x0,0x3f,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x1,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x1,0x1,0x0 -0x1,0x1,0x2,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x3,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x4,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x5,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x6,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x7,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x8,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x9,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xa,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xb,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xc,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xd,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xe,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xf,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x10,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x11,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x12,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x13,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x14,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x15,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x16,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x17,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x18,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x1395d002b3ca9180fb924650ef0656e,0x1,0x0 -0x1,0x1,0x19,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xad838fd027d487fed681de0d674c30da,0x1,0x0 -0x1,0x1,0x1a,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x97c3a9a072f9c85edf7a36812f8ee05,0x1,0x0 -0x1,0x1,0x1b,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xe2cc73140749dcd7d29ceb34a8412188,0x1,0x0 -0x1,0x1,0x1c,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x2bd3295ff81c577fe772543783411c36,0x1,0x0 -0x1,0x1,0x1d,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xf463676d9692ca4250588fbad0b44dc7,0x1,0x0 -0x1,0x1,0x1e,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x7d8d8329e62324af8091e3a4ffe5a57,0x1,0x0 -0x1,0x1,0x1f,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xcb8664d1f5f6838c55261177118e9313,0x1,0x0 -0x1,0x1,0x20,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x230f1851ba0d3d7d36c8603c7118c86b,0x1,0x0 -0x1,0x1,0x21,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xd2b6a7a1610c4af9e907cb702beff1d8,0x1,0x0 -0x1,0x1,0x22,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x12843e703009c1c1a2f1088dcf4d91e9,0x1,0x0 -0x1,0x1,0x23,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xed43189aa6327cae9a68be22a1aee5cb,0x1,0x0 -0x1,0x1,0x24,0x3f,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x3,0x1cf132423a3757d094ef99ada67c9cbb,0x1,0x0 -0x1,0x1,0x25,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xc05ccf866f830043032e06e07dd88a31,0x1,0x0 -0x1,0x1,0x26,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xe30c42cccdf4b6d6c6b05a463b60438,0x1,0x0 -0x1,0x1,0x27,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x170d4ed7935fd1235d19cfc5ee258ba9,0x1,0x0 -0x1,0x1,0x28,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2cf4fca7e570f69fd5ff51d0d0424699,0x1,0x0 -0x1,0x1,0x29,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x54f670cce3aa1a95a1e3609a24de1507,0x1,0x0 -0x1,0x1,0x2a,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2e3f1c8b74e6d5303c5dade8d1338d3c,0x1,0x0 -0x1,0x1,0x2b,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x4a0d2a9c4be4cbecd7975385e41cf3b,0x1,0x0 -0x1,0x1,0x2c,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1841621784db87a58dfc93fd299f7b3e,0x1,0x0 -0x1,0x1,0x2d,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xf0e2f3f8f2a9afca5ce416419edefc72,0x1,0x0 -0x1,0x1,0x2e,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2f3f5baa49d8c5f9e7b7ae29843c5d35,0x1,0x0 -0x1,0x1,0x2f,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x5f953e4c1e0813885afc2291cd154ede,0x1,0x0 -0x1,0x1,0x30,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1510a127c5c44cbd93e51dea529b9321,0x1,0x0 -0x1,0x1,0x31,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x50cf06bd0bb7688b9965b90bcedc1af9,0x1,0x0 -0x1,0x1,0x32,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xc9593cee20457e4c62ab5da575f2647,0x1,0x0 -0x1,0x1,0x33,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xf06055f2fd530e59c2896039eab80ee7,0x1,0x0 -0x1,0x1,0x34,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1b3b112aba7d3a132fcb8c05ae86b218,0x1,0x0 -0x1,0x1,0x35,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x4f132790848da73fa7883daae019a05c,0x1,0x0 -0x1,0x1,0x36,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x233fc6eac88cfd1649495fdf1acdd1b,0x1,0x0 -0x1,0x1,0x37,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xe5d86687e5043ba455a40e42f7d63e3b,0x1,0x0 -0x1,0x1,0x38,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x24a697c910c684744ebad59980360b2c,0x1,0x0 -0x1,0x1,0x39,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xf19c2c4ffd895fb7e84e7aaaf658b917,0x1,0x0 -0x1,0x1,0x3a,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1834997d6a586ada4ad6e9cf19b11316,0x1,0x0 -0x1,0x1,0x3b,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xd0eae21499fa324cad4e71e9c7c2c161,0x1,0x0 -0x1,0x1,0x3c,0x3f,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1cf132423a3757d094ef99ada67c9cbb,0x1,0x0 -0x1,0x1,0x3d,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xc05ccf866f830043032e06e07dd88a31,0x1,0x0 -0x1,0x1,0x3e,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xe30c42cccdf4b6d6c6b05a463b60438,0x1,0x0 -0x1,0x1,0x3f,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x170d4ed7935fd1235d19cfc5ee258ba9,0x1,0x0 -0x1,0x1,0x40,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2cf4fca7e570f69fd5ff51d0d0424699,0x1,0x0 -0x1,0x1,0x41,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x54f670cce3aa1a95a1e3609a24de1507,0x1,0x0 -0x1,0x1,0x42,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2e3f1c8b74e6d5303c5dade8d1338d3c,0x1,0x0 -0x1,0x1,0x43,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x4a0d2a9c4be4cbecd7975385e41cf3b,0x1,0x0 -0x1,0x1,0x44,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1841621784db87a58dfc93fd299f7b3e,0x1,0x0 -0x1,0x1,0x45,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xf0e2f3f8f2a9afca5ce416419edefc72,0x1,0x0 -0x1,0x1,0x46,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2f3f5baa49d8c5f9e7b7ae29843c5d35,0x1,0x0 -0x1,0x1,0x47,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x5f953e4c1e0813885afc2291cd154ede,0x1,0x0 -0x1,0x1,0x48,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1510a127c5c44cbd93e51dea529b9321,0x1,0x0 -0x1,0x1,0x49,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x50cf06bd0bb7688b9965b90bcedc1af9,0x1,0x0 -0x1,0x1,0x4a,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xc9593cee20457e4c62ab5da575f2647,0x1,0x0 -0x1,0x1,0x4b,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xf06055f2fd530e59c2896039eab80ee7,0x1,0x0 -0x1,0x1,0x4c,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1b3b112aba7d3a132fcb8c05ae86b218,0x1,0x0 -0x1,0x1,0x4d,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x4f132790848da73fa7883daae019a05c,0x1,0x0 -0x1,0x1,0x4e,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x233fc6eac88cfd1649495fdf1acdd1b,0x1,0x0 -0x1,0x1,0x4f,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xe5d86687e5043ba455a40e42f7d63e3b,0x1,0x0 -0x1,0x1,0x50,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x24a697c910c684744ebad59980360b2c,0x1,0x0 -0x1,0x1,0x51,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xf19c2c4ffd895fb7e84e7aaaf658b917,0x1,0x0 -0x1,0x1,0x52,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1834997d6a586ada4ad6e9cf19b11316,0x1,0x0 -0x1,0x1,0x53,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xd0eae21499fa324cad4e71e9c7c2c161,0x1,0x0 -0x1,0x1,0x54,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x5dcb6449ff95e1a04c3132ce3be82a8,0x1,0x0 -0x1,0x1,0x55,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x97811d2087e082e0399985449942a45b,0x1,0x0 -0x1,0x1,0x56,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0xcb5122006e9b7ceb5307fa4015b132b,0x1,0x0 -0x1,0x1,0x57,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x3945bb972c83459f598659fc4b5a9d32,0x1,0x0 -0x1,0x1,0x58,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x12618811f3e9fa06644d43cfe3f69c6c,0x1,0x0 -0x1,0x1,0x59,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x17a738128de60f8f3ebb4266bab29be6,0x1,0x0 -0x1,0x1,0x5a,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0xa5a6c2ec01c4d1374078ae1bbea91d,0x1,0x0 -0x1,0x1,0x5b,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0xea8e938c1275226a1ce51db5e7de53d1,0x1,0x0 -0x1,0x1,0x5c,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x2da43ecc11a0095a72454bb08fb4d111,0x1,0x0 -0x1,0x1,0x5d,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x6facadcab482a1107ae67a12bb3c19f2,0x1,0x0 -0x1,0x1,0x5e,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x1e2f128bf79945a370324b82c36c1e63,0x1,0x0 -0x1,0x1,0x5f,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x509b122c023bd8163495526bb030a216,0x1,0x0 -0x1,0x1,0x60,0x3f,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x2,0x3,0x292cd168c3ef2c37a8f27c5bbe7c2dff,0x1,0x0 -0x1,0x1,0x61,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x5a46ba655fbb57ec5efc46b9973b7d65,0x1,0x0 -0x1,0x1,0x62,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x2cb7ca0140a3f91e02d365e4c31275f8,0x1,0x0 -0x1,0x1,0x63,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xc1856d0a6cb28650b2d9266980ca00ef,0x1,0x0 -0x1,0x1,0x64,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x19814a3786275c07e02bd384361d4b7e,0x1,0x0 -0x1,0x1,0x65,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x6f30fe1bc74fb180719d75ef9a9609d3,0x1,0x0 -0x1,0x1,0x66,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x17bf6e240bd7895eddbf10206905e6ad,0x1,0x0 -0x1,0x1,0x67,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xffed4359fee5622b68a81e6314f292ce,0x1,0x0 -0x1,0x1,0x68,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xff7294fed8bd9ec7e86e15b083c00b2,0x1,0x0 -0x1,0x1,0x69,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x927517d94b16c0133605486bfd90e477,0x1,0x0 -0x1,0x1,0x6a,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x191e2bbfd9f4989a3d1a54d21470f96e,0x1,0x0 -0x1,0x1,0x6b,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xfbf902cf06d4d6d995258e0ea9a9df06,0x1,0x0 -0x1,0x1,0x6c,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x141076b6ccff6c662090b71a1af7c79f,0x1,0x0 -0x1,0x1,0x6d,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x26700ab52e2da324955b3865ef94f595,0x1,0x0 -0x1,0x1,0x6e,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xfac823941439c8120d2c0a637e63e45,0x1,0x0 -0x1,0x1,0x6f,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x832bca89f3a3bf0132fc34d8a9ba3c22,0x1,0x0 -0x1,0x1,0x70,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xe3ab8880e570c3e1871ccac25453c9d,0x1,0x0 -0x1,0x1,0x71,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x9da82ce39eb65dcda6b5e65d7f37e82e,0x1,0x0 -0x1,0x1,0x72,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x3a1a183f2a698f9d2f14235c7c4e1fc,0x1,0x0 -0x1,0x1,0x73,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x5e2ce6aad082abaeb72e02c435c01ff3,0x1,0x0 -0x1,0x1,0x74,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x13b007062ca2e328423d9f6e4afbcdb5,0x1,0x0 -0x1,0x1,0x75,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xcb16f68b149ea5375803535399011725,0x1,0x0 -0x1,0x1,0x76,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x19523563e9858fcfded6c6ab452074cb,0x1,0x0 -0x1,0x1,0x77,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xdb8f9c7ee417eb2ae8917809a44547ff,0x1,0x0 -0x1,0x1,0x78,0x3f,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x292cd168c3ef2c37a8f27c5bbe7c2dff,0x0,0x1 -0x1,0x1,0x79,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x5a46ba655fbb57ec5efc46b9973b7d65,0x0,0x1 -0x1,0x1,0x7a,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x2cb7ca0140a3f91e02d365e4c31275f8,0x0,0x1 -0x1,0x1,0x7b,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xc1856d0a6cb28650b2d9266980ca00ef,0x0,0x1 -0x1,0x1,0x7c,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x19814a3786275c07e02bd384361d4b7e,0x0,0x1 -0x1,0x1,0x7d,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x6f30fe1bc74fb180719d75ef9a9609d3,0x0,0x1 -0x1,0x1,0x7e,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x17bf6e240bd7895eddbf10206905e6ad,0x0,0x1 -0x1,0x1,0x7f,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xffed4359fee5622b68a81e6314f292ce,0x0,0x1 -0x1,0x1,0x80,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xff7294fed8bd9ec7e86e15b083c00b2,0x0,0x1 -0x1,0x1,0x81,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x927517d94b16c0133605486bfd90e477,0x0,0x1 -0x1,0x1,0x82,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x191e2bbfd9f4989a3d1a54d21470f96e,0x0,0x1 -0x1,0x1,0x83,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xfbf902cf06d4d6d995258e0ea9a9df06,0x0,0x1 -0x1,0x1,0x84,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x141076b6ccff6c662090b71a1af7c79f,0x0,0x1 -0x1,0x1,0x85,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x26700ab52e2da324955b3865ef94f595,0x0,0x1 -0x1,0x1,0x86,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xfac823941439c8120d2c0a637e63e45,0x0,0x1 -0x1,0x1,0x87,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x832bca89f3a3bf0132fc34d8a9ba3c22,0x0,0x1 -0x1,0x1,0x88,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xe3ab8880e570c3e1871ccac25453c9d,0x0,0x1 -0x1,0x1,0x89,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x9da82ce39eb65dcda6b5e65d7f37e82e,0x0,0x1 -0x1,0x1,0x8a,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x3a1a183f2a698f9d2f14235c7c4e1fc,0x0,0x1 -0x1,0x1,0x8b,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x5e2ce6aad082abaeb72e02c435c01ff3,0x0,0x1 -0x1,0x1,0x8c,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x13b007062ca2e328423d9f6e4afbcdb5,0x0,0x1 -0x1,0x1,0x8d,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xcb16f68b149ea5375803535399011725,0x0,0x1 -0x1,0x1,0x8e,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x19523563e9858fcfded6c6ab452074cb,0x0,0x1 -0x1,0x1,0x8f,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xdb8f9c7ee417eb2ae8917809a44547ff,0x0,0x1 -0x1,0x1,0x90,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x1296d042f33ccbb814746e187aa20af4,0x0,0x1 -0x1,0x1,0x91,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x9bd503356de4846abee08da9e32ae2ac,0x0,0x1 -0x1,0x1,0x92,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xb980019d2af83b353aa8c2efda45f16,0x0,0x1 -0x1,0x1,0x93,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xce523b99452118be7ae5dd1e92e0e4ec,0x0,0x1 -0x1,0x1,0x94,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x12cd1b1242354b35cd8d2493c487b52,0x0,0x1 -0x1,0x1,0x95,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x411d111c80e8cfb97080e2db1af5f705,0x0,0x1 -0x1,0x1,0x96,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x20ca232ed2582feeca2d56a589eec30c,0x0,0x1 -0x1,0x1,0x97,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x27075a44aced8382d87cd43c011aeeb0,0x0,0x1 -0x1,0x1,0x98,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x2df7d0d9ae47467ca500b528f38ac384,0x0,0x1 -0x1,0x1,0x99,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x33885d6a59db6ecd7d27d37145e75360,0x0,0x1 -0x1,0x1,0x9a,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x1e4d8d4d8878cad4de8dbb31ec11d1ec,0x0,0x1 -0x1,0x1,0x9b,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xd7b40617c46bb7189ccab201b9bdbaab,0x0,0x1 -0x1,0x1,0x9c,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x3,0x0,0x0,0x1 -0x1,0x1,0x9d,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x3,0x1,0x0,0x1 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_0,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_1,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_2,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_3,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_4,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_5,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_6,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_7,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT +0x1,0x1,0x0,0x3f,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x1,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x1,0x0 +0x1,0x1,0x2,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x3,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x4,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x5,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x6,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x7,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x8,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x9,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xa,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xb,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xc,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xd,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xe,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xf,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x10,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x11,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x12,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x13,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x14,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x15,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x16,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x17,0x3f,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x18,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x0139,0x5d00,0x2b3c,0xa918,0x0fb9,0x2465,0x0ef0,0x656e,0x1,0x0 +0x1,0x1,0x19,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xad83,0x8fd0,0x27d4,0x87fe,0xd681,0xde0d,0x674c,0x30da,0x1,0x0 +0x1,0x1,0x1a,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x097c,0x3a9a,0x072f,0x9c85,0xedf7,0xa368,0x12f8,0xee05,0x1,0x0 +0x1,0x1,0x1b,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xe2cc,0x7314,0x0749,0xdcd7,0xd29c,0xeb34,0xa841,0x2188,0x1,0x0 +0x1,0x1,0x1c,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x2bd3,0x295f,0xf81c,0x577f,0xe772,0x5437,0x8341,0x1c36,0x1,0x0 +0x1,0x1,0x1d,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xf463,0x676d,0x9692,0xca42,0x5058,0x8fba,0xd0b4,0x4dc7,0x1,0x0 +0x1,0x1,0x1e,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x07d8,0xd832,0x9e62,0x324a,0xf809,0x1e3a,0x4ffe,0x5a57,0x1,0x0 +0x1,0x1,0x1f,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xcb86,0x64d1,0xf5f6,0x838c,0x5526,0x1177,0x118e,0x9313,0x1,0x0 +0x1,0x1,0x20,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x230f,0x1851,0xba0d,0x3d7d,0x36c8,0x603c,0x7118,0xc86b,0x1,0x0 +0x1,0x1,0x21,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xd2b6,0xa7a1,0x610c,0x4af9,0xe907,0xcb70,0x2bef,0xf1d8,0x1,0x0 +0x1,0x1,0x22,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x1284,0x3e70,0x3009,0xc1c1,0xa2f1,0x088d,0xcf4d,0x91e9,0x1,0x0 +0x1,0x1,0x23,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xed43,0x189a,0xa632,0x7cae,0x9a68,0xbe22,0xa1ae,0xe5cb,0x1,0x0 +0x1,0x1,0x24,0x3f,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x3,0x1cf1,0x3242,0x3a37,0x57d0,0x94ef,0x99ad,0xa67c,0x9cbb,0x1,0x0 +0x1,0x1,0x25,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xc05c,0xcf86,0x6f83,0x0043,0x032e,0x06e0,0x7dd8,0x8a31,0x1,0x0 +0x1,0x1,0x26,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x0e30,0xc42c,0xccdf,0x4b6d,0x6c6b,0x05a4,0x63b6,0x0438,0x1,0x0 +0x1,0x1,0x27,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x170d,0x4ed7,0x935f,0xd123,0x5d19,0xcfc5,0xee25,0x8ba9,0x1,0x0 +0x1,0x1,0x28,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2cf4,0xfca7,0xe570,0xf69f,0xd5ff,0x51d0,0xd042,0x4699,0x1,0x0 +0x1,0x1,0x29,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x54f6,0x70cc,0xe3aa,0x1a95,0xa1e3,0x609a,0x24de,0x1507,0x1,0x0 +0x1,0x1,0x2a,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2e3f,0x1c8b,0x74e6,0xd530,0x3c5d,0xade8,0xd133,0x8d3c,0x1,0x0 +0x1,0x1,0x2b,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x04a0,0xd2a9,0xc4be,0x4cbe,0xcd79,0x7538,0x5e41,0xcf3b,0x1,0x0 +0x1,0x1,0x2c,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1841,0x6217,0x84db,0x87a5,0x8dfc,0x93fd,0x299f,0x7b3e,0x1,0x0 +0x1,0x1,0x2d,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xf0e2,0xf3f8,0xf2a9,0xafca,0x5ce4,0x1641,0x9ede,0xfc72,0x1,0x0 +0x1,0x1,0x2e,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2f3f,0x5baa,0x49d8,0xc5f9,0xe7b7,0xae29,0x843c,0x5d35,0x1,0x0 +0x1,0x1,0x2f,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x5f95,0x3e4c,0x1e08,0x1388,0x5afc,0x2291,0xcd15,0x4ede,0x1,0x0 +0x1,0x1,0x30,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1510,0xa127,0xc5c4,0x4cbd,0x93e5,0x1dea,0x529b,0x9321,0x1,0x0 +0x1,0x1,0x31,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x50cf,0x06bd,0x0bb7,0x688b,0x9965,0xb90b,0xcedc,0x1af9,0x1,0x0 +0x1,0x1,0x32,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x0c95,0x93ce,0xe204,0x57e4,0xc62a,0xb5da,0x575f,0x2647,0x1,0x0 +0x1,0x1,0x33,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xf060,0x55f2,0xfd53,0x0e59,0xc289,0x6039,0xeab8,0x0ee7,0x1,0x0 +0x1,0x1,0x34,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1b3b,0x112a,0xba7d,0x3a13,0x2fcb,0x8c05,0xae86,0xb218,0x1,0x0 +0x1,0x1,0x35,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x4f13,0x2790,0x848d,0xa73f,0xa788,0x3daa,0xe019,0xa05c,0x1,0x0 +0x1,0x1,0x36,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x0233,0xfc6e,0xac88,0xcfd1,0x6494,0x95fd,0xf1ac,0xdd1b,0x1,0x0 +0x1,0x1,0x37,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xe5d8,0x6687,0xe504,0x3ba4,0x55a4,0x0e42,0xf7d6,0x3e3b,0x1,0x0 +0x1,0x1,0x38,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x24a6,0x97c9,0x10c6,0x8474,0x4eba,0xd599,0x8036,0x0b2c,0x1,0x0 +0x1,0x1,0x39,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xf19c,0x2c4f,0xfd89,0x5fb7,0xe84e,0x7aaa,0xf658,0xb917,0x1,0x0 +0x1,0x1,0x3a,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1834,0x997d,0x6a58,0x6ada,0x4ad6,0xe9cf,0x19b1,0x1316,0x1,0x0 +0x1,0x1,0x3b,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xd0ea,0xe214,0x99fa,0x324c,0xad4e,0x71e9,0xc7c2,0xc161,0x1,0x0 +0x1,0x1,0x3c,0x3f,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1cf1,0x3242,0x3a37,0x57d0,0x94ef,0x99ad,0xa67c,0x9cbb,0x1,0x0 +0x1,0x1,0x3d,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xc05c,0xcf86,0x6f83,0x0043,0x032e,0x06e0,0x7dd8,0x8a31,0x1,0x0 +0x1,0x1,0x3e,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x0e30,0xc42c,0xccdf,0x4b6d,0x6c6b,0x05a4,0x63b6,0x0438,0x1,0x0 +0x1,0x1,0x3f,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x170d,0x4ed7,0x935f,0xd123,0x5d19,0xcfc5,0xee25,0x8ba9,0x1,0x0 +0x1,0x1,0x40,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2cf4,0xfca7,0xe570,0xf69f,0xd5ff,0x51d0,0xd042,0x4699,0x1,0x0 +0x1,0x1,0x41,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x54f6,0x70cc,0xe3aa,0x1a95,0xa1e3,0x609a,0x24de,0x1507,0x1,0x0 +0x1,0x1,0x42,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2e3f,0x1c8b,0x74e6,0xd530,0x3c5d,0xade8,0xd133,0x8d3c,0x1,0x0 +0x1,0x1,0x43,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x04a0,0xd2a9,0xc4be,0x4cbe,0xcd79,0x7538,0x5e41,0xcf3b,0x1,0x0 +0x1,0x1,0x44,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1841,0x6217,0x84db,0x87a5,0x8dfc,0x93fd,0x299f,0x7b3e,0x1,0x0 +0x1,0x1,0x45,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xf0e2,0xf3f8,0xf2a9,0xafca,0x5ce4,0x1641,0x9ede,0xfc72,0x1,0x0 +0x1,0x1,0x46,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2f3f,0x5baa,0x49d8,0xc5f9,0xe7b7,0xae29,0x843c,0x5d35,0x1,0x0 +0x1,0x1,0x47,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x5f95,0x3e4c,0x1e08,0x1388,0x5afc,0x2291,0xcd15,0x4ede,0x1,0x0 +0x1,0x1,0x48,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1510,0xa127,0xc5c4,0x4cbd,0x93e5,0x1dea,0x529b,0x9321,0x1,0x0 +0x1,0x1,0x49,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x50cf,0x06bd,0x0bb7,0x688b,0x9965,0xb90b,0xcedc,0x1af9,0x1,0x0 +0x1,0x1,0x4a,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x0c95,0x93ce,0xe204,0x57e4,0xc62a,0xb5da,0x575f,0x2647,0x1,0x0 +0x1,0x1,0x4b,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xf060,0x55f2,0xfd53,0x0e59,0xc289,0x6039,0xeab8,0x0ee7,0x1,0x0 +0x1,0x1,0x4c,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1b3b,0x112a,0xba7d,0x3a13,0x2fcb,0x8c05,0xae86,0xb218,0x1,0x0 +0x1,0x1,0x4d,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x4f13,0x2790,0x848d,0xa73f,0xa788,0x3daa,0xe019,0xa05c,0x1,0x0 +0x1,0x1,0x4e,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x0233,0xfc6e,0xac88,0xcfd1,0x6494,0x95fd,0xf1ac,0xdd1b,0x1,0x0 +0x1,0x1,0x4f,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xe5d8,0x6687,0xe504,0x3ba4,0x55a4,0x0e42,0xf7d6,0x3e3b,0x1,0x0 +0x1,0x1,0x50,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x24a6,0x97c9,0x10c6,0x8474,0x4eba,0xd599,0x8036,0x0b2c,0x1,0x0 +0x1,0x1,0x51,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xf19c,0x2c4f,0xfd89,0x5fb7,0xe84e,0x7aaa,0xf658,0xb917,0x1,0x0 +0x1,0x1,0x52,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1834,0x997d,0x6a58,0x6ada,0x4ad6,0xe9cf,0x19b1,0x1316,0x1,0x0 +0x1,0x1,0x53,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xd0ea,0xe214,0x99fa,0x324c,0xad4e,0x71e9,0xc7c2,0xc161,0x1,0x0 +0x1,0x1,0x54,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x05dc,0xb644,0x9ff9,0x5e1a,0x04c3,0x132c,0xe3be,0x82a8,0x1,0x0 +0x1,0x1,0x55,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x9781,0x1d20,0x87e0,0x82e0,0x3999,0x8544,0x9942,0xa45b,0x1,0x0 +0x1,0x1,0x56,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x0cb5,0x1220,0x06e9,0xb7ce,0xb530,0x7fa4,0x015b,0x132b,0x1,0x0 +0x1,0x1,0x57,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x3945,0xbb97,0x2c83,0x459f,0x5986,0x59fc,0x4b5a,0x9d32,0x1,0x0 +0x1,0x1,0x58,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x1261,0x8811,0xf3e9,0xfa06,0x644d,0x43cf,0xe3f6,0x9c6c,0x1,0x0 +0x1,0x1,0x59,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x17a7,0x3812,0x8de6,0x0f8f,0x3ebb,0x4266,0xbab2,0x9be6,0x1,0x0 +0x1,0x1,0x5a,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x00a5,0xa6c2,0xec01,0xc4d1,0x3740,0x78ae,0x1bbe,0xa91d,0x1,0x0 +0x1,0x1,0x5b,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0xea8e,0x938c,0x1275,0x226a,0x1ce5,0x1db5,0xe7de,0x53d1,0x1,0x0 +0x1,0x1,0x5c,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x2da4,0x3ecc,0x11a0,0x095a,0x7245,0x4bb0,0x8fb4,0xd111,0x1,0x0 +0x1,0x1,0x5d,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x6fac,0xadca,0xb482,0xa110,0x7ae6,0x7a12,0xbb3c,0x19f2,0x1,0x0 +0x1,0x1,0x5e,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x1e2f,0x128b,0xf799,0x45a3,0x7032,0x4b82,0xc36c,0x1e63,0x1,0x0 +0x1,0x1,0x5f,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x509b,0x122c,0x023b,0xd816,0x3495,0x526b,0xb030,0xa216,0x1,0x0 +0x1,0x1,0x60,0x3f,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x2,0x3,0x292c,0xd168,0xc3ef,0x2c37,0xa8f2,0x7c5b,0xbe7c,0x2dff,0x1,0x0 +0x1,0x1,0x61,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x5a46,0xba65,0x5fbb,0x57ec,0x5efc,0x46b9,0x973b,0x7d65,0x1,0x0 +0x1,0x1,0x62,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x2cb7,0xca01,0x40a3,0xf91e,0x02d3,0x65e4,0xc312,0x75f8,0x1,0x0 +0x1,0x1,0x63,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xc185,0x6d0a,0x6cb2,0x8650,0xb2d9,0x2669,0x80ca,0x00ef,0x1,0x0 +0x1,0x1,0x64,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x1981,0x4a37,0x8627,0x5c07,0xe02b,0xd384,0x361d,0x4b7e,0x1,0x0 +0x1,0x1,0x65,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x6f30,0xfe1b,0xc74f,0xb180,0x719d,0x75ef,0x9a96,0x09d3,0x1,0x0 +0x1,0x1,0x66,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x17bf,0x6e24,0x0bd7,0x895e,0xddbf,0x1020,0x6905,0xe6ad,0x1,0x0 +0x1,0x1,0x67,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xffed,0x4359,0xfee5,0x622b,0x68a8,0x1e63,0x14f2,0x92ce,0x1,0x0 +0x1,0x1,0x68,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x0ff7,0x294f,0xed8b,0xd9ec,0x7e86,0xe15b,0x083c,0x00b2,0x1,0x0 +0x1,0x1,0x69,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x9275,0x17d9,0x4b16,0xc013,0x3605,0x486b,0xfd90,0xe477,0x1,0x0 +0x1,0x1,0x6a,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x191e,0x2bbf,0xd9f4,0x989a,0x3d1a,0x54d2,0x1470,0xf96e,0x1,0x0 +0x1,0x1,0x6b,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xfbf9,0x02cf,0x06d4,0xd6d9,0x9525,0x8e0e,0xa9a9,0xdf06,0x1,0x0 +0x1,0x1,0x6c,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x1410,0x76b6,0xccff,0x6c66,0x2090,0xb71a,0x1af7,0xc79f,0x1,0x0 +0x1,0x1,0x6d,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x2670,0x0ab5,0x2e2d,0xa324,0x955b,0x3865,0xef94,0xf595,0x1,0x0 +0x1,0x1,0x6e,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x0fac,0x8239,0x4143,0x9c81,0x20d2,0xc0a6,0x37e6,0x3e45,0x1,0x0 +0x1,0x1,0x6f,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x832b,0xca89,0xf3a3,0xbf01,0x32fc,0x34d8,0xa9ba,0x3c22,0x1,0x0 +0x1,0x1,0x70,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x0e3a,0xb888,0x0e57,0x0c3e,0x1871,0xccac,0x2545,0x3c9d,0x1,0x0 +0x1,0x1,0x71,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x9da8,0x2ce3,0x9eb6,0x5dcd,0xa6b5,0xe65d,0x7f37,0xe82e,0x1,0x0 +0x1,0x1,0x72,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x03a1,0xa183,0xf2a6,0x98f9,0xd2f1,0x4235,0xc7c4,0xe1fc,0x1,0x0 +0x1,0x1,0x73,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x5e2c,0xe6aa,0xd082,0xabae,0xb72e,0x02c4,0x35c0,0x1ff3,0x1,0x0 +0x1,0x1,0x74,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x13b0,0x0706,0x2ca2,0xe328,0x423d,0x9f6e,0x4afb,0xcdb5,0x1,0x0 +0x1,0x1,0x75,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xcb16,0xf68b,0x149e,0xa537,0x5803,0x5353,0x9901,0x1725,0x1,0x0 +0x1,0x1,0x76,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x1952,0x3563,0xe985,0x8fcf,0xded6,0xc6ab,0x4520,0x74cb,0x1,0x0 +0x1,0x1,0x77,0x3f,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xdb8f,0x9c7e,0xe417,0xeb2a,0xe891,0x7809,0xa445,0x47ff,0x1,0x0 +0x1,0x1,0x78,0x3f,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x292c,0xd168,0xc3ef,0x2c37,0xa8f2,0x7c5b,0xbe7c,0x2dff,0x0,0x1 +0x1,0x1,0x79,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x5a46,0xba65,0x5fbb,0x57ec,0x5efc,0x46b9,0x973b,0x7d65,0x0,0x1 +0x1,0x1,0x7a,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x2cb7,0xca01,0x40a3,0xf91e,0x02d3,0x65e4,0xc312,0x75f8,0x0,0x1 +0x1,0x1,0x7b,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xc185,0x6d0a,0x6cb2,0x8650,0xb2d9,0x2669,0x80ca,0x00ef,0x0,0x1 +0x1,0x1,0x7c,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x1981,0x4a37,0x8627,0x5c07,0xe02b,0xd384,0x361d,0x4b7e,0x0,0x1 +0x1,0x1,0x7d,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x6f30,0xfe1b,0xc74f,0xb180,0x719d,0x75ef,0x9a96,0x09d3,0x0,0x1 +0x1,0x1,0x7e,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x17bf,0x6e24,0x0bd7,0x895e,0xddbf,0x1020,0x6905,0xe6ad,0x0,0x1 +0x1,0x1,0x7f,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xffed,0x4359,0xfee5,0x622b,0x68a8,0x1e63,0x14f2,0x92ce,0x0,0x1 +0x1,0x1,0x80,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x0ff7,0x294f,0xed8b,0xd9ec,0x7e86,0xe15b,0x083c,0x00b2,0x0,0x1 +0x1,0x1,0x81,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x9275,0x17d9,0x4b16,0xc013,0x3605,0x486b,0xfd90,0xe477,0x0,0x1 +0x1,0x1,0x82,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x191e,0x2bbf,0xd9f4,0x989a,0x3d1a,0x54d2,0x1470,0xf96e,0x0,0x1 +0x1,0x1,0x83,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xfbf9,0x02cf,0x06d4,0xd6d9,0x9525,0x8e0e,0xa9a9,0xdf06,0x0,0x1 +0x1,0x1,0x84,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x1410,0x76b6,0xccff,0x6c66,0x2090,0xb71a,0x1af7,0xc79f,0x0,0x1 +0x1,0x1,0x85,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x2670,0x0ab5,0x2e2d,0xa324,0x955b,0x3865,0xef94,0xf595,0x0,0x1 +0x1,0x1,0x86,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x0fac,0x8239,0x4143,0x9c81,0x20d2,0xc0a6,0x37e6,0x3e45,0x0,0x1 +0x1,0x1,0x87,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x832b,0xca89,0xf3a3,0xbf01,0x32fc,0x34d8,0xa9ba,0x3c22,0x0,0x1 +0x1,0x1,0x88,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x0e3a,0xb888,0x0e57,0x0c3e,0x1871,0xccac,0x2545,0x3c9d,0x0,0x1 +0x1,0x1,0x89,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x9da8,0x2ce3,0x9eb6,0x5dcd,0xa6b5,0xe65d,0x7f37,0xe82e,0x0,0x1 +0x1,0x1,0x8a,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x03a1,0xa183,0xf2a6,0x98f9,0xd2f1,0x4235,0xc7c4,0xe1fc,0x0,0x1 +0x1,0x1,0x8b,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x5e2c,0xe6aa,0xd082,0xabae,0xb72e,0x02c4,0x35c0,0x1ff3,0x0,0x1 +0x1,0x1,0x8c,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x13b0,0x0706,0x2ca2,0xe328,0x423d,0x9f6e,0x4afb,0xcdb5,0x0,0x1 +0x1,0x1,0x8d,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xcb16,0xf68b,0x149e,0xa537,0x5803,0x5353,0x9901,0x1725,0x0,0x1 +0x1,0x1,0x8e,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x1952,0x3563,0xe985,0x8fcf,0xded6,0xc6ab,0x4520,0x74cb,0x0,0x1 +0x1,0x1,0x8f,0x3f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xdb8f,0x9c7e,0xe417,0xeb2a,0xe891,0x7809,0xa445,0x47ff,0x0,0x1 +0x1,0x1,0x90,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x1296,0xd042,0xf33c,0xcbb8,0x1474,0x6e18,0x7aa2,0x0af4,0x0,0x1 +0x1,0x1,0x91,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x9bd5,0x0335,0x6de4,0x846a,0xbee0,0x8da9,0xe32a,0xe2ac,0x0,0x1 +0x1,0x1,0x92,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x0b98,0x0019,0xd2af,0x83b3,0x53aa,0x8c2e,0xfda4,0x5f16,0x0,0x1 +0x1,0x1,0x93,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xce52,0x3b99,0x4521,0x18be,0x7ae5,0xdd1e,0x92e0,0xe4ec,0x0,0x1 +0x1,0x1,0x94,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x012c,0xd1b1,0x2423,0x54b3,0x5cd8,0xd249,0x3c48,0x7b52,0x0,0x1 +0x1,0x1,0x95,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x411d,0x111c,0x80e8,0xcfb9,0x7080,0xe2db,0x1af5,0xf705,0x0,0x1 +0x1,0x1,0x96,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x20ca,0x232e,0xd258,0x2fee,0xca2d,0x56a5,0x89ee,0xc30c,0x0,0x1 +0x1,0x1,0x97,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x2707,0x5a44,0xaced,0x8382,0xd87c,0xd43c,0x011a,0xeeb0,0x0,0x1 +0x1,0x1,0x98,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x2df7,0xd0d9,0xae47,0x467c,0xa500,0xb528,0xf38a,0xc384,0x0,0x1 +0x1,0x1,0x99,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x3388,0x5d6a,0x59db,0x6ecd,0x7d27,0xd371,0x45e7,0x5360,0x0,0x1 +0x1,0x1,0x9a,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x1e4d,0x8d4d,0x8878,0xcad4,0xde8d,0xbb31,0xec11,0xd1ec,0x0,0x1 +0x1,0x1,0x9b,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xd7b4,0x0617,0xc46b,0xb718,0x9cca,0xb201,0xb9bd,0xbaab,0x0,0x1 +0x1,0x1,0x9c,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x1,0x1,0x9d,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0,0x1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_triple_pair_input.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_triple_pair_input.csv index 41120cd1d99..56cbf61178c 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_triple_pair_input.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_triple_pair_input.csv @@ -1,39 +1,39 @@ -ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_TOTAL_PAIRINGS,ECDATA_ACC_PAIRINGS,ECDATA_LIMB,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES -0,1,0,0,3,1,0x100fb2006c3a4409ce06f6c2d535564c,1,1,0 -0,1,0,1,3,1,0x92e592aeb426d6c035bb8c0a50202e6d,1,1,0 -0,1,0,2,3,1,0x1275964141a90f3170592ade82174d09,1,1,0 -0,1,0,3,3,1,0xde3cc7f5b79f260f51c143e3268ba06d,1,1,0 -0,1,0,4,3,1,0x2e607689d1161c5cb3d6ed870a5b6f47,1,1,0 -0,1,0,5,3,1,0xb19627c2c51d3d2eb72f81c540ff9f9d,1,1,0 -0,1,0,6,3,1,0x09d2b2eb399326d9cc552e9753afaeab,1,1,0 -0,1,0,7,3,1,0xbb29985def8b5800f32145223ff61d48,1,1,0 -0,1,0,8,3,1,0x03a5907084b1f9ee93a1fa011b31b383,1,1,0 -0,1,0,9,3,1,0x60b7d50b789fbe32d3733176ffd9d46a,1,1,0 -0,1,0,10,3,1,0x2e8b82b3506125e8b67bb867604a8892,1,1,0 -0,1,0,11,3,1,0x7b9695a8d131627503a0f63bfe5d0cca,1,1,0 -0,1,0,12,3,2,0x1f5ca3dcd416ce988b93b505e473fbc8,1,1,0 -0,1,0,13,3,2,0xa510b9a25ba4af91a01cbf2d66496ba7,1,1,0 -0,1,0,14,3,2,0x2ab07af451260653f5d92e48135636fe,1,1,0 -0,1,0,15,3,2,0x6e69bfad773e8c1806b4e4bb128048f9,1,1,0 -0,1,0,16,3,2,0x1e311797d9d7b0c3b1658f72e16632e3,1,1,0 -0,1,0,17,3,2,0x927ad04f742ded7fe801e8df6e137325,1,1,0 -0,1,0,18,3,2,0x1d0510803ef7512c7915a6879d460c72,1,1,0 -0,1,0,19,3,2,0x27480a98574d5d306828694e1640ec2b,1,1,0 -0,1,0,20,3,2,0x0bb8fd9936c7a8c8f4a3d9ce97735df5,1,1,0 -0,1,0,21,3,2,0x41af0c73696dff5f92c6eb248f949a18,1,1,0 -0,1,0,22,3,2,0x15f8308390c00f0a0e1ebcd08626f1ec,1,1,0 -0,1,0,23,3,2,0x57a14cac88cd49f9d0e3caaa20ce36e9,1,1,0 -0,1,0,24,3,3,0x0c8671a7e8f372087c46b7b82c53c183,1,1,0 -0,1,0,25,3,3,0xd09453270e38045cb7372662d4716f8d,1,1,0 -0,1,0,26,3,3,0x20dd05e87836797d4507cc8917ed1079,1,1,0 -0,1,0,27,3,3,0xa10fe34dc7536969843e4cbe868a64ac,1,1,0 -0,1,0,28,3,3,0x24e48d89873ad5ebcf0f7022c01020b5,1,1,0 -0,1,0,29,3,3,0x10458a3dfc798231e6b5d5f17c8c9e1c,1,1,0 -0,1,0,30,3,3,0x2f3ba4b3c58fd37398ceef826e29c853,1,1,0 -0,1,0,31,3,3,0x7048f7fec19180f89f4961bf0b00e9c1,1,1,0 -0,1,0,32,3,3,0x2ed87dc23279bee95b8caada387b5f5e,1,1,0 -0,1,0,33,3,3,0x04fdd666fda2df2aac57457ecfb62014,1,1,0 -0,1,0,34,3,3,0x1b77c09a4389d4d50e5b78a8dca80583,1,1,0 -0,1,0,35,3,3,0x1056618bfe329ac4dcc8ee73ec818284,1,1,0 -0,1,0,0,3,0,0x0,1,0,1 -0,1,0,1,3,0,0x1,1,0,1 \ No newline at end of file +ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_TOTAL_PAIRINGS,ECDATA_ACC_PAIRINGS,ECDATA_LIMB_0,ECDATA_LIMB_1,ECDATA_LIMB_2,ECDATA_LIMB_3,ECDATA_LIMB_4,ECDATA_LIMB_5,ECDATA_LIMB_6,ECDATA_LIMB_7,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES +0,1,0,0,3,1,0x100f,0xb200,0x6c3a,0x4409,0xce06,0xf6c2,0xd535,0x564c,1,1,0 +0,1,0,1,3,1,0x92e5,0x92ae,0xb426,0xd6c0,0x35bb,0x8c0a,0x5020,0x2e6d,1,1,0 +0,1,0,2,3,1,0x1275,0x9641,0x41a9,0x0f31,0x7059,0x2ade,0x8217,0x4d09,1,1,0 +0,1,0,3,3,1,0xde3c,0xc7f5,0xb79f,0x260f,0x51c1,0x43e3,0x268b,0xa06d,1,1,0 +0,1,0,4,3,1,0x2e60,0x7689,0xd116,0x1c5c,0xb3d6,0xed87,0x0a5b,0x6f47,1,1,0 +0,1,0,5,3,1,0xb196,0x27c2,0xc51d,0x3d2e,0xb72f,0x81c5,0x40ff,0x9f9d,1,1,0 +0,1,0,6,3,1,0x09d2,0xb2eb,0x3993,0x26d9,0xcc55,0x2e97,0x53af,0xaeab,1,1,0 +0,1,0,7,3,1,0xbb29,0x985d,0xef8b,0x5800,0xf321,0x4522,0x3ff6,0x1d48,1,1,0 +0,1,0,8,3,1,0x03a5,0x9070,0x84b1,0xf9ee,0x93a1,0xfa01,0x1b31,0xb383,1,1,0 +0,1,0,9,3,1,0x60b7,0xd50b,0x789f,0xbe32,0xd373,0x3176,0xffd9,0xd46a,1,1,0 +0,1,0,10,3,1,0x2e8b,0x82b3,0x5061,0x25e8,0xb67b,0xb867,0x604a,0x8892,1,1,0 +0,1,0,11,3,1,0x7b96,0x95a8,0xd131,0x6275,0x03a0,0xf63b,0xfe5d,0x0cca,1,1,0 +0,1,0,12,3,2,0x1f5c,0xa3dc,0xd416,0xce98,0x8b93,0xb505,0xe473,0xfbc8,1,1,0 +0,1,0,13,3,2,0xa510,0xb9a2,0x5ba4,0xaf91,0xa01c,0xbf2d,0x6649,0x6ba7,1,1,0 +0,1,0,14,3,2,0x2ab0,0x7af4,0x5126,0x0653,0xf5d9,0x2e48,0x1356,0x36fe,1,1,0 +0,1,0,15,3,2,0x6e69,0xbfad,0x773e,0x8c18,0x06b4,0xe4bb,0x1280,0x48f9,1,1,0 +0,1,0,16,3,2,0x1e31,0x1797,0xd9d7,0xb0c3,0xb165,0x8f72,0xe166,0x32e3,1,1,0 +0,1,0,17,3,2,0x927a,0xd04f,0x742d,0xed7f,0xe801,0xe8df,0x6e13,0x7325,1,1,0 +0,1,0,18,3,2,0x1d05,0x1080,0x3ef7,0x512c,0x7915,0xa687,0x9d46,0x0c72,1,1,0 +0,1,0,19,3,2,0x2748,0x0a98,0x574d,0x5d30,0x6828,0x694e,0x1640,0xec2b,1,1,0 +0,1,0,20,3,2,0x0bb8,0xfd99,0x36c7,0xa8c8,0xf4a3,0xd9ce,0x9773,0x5df5,1,1,0 +0,1,0,21,3,2,0x41af,0x0c73,0x696d,0xff5f,0x92c6,0xeb24,0x8f94,0x9a18,1,1,0 +0,1,0,22,3,2,0x15f8,0x3083,0x90c0,0x0f0a,0x0e1e,0xbcd0,0x8626,0xf1ec,1,1,0 +0,1,0,23,3,2,0x57a1,0x4cac,0x88cd,0x49f9,0xd0e3,0xcaaa,0x20ce,0x36e9,1,1,0 +0,1,0,24,3,3,0x0c86,0x71a7,0xe8f3,0x7208,0x7c46,0xb7b8,0x2c53,0xc183,1,1,0 +0,1,0,25,3,3,0xd094,0x5327,0x0e38,0x045c,0xb737,0x2662,0xd471,0x6f8d,1,1,0 +0,1,0,26,3,3,0x20dd,0x05e8,0x7836,0x797d,0x4507,0xcc89,0x17ed,0x1079,1,1,0 +0,1,0,27,3,3,0xa10f,0xe34d,0xc753,0x6969,0x843e,0x4cbe,0x868a,0x64ac,1,1,0 +0,1,0,28,3,3,0x24e4,0x8d89,0x873a,0xd5eb,0xcf0f,0x7022,0xc010,0x20b5,1,1,0 +0,1,0,29,3,3,0x1045,0x8a3d,0xfc79,0x8231,0xe6b5,0xd5f1,0x7c8c,0x9e1c,1,1,0 +0,1,0,30,3,3,0x2f3b,0xa4b3,0xc58f,0xd373,0x98ce,0xef82,0x6e29,0xc853,1,1,0 +0,1,0,31,3,3,0x7048,0xf7fe,0xc191,0x80f8,0x9f49,0x61bf,0x0b00,0xe9c1,1,1,0 +0,1,0,32,3,3,0x2ed8,0x7dc2,0x3279,0xbee9,0x5b8c,0xaada,0x387b,0x5f5e,1,1,0 +0,1,0,33,3,3,0x04fd,0xd666,0xfda2,0xdf2a,0xac57,0x457e,0xcfb6,0x2014,1,1,0 +0,1,0,34,3,3,0x1b77,0xc09a,0x4389,0xd4d5,0x0e5b,0x78a8,0xdca8,0x0583,1,1,0 +0,1,0,35,3,3,0x1056,0x618b,0xfe32,0x9ac4,0xdcc8,0xee73,0xec81,0x8284,1,1,0 +0,1,0,0,3,0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,0,1 +0,1,0,1,3,0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,1,0,1 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_triple_pair_module.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_triple_pair_module.csv index a59d72f856d..7eb79476541 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_triple_pair_module.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_triple_pair_module.csv @@ -1,257 +1,257 @@ -ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT -0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x1,0x1,0x0 -0x1,0x1,0x2,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x3,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x4,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x5,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x6,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x7,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x8,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x9,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xa,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xb,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xc,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xd,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xe,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0xf,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x10,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x11,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x12,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x13,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x14,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x15,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x16,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x17,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0,0x1,0x0 -0x1,0x1,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x100fb2006c3a4409ce06f6c2d535564c,0x1,0x0 -0x1,0x1,0x19,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x92e592aeb426d6c035bb8c0a50202e6d,0x1,0x0 -0x1,0x1,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x1275964141a90f3170592ade82174d09,0x1,0x0 -0x1,0x1,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xde3cc7f5b79f260f51c143e3268ba06d,0x1,0x0 -0x1,0x1,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x2e607689d1161c5cb3d6ed870a5b6f47,0x1,0x0 -0x1,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xb19627c2c51d3d2eb72f81c540ff9f9d,0x1,0x0 -0x1,0x1,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x9d2b2eb399326d9cc552e9753afaeab,0x1,0x0 -0x1,0x1,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xbb29985def8b5800f32145223ff61d48,0x1,0x0 -0x1,0x1,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x3a5907084b1f9ee93a1fa011b31b383,0x1,0x0 -0x1,0x1,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x60b7d50b789fbe32d3733176ffd9d46a,0x1,0x0 -0x1,0x1,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x2e8b82b3506125e8b67bb867604a8892,0x1,0x0 -0x1,0x1,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x7b9695a8d131627503a0f63bfe5d0cca,0x1,0x0 -0x1,0x1,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x3,0x3b453509cb62c429d8a86ea1cf46897,0x1,0x0 -0x1,0x1,0x25,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xfc8f75a5184afbfee72be2a8ac39ab6,0x1,0x0 -0x1,0x1,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x258732ffd31c5ae816e163e3458108dd,0x1,0x0 -0x1,0x1,0x27,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x99caaa2e258abab37bb4b1e675e792b4,0x1,0x0 -0x1,0x1,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x8dc4617a012a931507f27b285f48a99,0x1,0x0 -0x1,0x1,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2c0cc58a0906a3a6ef6e5378a04addf2,0x1,0x0 -0x1,0x1,0x2a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x185514250c1eaff2fdc813fd31c55772,0x1,0x0 -0x1,0x1,0x2b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x81316979a26c9fdb191f6abac2a0bcf2,0x1,0x0 -0x1,0x1,0x2c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x26a52e43327b03b40c3b36854698ed02,0x1,0x0 -0x1,0x1,0x2d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x572116a2bc8995a07550a2c11b3f1bb3,0x1,0x0 -0x1,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x22a813b81101fa27e07888a4c1ee151b,0x1,0x0 -0x1,0x1,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xd5c7de0e174ce72545ed2796a057e0f5,0x1,0x0 -0x1,0x1,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1755fc232224e41b6b375a49c842eed,0x1,0x0 -0x1,0x1,0x31,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xe4e0cf3cce99d1664c5e8489205e9461,0x1,0x0 -0x1,0x1,0x32,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2b80c453b72e713a9ee7304f7c598ebe,0x1,0x0 -0x1,0x1,0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xe28aeb3c386d4c2dfe575197636a578b,0x1,0x0 -0x1,0x1,0x34,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x225235e07cb0c897a4d26f2f76019f3,0x1,0x0 -0x1,0x1,0x35,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xec0c5349a3d4d57e9ab9e9b48f3ba9b3,0x1,0x0 -0x1,0x1,0x36,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2864b7882cf2e11ed3bffbff7cb788ca,0x1,0x0 -0x1,0x1,0x37,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x30f1e0743e45d9900320f9e6890f6817,0x1,0x0 -0x1,0x1,0x38,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x29293f07fccd8ac29bf0501e823696f,0x1,0x0 -0x1,0x1,0x39,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x71ba1b75f369441cf66cb0c6d8127ad0,0x1,0x0 -0x1,0x1,0x3a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x15d7ace2db3651ba26cc0852ffa53be9,0x1,0x0 -0x1,0x1,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x40a41876d29c7d3d9efea184a2f58712,0x1,0x0 -0x1,0x1,0x3c,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x3b453509cb62c429d8a86ea1cf46897,0x1,0x0 -0x1,0x1,0x3d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xfc8f75a5184afbfee72be2a8ac39ab6,0x1,0x0 -0x1,0x1,0x3e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x258732ffd31c5ae816e163e3458108dd,0x1,0x0 -0x1,0x1,0x3f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x99caaa2e258abab37bb4b1e675e792b4,0x1,0x0 -0x1,0x1,0x40,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x8dc4617a012a931507f27b285f48a99,0x1,0x0 -0x1,0x1,0x41,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2c0cc58a0906a3a6ef6e5378a04addf2,0x1,0x0 -0x1,0x1,0x42,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x185514250c1eaff2fdc813fd31c55772,0x1,0x0 -0x1,0x1,0x43,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x81316979a26c9fdb191f6abac2a0bcf2,0x1,0x0 -0x1,0x1,0x44,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x26a52e43327b03b40c3b36854698ed02,0x1,0x0 -0x1,0x1,0x45,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x572116a2bc8995a07550a2c11b3f1bb3,0x1,0x0 -0x1,0x1,0x46,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x22a813b81101fa27e07888a4c1ee151b,0x1,0x0 -0x1,0x1,0x47,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xd5c7de0e174ce72545ed2796a057e0f5,0x1,0x0 -0x1,0x1,0x48,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1755fc232224e41b6b375a49c842eed,0x1,0x0 -0x1,0x1,0x49,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xe4e0cf3cce99d1664c5e8489205e9461,0x1,0x0 -0x1,0x1,0x4a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2b80c453b72e713a9ee7304f7c598ebe,0x1,0x0 -0x1,0x1,0x4b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xe28aeb3c386d4c2dfe575197636a578b,0x1,0x0 -0x1,0x1,0x4c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x225235e07cb0c897a4d26f2f76019f3,0x1,0x0 -0x1,0x1,0x4d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xec0c5349a3d4d57e9ab9e9b48f3ba9b3,0x1,0x0 -0x1,0x1,0x4e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2864b7882cf2e11ed3bffbff7cb788ca,0x1,0x0 -0x1,0x1,0x4f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x30f1e0743e45d9900320f9e6890f6817,0x1,0x0 -0x1,0x1,0x50,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x29293f07fccd8ac29bf0501e823696f,0x1,0x0 -0x1,0x1,0x51,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x71ba1b75f369441cf66cb0c6d8127ad0,0x1,0x0 -0x1,0x1,0x52,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x15d7ace2db3651ba26cc0852ffa53be9,0x1,0x0 -0x1,0x1,0x53,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x40a41876d29c7d3d9efea184a2f58712,0x1,0x0 -0x1,0x1,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x1f5ca3dcd416ce988b93b505e473fbc8,0x1,0x0 -0x1,0x1,0x55,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0xa510b9a25ba4af91a01cbf2d66496ba7,0x1,0x0 -0x1,0x1,0x56,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x2ab07af451260653f5d92e48135636fe,0x1,0x0 -0x1,0x1,0x57,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x6e69bfad773e8c1806b4e4bb128048f9,0x1,0x0 -0x1,0x1,0x58,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x1e311797d9d7b0c3b1658f72e16632e3,0x1,0x0 -0x1,0x1,0x59,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x927ad04f742ded7fe801e8df6e137325,0x1,0x0 -0x1,0x1,0x5a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x1d0510803ef7512c7915a6879d460c72,0x1,0x0 -0x1,0x1,0x5b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x27480a98574d5d306828694e1640ec2b,0x1,0x0 -0x1,0x1,0x5c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0xbb8fd9936c7a8c8f4a3d9ce97735df5,0x1,0x0 -0x1,0x1,0x5d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x41af0c73696dff5f92c6eb248f949a18,0x1,0x0 -0x1,0x1,0x5e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x15f8308390c00f0a0e1ebcd08626f1ec,0x1,0x0 -0x1,0x1,0x5f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x57a14cac88cd49f9d0e3caaa20ce36e9,0x1,0x0 -0x1,0x1,0x60,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x2,0x3,0x152e268cc785bd6c948a88b3091ef9a3,0x1,0x0 -0x1,0x1,0x61,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x708426323c268b89b2a5e02478ccdda6,0x1,0x0 -0x1,0x1,0x62,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x2f6d0a4127a8a6f986490f9f8322397c,0x1,0x0 -0x1,0x1,0x63,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x82c9cdc9f0d6ec378eda15ec3dc78b6f,0x1,0x0 -0x1,0x1,0x64,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x21da9702fb1d05b6c0a1007d0b9c160e,0x1,0x0 -0x1,0x1,0x65,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x9d8d0a02fedddd4bce9598f5787c284,0x1,0x0 -0x1,0x1,0x66,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x2b46be639fc122126b7e0efbc5398fe8,0x1,0x0 -0x1,0x1,0x67,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x67d9dd3ecc9160db686aaed5bbbd2cbc,0x1,0x0 -0x1,0x1,0x68,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x20d3e1ac646cf95fbf02ad4589eb173d,0x1,0x0 -0x1,0x1,0x69,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x8501b392226c7a7e7818b5781887ef0e,0x1,0x0 -0x1,0x1,0x6a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xcb19e117479b79a6b64d592612adf5d,0x1,0x0 -0x1,0x1,0x6b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xaacf84e0e323906338a778d53c6d57d2,0x1,0x0 -0x1,0x1,0x6c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x1dd39eb06e7c88b5e3fea51f0bcefc0d,0x1,0x0 -0x1,0x1,0x6d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xb11c23cd9f2f7108861555162026536d,0x1,0x0 -0x1,0x1,0x6e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x290860069e0d24d4363147d4f3d6760a,0x1,0x0 -0x1,0x1,0x6f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x4fb8917396a450547f84fb7e70c9999f,0x1,0x0 -0x1,0x1,0x70,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x2ca828fba83798a17db205631e9903d,0x1,0x0 -0x1,0x1,0x71,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xe19924a9209f0fe7c06025b0851fbfe9,0x1,0x0 -0x1,0x1,0x72,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x6f263094fe06ea7acc71974bc64d7dd,0x1,0x0 -0x1,0x1,0x73,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xf167b0ea71dc77d57f39fd46d42db5e4,0x1,0x0 -0x1,0x1,0x74,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x12809c90c9533ba0d7159a9631812b01,0x1,0x0 -0x1,0x1,0x75,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xef3180f718d6e3693eeaf24f05ff6804,0x1,0x0 -0x1,0x1,0x76,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x1821399d4a5711ca9d4e6b605b0c6ff2,0x1,0x0 -0x1,0x1,0x77,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x89ca237ebf99d460e8d0a9301e74a664,0x1,0x0 -0x1,0x1,0x78,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x152e268cc785bd6c948a88b3091ef9a3,0x0,0x1 -0x1,0x1,0x79,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x708426323c268b89b2a5e02478ccdda6,0x0,0x1 -0x1,0x1,0x7a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x2f6d0a4127a8a6f986490f9f8322397c,0x0,0x1 -0x1,0x1,0x7b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x82c9cdc9f0d6ec378eda15ec3dc78b6f,0x0,0x1 -0x1,0x1,0x7c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x21da9702fb1d05b6c0a1007d0b9c160e,0x0,0x1 -0x1,0x1,0x7d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x9d8d0a02fedddd4bce9598f5787c284,0x0,0x1 -0x1,0x1,0x7e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x2b46be639fc122126b7e0efbc5398fe8,0x0,0x1 -0x1,0x1,0x7f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x67d9dd3ecc9160db686aaed5bbbd2cbc,0x0,0x1 -0x1,0x1,0x80,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x20d3e1ac646cf95fbf02ad4589eb173d,0x0,0x1 -0x1,0x1,0x81,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x8501b392226c7a7e7818b5781887ef0e,0x0,0x1 -0x1,0x1,0x82,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xcb19e117479b79a6b64d592612adf5d,0x0,0x1 -0x1,0x1,0x83,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xaacf84e0e323906338a778d53c6d57d2,0x0,0x1 -0x1,0x1,0x84,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x1dd39eb06e7c88b5e3fea51f0bcefc0d,0x0,0x1 -0x1,0x1,0x85,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xb11c23cd9f2f7108861555162026536d,0x0,0x1 -0x1,0x1,0x86,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x290860069e0d24d4363147d4f3d6760a,0x0,0x1 -0x1,0x1,0x87,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x4fb8917396a450547f84fb7e70c9999f,0x0,0x1 -0x1,0x1,0x88,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x2ca828fba83798a17db205631e9903d,0x0,0x1 -0x1,0x1,0x89,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xe19924a9209f0fe7c06025b0851fbfe9,0x0,0x1 -0x1,0x1,0x8a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x6f263094fe06ea7acc71974bc64d7dd,0x0,0x1 -0x1,0x1,0x8b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xf167b0ea71dc77d57f39fd46d42db5e4,0x0,0x1 -0x1,0x1,0x8c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x12809c90c9533ba0d7159a9631812b01,0x0,0x1 -0x1,0x1,0x8d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xef3180f718d6e3693eeaf24f05ff6804,0x0,0x1 -0x1,0x1,0x8e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x1821399d4a5711ca9d4e6b605b0c6ff2,0x0,0x1 -0x1,0x1,0x8f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x89ca237ebf99d460e8d0a9301e74a664,0x0,0x1 -0x1,0x1,0x90,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xc8671a7e8f372087c46b7b82c53c183,0x0,0x1 -0x1,0x1,0x91,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xd09453270e38045cb7372662d4716f8d,0x0,0x1 -0x1,0x1,0x92,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x20dd05e87836797d4507cc8917ed1079,0x0,0x1 -0x1,0x1,0x93,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xa10fe34dc7536969843e4cbe868a64ac,0x0,0x1 -0x1,0x1,0x94,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x24e48d89873ad5ebcf0f7022c01020b5,0x0,0x1 -0x1,0x1,0x95,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x10458a3dfc798231e6b5d5f17c8c9e1c,0x0,0x1 -0x1,0x1,0x96,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x2f3ba4b3c58fd37398ceef826e29c853,0x0,0x1 -0x1,0x1,0x97,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x7048f7fec19180f89f4961bf0b00e9c1,0x0,0x1 -0x1,0x1,0x98,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x2ed87dc23279bee95b8caada387b5f5e,0x0,0x1 -0x1,0x1,0x99,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x4fdd666fda2df2aac57457ecfb62014,0x0,0x1 -0x1,0x1,0x9a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x1b77c09a4389d4d50e5b78a8dca80583,0x0,0x1 -0x1,0x1,0x9b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x1056618bfe329ac4dcc8ee73ec818284,0x0,0x1 -0x1,0x1,0x9c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x3,0x0,0x0,0x1 -0x1,0x1,0x9d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x3,0x1,0x0,0x1 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_0,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_1,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_2,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_3,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_4,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_5,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_6,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_7,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT +0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x1,0x0 +0x1,0x1,0x2,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x3,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x4,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x5,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x6,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x7,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x8,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x9,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xa,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xb,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xc,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xd,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xe,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xf,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x10,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x11,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x12,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x13,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x14,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x15,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x16,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x17,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x100f,0xb200,0x6c3a,0x4409,0xce06,0xf6c2,0xd535,0x564c,0x1,0x0 +0x1,0x1,0x19,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x92e5,0x92ae,0xb426,0xd6c0,0x35bb,0x8c0a,0x5020,0x2e6d,0x1,0x0 +0x1,0x1,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x1275,0x9641,0x41a9,0x0f31,0x7059,0x2ade,0x8217,0x4d09,0x1,0x0 +0x1,0x1,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xde3c,0xc7f5,0xb79f,0x260f,0x51c1,0x43e3,0x268b,0xa06d,0x1,0x0 +0x1,0x1,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x2e60,0x7689,0xd116,0x1c5c,0xb3d6,0xed87,0x0a5b,0x6f47,0x1,0x0 +0x1,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xb196,0x27c2,0xc51d,0x3d2e,0xb72f,0x81c5,0x40ff,0x9f9d,0x1,0x0 +0x1,0x1,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x09d2,0xb2eb,0x3993,0x26d9,0xcc55,0x2e97,0x53af,0xaeab,0x1,0x0 +0x1,0x1,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0xbb29,0x985d,0xef8b,0x5800,0xf321,0x4522,0x3ff6,0x1d48,0x1,0x0 +0x1,0x1,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x03a5,0x9070,0x84b1,0xf9ee,0x93a1,0xfa01,0x1b31,0xb383,0x1,0x0 +0x1,0x1,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x60b7,0xd50b,0x789f,0xbe32,0xd373,0x3176,0xffd9,0xd46a,0x1,0x0 +0x1,0x1,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x2e8b,0x82b3,0x5061,0x25e8,0xb67b,0xb867,0x604a,0x8892,0x1,0x0 +0x1,0x1,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x7b96,0x95a8,0xd131,0x6275,0x03a0,0xf63b,0xfe5d,0x0cca,0x1,0x0 +0x1,0x1,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x3,0x03b4,0x5350,0x9cb6,0x2c42,0x9d8a,0x86ea,0x1cf4,0x6897,0x1,0x0 +0x1,0x1,0x25,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x0fc8,0xf75a,0x5184,0xafbf,0xee72,0xbe2a,0x8ac3,0x9ab6,0x1,0x0 +0x1,0x1,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2587,0x32ff,0xd31c,0x5ae8,0x16e1,0x63e3,0x4581,0x08dd,0x1,0x0 +0x1,0x1,0x27,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x99ca,0xaa2e,0x258a,0xbab3,0x7bb4,0xb1e6,0x75e7,0x92b4,0x1,0x0 +0x1,0x1,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x08dc,0x4617,0xa012,0xa931,0x507f,0x27b2,0x85f4,0x8a99,0x1,0x0 +0x1,0x1,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2c0c,0xc58a,0x0906,0xa3a6,0xef6e,0x5378,0xa04a,0xddf2,0x1,0x0 +0x1,0x1,0x2a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x1855,0x1425,0x0c1e,0xaff2,0xfdc8,0x13fd,0x31c5,0x5772,0x1,0x0 +0x1,0x1,0x2b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x8131,0x6979,0xa26c,0x9fdb,0x191f,0x6aba,0xc2a0,0xbcf2,0x1,0x0 +0x1,0x1,0x2c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x26a5,0x2e43,0x327b,0x03b4,0x0c3b,0x3685,0x4698,0xed02,0x1,0x0 +0x1,0x1,0x2d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x5721,0x16a2,0xbc89,0x95a0,0x7550,0xa2c1,0x1b3f,0x1bb3,0x1,0x0 +0x1,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x22a8,0x13b8,0x1101,0xfa27,0xe078,0x88a4,0xc1ee,0x151b,0x1,0x0 +0x1,0x1,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xd5c7,0xde0e,0x174c,0xe725,0x45ed,0x2796,0xa057,0xe0f5,0x1,0x0 +0x1,0x1,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x0175,0x5fc2,0x3222,0x4e41,0xb6b3,0x75a4,0x9c84,0x2eed,0x1,0x0 +0x1,0x1,0x31,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xe4e0,0xcf3c,0xce99,0xd166,0x4c5e,0x8489,0x205e,0x9461,0x1,0x0 +0x1,0x1,0x32,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2b80,0xc453,0xb72e,0x713a,0x9ee7,0x304f,0x7c59,0x8ebe,0x1,0x0 +0x1,0x1,0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xe28a,0xeb3c,0x386d,0x4c2d,0xfe57,0x5197,0x636a,0x578b,0x1,0x0 +0x1,0x1,0x34,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x0225,0x235e,0x07cb,0x0c89,0x7a4d,0x26f2,0xf760,0x19f3,0x1,0x0 +0x1,0x1,0x35,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0xec0c,0x5349,0xa3d4,0xd57e,0x9ab9,0xe9b4,0x8f3b,0xa9b3,0x1,0x0 +0x1,0x1,0x36,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x2864,0xb788,0x2cf2,0xe11e,0xd3bf,0xfbff,0x7cb7,0x88ca,0x1,0x0 +0x1,0x1,0x37,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x30f1,0xe074,0x3e45,0xd990,0x0320,0xf9e6,0x890f,0x6817,0x1,0x0 +0x1,0x1,0x38,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x0292,0x93f0,0x7fcc,0xd8ac,0x29bf,0x0501,0xe823,0x696f,0x1,0x0 +0x1,0x1,0x39,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x71ba,0x1b75,0xf369,0x441c,0xf66c,0xb0c6,0xd812,0x7ad0,0x1,0x0 +0x1,0x1,0x3a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x15d7,0xace2,0xdb36,0x51ba,0x26cc,0x0852,0xffa5,0x3be9,0x1,0x0 +0x1,0x1,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x3,0x40a4,0x1876,0xd29c,0x7d3d,0x9efe,0xa184,0xa2f5,0x8712,0x1,0x0 +0x1,0x1,0x3c,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x03b4,0x5350,0x9cb6,0x2c42,0x9d8a,0x86ea,0x1cf4,0x6897,0x1,0x0 +0x1,0x1,0x3d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x0fc8,0xf75a,0x5184,0xafbf,0xee72,0xbe2a,0x8ac3,0x9ab6,0x1,0x0 +0x1,0x1,0x3e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2587,0x32ff,0xd31c,0x5ae8,0x16e1,0x63e3,0x4581,0x08dd,0x1,0x0 +0x1,0x1,0x3f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x99ca,0xaa2e,0x258a,0xbab3,0x7bb4,0xb1e6,0x75e7,0x92b4,0x1,0x0 +0x1,0x1,0x40,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x08dc,0x4617,0xa012,0xa931,0x507f,0x27b2,0x85f4,0x8a99,0x1,0x0 +0x1,0x1,0x41,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2c0c,0xc58a,0x0906,0xa3a6,0xef6e,0x5378,0xa04a,0xddf2,0x1,0x0 +0x1,0x1,0x42,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x1855,0x1425,0x0c1e,0xaff2,0xfdc8,0x13fd,0x31c5,0x5772,0x1,0x0 +0x1,0x1,0x43,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x8131,0x6979,0xa26c,0x9fdb,0x191f,0x6aba,0xc2a0,0xbcf2,0x1,0x0 +0x1,0x1,0x44,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x26a5,0x2e43,0x327b,0x03b4,0x0c3b,0x3685,0x4698,0xed02,0x1,0x0 +0x1,0x1,0x45,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x5721,0x16a2,0xbc89,0x95a0,0x7550,0xa2c1,0x1b3f,0x1bb3,0x1,0x0 +0x1,0x1,0x46,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x22a8,0x13b8,0x1101,0xfa27,0xe078,0x88a4,0xc1ee,0x151b,0x1,0x0 +0x1,0x1,0x47,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xd5c7,0xde0e,0x174c,0xe725,0x45ed,0x2796,0xa057,0xe0f5,0x1,0x0 +0x1,0x1,0x48,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x0175,0x5fc2,0x3222,0x4e41,0xb6b3,0x75a4,0x9c84,0x2eed,0x1,0x0 +0x1,0x1,0x49,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xe4e0,0xcf3c,0xce99,0xd166,0x4c5e,0x8489,0x205e,0x9461,0x1,0x0 +0x1,0x1,0x4a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2b80,0xc453,0xb72e,0x713a,0x9ee7,0x304f,0x7c59,0x8ebe,0x1,0x0 +0x1,0x1,0x4b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xe28a,0xeb3c,0x386d,0x4c2d,0xfe57,0x5197,0x636a,0x578b,0x1,0x0 +0x1,0x1,0x4c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x0225,0x235e,0x07cb,0x0c89,0x7a4d,0x26f2,0xf760,0x19f3,0x1,0x0 +0x1,0x1,0x4d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0xec0c,0x5349,0xa3d4,0xd57e,0x9ab9,0xe9b4,0x8f3b,0xa9b3,0x1,0x0 +0x1,0x1,0x4e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x2864,0xb788,0x2cf2,0xe11e,0xd3bf,0xfbff,0x7cb7,0x88ca,0x1,0x0 +0x1,0x1,0x4f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x30f1,0xe074,0x3e45,0xd990,0x0320,0xf9e6,0x890f,0x6817,0x1,0x0 +0x1,0x1,0x50,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x0292,0x93f0,0x7fcc,0xd8ac,0x29bf,0x0501,0xe823,0x696f,0x1,0x0 +0x1,0x1,0x51,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x71ba,0x1b75,0xf369,0x441c,0xf66c,0xb0c6,0xd812,0x7ad0,0x1,0x0 +0x1,0x1,0x52,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x15d7,0xace2,0xdb36,0x51ba,0x26cc,0x0852,0xffa5,0x3be9,0x1,0x0 +0x1,0x1,0x53,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x3,0x40a4,0x1876,0xd29c,0x7d3d,0x9efe,0xa184,0xa2f5,0x8712,0x1,0x0 +0x1,0x1,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x1f5c,0xa3dc,0xd416,0xce98,0x8b93,0xb505,0xe473,0xfbc8,0x1,0x0 +0x1,0x1,0x55,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0xa510,0xb9a2,0x5ba4,0xaf91,0xa01c,0xbf2d,0x6649,0x6ba7,0x1,0x0 +0x1,0x1,0x56,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x2ab0,0x7af4,0x5126,0x0653,0xf5d9,0x2e48,0x1356,0x36fe,0x1,0x0 +0x1,0x1,0x57,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x6e69,0xbfad,0x773e,0x8c18,0x06b4,0xe4bb,0x1280,0x48f9,0x1,0x0 +0x1,0x1,0x58,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x1e31,0x1797,0xd9d7,0xb0c3,0xb165,0x8f72,0xe166,0x32e3,0x1,0x0 +0x1,0x1,0x59,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x927a,0xd04f,0x742d,0xed7f,0xe801,0xe8df,0x6e13,0x7325,0x1,0x0 +0x1,0x1,0x5a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x1d05,0x1080,0x3ef7,0x512c,0x7915,0xa687,0x9d46,0x0c72,0x1,0x0 +0x1,0x1,0x5b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x2748,0x0a98,0x574d,0x5d30,0x6828,0x694e,0x1640,0xec2b,0x1,0x0 +0x1,0x1,0x5c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x0bb8,0xfd99,0x36c7,0xa8c8,0xf4a3,0xd9ce,0x9773,0x5df5,0x1,0x0 +0x1,0x1,0x5d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x41af,0x0c73,0x696d,0xff5f,0x92c6,0xeb24,0x8f94,0x9a18,0x1,0x0 +0x1,0x1,0x5e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x15f8,0x3083,0x90c0,0x0f0a,0x0e1e,0xbcd0,0x8626,0xf1ec,0x1,0x0 +0x1,0x1,0x5f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x3,0x57a1,0x4cac,0x88cd,0x49f9,0xd0e3,0xcaaa,0x20ce,0x36e9,0x1,0x0 +0x1,0x1,0x60,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x2,0x3,0x152e,0x268c,0xc785,0xbd6c,0x948a,0x88b3,0x091e,0xf9a3,0x1,0x0 +0x1,0x1,0x61,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x7084,0x2632,0x3c26,0x8b89,0xb2a5,0xe024,0x78cc,0xdda6,0x1,0x0 +0x1,0x1,0x62,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x2f6d,0x0a41,0x27a8,0xa6f9,0x8649,0x0f9f,0x8322,0x397c,0x1,0x0 +0x1,0x1,0x63,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x82c9,0xcdc9,0xf0d6,0xec37,0x8eda,0x15ec,0x3dc7,0x8b6f,0x1,0x0 +0x1,0x1,0x64,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x21da,0x9702,0xfb1d,0x05b6,0xc0a1,0x007d,0x0b9c,0x160e,0x1,0x0 +0x1,0x1,0x65,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x09d8,0xd0a0,0x2fed,0xddd4,0xbce9,0x598f,0x5787,0xc284,0x1,0x0 +0x1,0x1,0x66,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x2b46,0xbe63,0x9fc1,0x2212,0x6b7e,0x0efb,0xc539,0x8fe8,0x1,0x0 +0x1,0x1,0x67,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x67d9,0xdd3e,0xcc91,0x60db,0x686a,0xaed5,0xbbbd,0x2cbc,0x1,0x0 +0x1,0x1,0x68,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x20d3,0xe1ac,0x646c,0xf95f,0xbf02,0xad45,0x89eb,0x173d,0x1,0x0 +0x1,0x1,0x69,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x8501,0xb392,0x226c,0x7a7e,0x7818,0xb578,0x1887,0xef0e,0x1,0x0 +0x1,0x1,0x6a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x0cb1,0x9e11,0x7479,0xb79a,0x6b64,0xd592,0x612a,0xdf5d,0x1,0x0 +0x1,0x1,0x6b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xaacf,0x84e0,0xe323,0x9063,0x38a7,0x78d5,0x3c6d,0x57d2,0x1,0x0 +0x1,0x1,0x6c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x1dd3,0x9eb0,0x6e7c,0x88b5,0xe3fe,0xa51f,0x0bce,0xfc0d,0x1,0x0 +0x1,0x1,0x6d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xb11c,0x23cd,0x9f2f,0x7108,0x8615,0x5516,0x2026,0x536d,0x1,0x0 +0x1,0x1,0x6e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x2908,0x6006,0x9e0d,0x24d4,0x3631,0x47d4,0xf3d6,0x760a,0x1,0x0 +0x1,0x1,0x6f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x4fb8,0x9173,0x96a4,0x5054,0x7f84,0xfb7e,0x70c9,0x999f,0x1,0x0 +0x1,0x1,0x70,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x02ca,0x828f,0xba83,0x798a,0x17db,0x2056,0x31e9,0x903d,0x1,0x0 +0x1,0x1,0x71,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xe199,0x24a9,0x209f,0x0fe7,0xc060,0x25b0,0x851f,0xbfe9,0x1,0x0 +0x1,0x1,0x72,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x06f2,0x6309,0x4fe0,0x6ea7,0xacc7,0x1974,0xbc64,0xd7dd,0x1,0x0 +0x1,0x1,0x73,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xf167,0xb0ea,0x71dc,0x77d5,0x7f39,0xfd46,0xd42d,0xb5e4,0x1,0x0 +0x1,0x1,0x74,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x1280,0x9c90,0xc953,0x3ba0,0xd715,0x9a96,0x3181,0x2b01,0x1,0x0 +0x1,0x1,0x75,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0xef31,0x80f7,0x18d6,0xe369,0x3eea,0xf24f,0x05ff,0x6804,0x1,0x0 +0x1,0x1,0x76,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x1821,0x399d,0x4a57,0x11ca,0x9d4e,0x6b60,0x5b0c,0x6ff2,0x1,0x0 +0x1,0x1,0x77,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x3,0x89ca,0x237e,0xbf99,0xd460,0xe8d0,0xa930,0x1e74,0xa664,0x1,0x0 +0x1,0x1,0x78,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x152e,0x268c,0xc785,0xbd6c,0x948a,0x88b3,0x091e,0xf9a3,0x0,0x1 +0x1,0x1,0x79,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x7084,0x2632,0x3c26,0x8b89,0xb2a5,0xe024,0x78cc,0xdda6,0x0,0x1 +0x1,0x1,0x7a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x2f6d,0x0a41,0x27a8,0xa6f9,0x8649,0x0f9f,0x8322,0x397c,0x0,0x1 +0x1,0x1,0x7b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x82c9,0xcdc9,0xf0d6,0xec37,0x8eda,0x15ec,0x3dc7,0x8b6f,0x0,0x1 +0x1,0x1,0x7c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x21da,0x9702,0xfb1d,0x05b6,0xc0a1,0x007d,0x0b9c,0x160e,0x0,0x1 +0x1,0x1,0x7d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x09d8,0xd0a0,0x2fed,0xddd4,0xbce9,0x598f,0x5787,0xc284,0x0,0x1 +0x1,0x1,0x7e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x2b46,0xbe63,0x9fc1,0x2212,0x6b7e,0x0efb,0xc539,0x8fe8,0x0,0x1 +0x1,0x1,0x7f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x67d9,0xdd3e,0xcc91,0x60db,0x686a,0xaed5,0xbbbd,0x2cbc,0x0,0x1 +0x1,0x1,0x80,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x20d3,0xe1ac,0x646c,0xf95f,0xbf02,0xad45,0x89eb,0x173d,0x0,0x1 +0x1,0x1,0x81,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x8501,0xb392,0x226c,0x7a7e,0x7818,0xb578,0x1887,0xef0e,0x0,0x1 +0x1,0x1,0x82,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x0cb1,0x9e11,0x7479,0xb79a,0x6b64,0xd592,0x612a,0xdf5d,0x0,0x1 +0x1,0x1,0x83,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xaacf,0x84e0,0xe323,0x9063,0x38a7,0x78d5,0x3c6d,0x57d2,0x0,0x1 +0x1,0x1,0x84,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x1dd3,0x9eb0,0x6e7c,0x88b5,0xe3fe,0xa51f,0x0bce,0xfc0d,0x0,0x1 +0x1,0x1,0x85,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xb11c,0x23cd,0x9f2f,0x7108,0x8615,0x5516,0x2026,0x536d,0x0,0x1 +0x1,0x1,0x86,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x2908,0x6006,0x9e0d,0x24d4,0x3631,0x47d4,0xf3d6,0x760a,0x0,0x1 +0x1,0x1,0x87,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x4fb8,0x9173,0x96a4,0x5054,0x7f84,0xfb7e,0x70c9,0x999f,0x0,0x1 +0x1,0x1,0x88,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x02ca,0x828f,0xba83,0x798a,0x17db,0x2056,0x31e9,0x903d,0x0,0x1 +0x1,0x1,0x89,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xe199,0x24a9,0x209f,0x0fe7,0xc060,0x25b0,0x851f,0xbfe9,0x0,0x1 +0x1,0x1,0x8a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x06f2,0x6309,0x4fe0,0x6ea7,0xacc7,0x1974,0xbc64,0xd7dd,0x0,0x1 +0x1,0x1,0x8b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xf167,0xb0ea,0x71dc,0x77d5,0x7f39,0xfd46,0xd42d,0xb5e4,0x0,0x1 +0x1,0x1,0x8c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x1280,0x9c90,0xc953,0x3ba0,0xd715,0x9a96,0x3181,0x2b01,0x0,0x1 +0x1,0x1,0x8d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0xef31,0x80f7,0x18d6,0xe369,0x3eea,0xf24f,0x05ff,0x6804,0x0,0x1 +0x1,0x1,0x8e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x1821,0x399d,0x4a57,0x11ca,0x9d4e,0x6b60,0x5b0c,0x6ff2,0x0,0x1 +0x1,0x1,0x8f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x3,0x3,0x89ca,0x237e,0xbf99,0xd460,0xe8d0,0xa930,0x1e74,0xa664,0x0,0x1 +0x1,0x1,0x90,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x0c86,0x71a7,0xe8f3,0x7208,0x7c46,0xb7b8,0x2c53,0xc183,0x0,0x1 +0x1,0x1,0x91,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xd094,0x5327,0x0e38,0x045c,0xb737,0x2662,0xd471,0x6f8d,0x0,0x1 +0x1,0x1,0x92,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x20dd,0x05e8,0x7836,0x797d,0x4507,0xcc89,0x17ed,0x1079,0x0,0x1 +0x1,0x1,0x93,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0xa10f,0xe34d,0xc753,0x6969,0x843e,0x4cbe,0x868a,0x64ac,0x0,0x1 +0x1,0x1,0x94,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x24e4,0x8d89,0x873a,0xd5eb,0xcf0f,0x7022,0xc010,0x20b5,0x0,0x1 +0x1,0x1,0x95,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x1045,0x8a3d,0xfc79,0x8231,0xe6b5,0xd5f1,0x7c8c,0x9e1c,0x0,0x1 +0x1,0x1,0x96,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x2f3b,0xa4b3,0xc58f,0xd373,0x98ce,0xef82,0x6e29,0xc853,0x0,0x1 +0x1,0x1,0x97,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x7048,0xf7fe,0xc191,0x80f8,0x9f49,0x61bf,0x0b00,0xe9c1,0x0,0x1 +0x1,0x1,0x98,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x2ed8,0x7dc2,0x3279,0xbee9,0x5b8c,0xaada,0x387b,0x5f5e,0x0,0x1 +0x1,0x1,0x99,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x04fd,0xd666,0xfda2,0xdf2a,0xac57,0x457e,0xcfb6,0x2014,0x0,0x1 +0x1,0x1,0x9a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x1b77,0xc09a,0x4389,0xd4d5,0x0e5b,0x78a8,0xdca8,0x0583,0x0,0x1 +0x1,0x1,0x9b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x3,0x1056,0x618b,0xfe32,0x9ac4,0xdcc8,0xee73,0xec81,0x8284,0x0,0x1 +0x1,0x1,0x9c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x1,0x1,0x9d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0,0x1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_two_pairings_input.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_two_pairings_input.csv index 3c66b1e07da..f6aea7d1e7a 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_two_pairings_input.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_two_pairings_input.csv @@ -1,53 +1,53 @@ -ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_LIMB,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES -0,1,0,0,1,2,0x13364879816394e38a2d72bde23bda93,1,1,0 -0,1,0,1,1,2,0xcd39885c6bfdedbc45e6bafcfc8fa685,1,1,0 -0,1,0,2,1,2,0x0e0e4c9d03746d287b341d52461946a1,1,1,0 -0,1,0,3,1,2,0xc865002c35ba9bd6b789fc26a526d121,1,1,0 -0,1,0,4,1,2,0x0e82be8514331e947408a3a27a54d580,1,1,0 -0,1,0,5,1,2,0x9866db37d74db5abc7de8f0d3d0f7ee3,1,1,0 -0,1,0,6,1,2,0x0f89c9a7bb2eb9418d2d89310306196d,1,1,0 -0,1,0,7,1,2,0xf1ae8d9de0173f3e1151487bb5157cd7,1,1,0 -0,1,0,8,1,2,0x10b30b9925aace81dcec2ccce77c3eea,1,1,0 -0,1,0,9,1,2,0xa949c366d7cd71a6a6748bcdd996b762,1,1,0 -0,1,0,10,1,2,0x11497987c563ade267b3bdfcc9c04022,1,1,0 -0,1,0,11,1,2,0x3e25664c3bcdd28858b1daa7ac249034,1,1,0 -0,1,0,12,2,2,0x0b9624a62e115247146d4643e8d4daf0,1,1,0 -0,1,0,13,2,2,0x7ff180000fcf9f02c84cc5692b2c0526,1,1,0 -0,1,0,14,2,2,0x1cb9908c06bf3099f1538277102b31e3,1,1,0 -0,1,0,15,2,2,0x1d022dc64770bc130df14daef72830e4,1,1,0 -0,1,0,16,2,2,0x2977858b214a3cb43fa4024976dd1675,1,1,0 -0,1,0,17,2,2,0x9b1bf5367e6318da3545e697b9931671,1,1,0 -0,1,0,18,2,2,0x06fcfd4b9ca03fb145ff273e480efda3,1,1,0 -0,1,0,19,2,2,0xc8a7aef64882efcbd8920b4458e1ef3d,1,1,0 -0,1,0,20,2,2,0x281508326108309778f9cdf9c39a4c4d,1,1,0 -0,1,0,21,2,2,0xc90a405c0cfbfd5d20fec4e47acce66f,1,1,0 -0,1,0,22,2,2,0x10d24b6f0b87c1e3f78b80b967bac765,1,1,0 -0,1,0,23,2,2,0x763f38c53a4377e9a97e2761758a92f1,1,1,0 -0,1,0,0,0,2,0x0,1,0,1 -0,1,0,1,0,2,0x1,1,0,1 -1,1,0,0,1,2,0x0b9624a62e115247146d4643e8d4daf0,1,1,0 -1,1,0,1,1,2,0x7ff180000fcf9f02c84cc5692b2c0526,1,1,0 -1,1,0,2,1,2,0x13aabde6da726f8fc6fcc33f7156267a,1,1,0 -1,1,0,3,1,2,0x7a7f3ccb21010e7a2e2f3e67e154cc63,1,1,0 -1,1,0,4,1,2,0x0e82be8514331e947408a3a27a54d580,1,1,0 -1,1,0,5,1,2,0x9866db37d74db5abc7de8f0d3d0f7ee3,1,1,0 -1,1,0,6,1,2,0x0f89c9a7bb2eb9418d2d89310306196d,1,1,0 -1,1,0,7,1,2,0xf1ae8d9de0173f3e1151487bb5157cd7,1,1,0 -1,1,0,8,1,2,0x10b30b9925aace81dcec2ccce77c3eea,1,1,0 -1,1,0,9,1,2,0xa949c366d7cd71a6a6748bcdd996b762,1,1,0 -1,1,0,10,1,2,0x11497987c563ade267b3bdfcc9c04022,1,1,0 -1,1,0,11,1,2,0x3e25664c3bcdd28858b1daa7ac249034,1,1,0 -1,1,0,12,2,2,0x0b9624a62e115247146d4643e8d4daf0,1,1,0 -1,1,0,13,2,2,0x7ff180000fcf9f02c84cc5692b2c0526,1,1,0 -1,1,0,14,2,2,0x1cb9908c06bf3099f1538277102b31e3,1,1,0 -1,1,0,15,2,2,0x1d022dc64770bc130df14daef72830e4,1,1,0 -1,1,0,16,2,2,0x0e82be8514331e947408a3a27a54d580,1,1,0 -1,1,0,17,2,2,0x9866db37d74db5abc7de8f0d3d0f7ee3,1,1,0 -1,1,0,18,2,2,0x0f89c9a7bb2eb9418d2d89310306196d,1,1,0 -1,1,0,19,2,2,0xf1ae8d9de0173f3e1151487bb5157cd7,1,1,0 -1,1,0,20,2,2,0x10b30b9925aace81dcec2ccce77c3eea,1,1,0 -1,1,0,21,2,2,0xa949c366d7cd71a6a6748bcdd996b762,1,1,0 -1,1,0,22,2,2,0x11497987c563ade267b3bdfcc9c04022,1,1,0 -1,1,0,23,2,2,0x3e25664c3bcdd28858b1daa7ac249034,1,1,0 -1,1,0,0,0,2,0x0,1,0,1 -1,1,0,1,0,2,0x1,1,0,1 \ No newline at end of file +ECDATA_ID,ECDATA_CS_PAIRING,ECDATA_CS_G2_MEMBERSHIP,ECDATA_INDEX,ECDATA_ACC_PAIRINGS,ECDATA_TOTAL_PAIRINGS,ECDATA_LIMB_0,ECDATA_LIMB_1,ECDATA_LIMB_2,ECDATA_LIMB_3,ECDATA_LIMB_4,ECDATA_LIMB_5,ECDATA_LIMB_6,ECDATA_LIMB_7,ECDATA_SUCCESS_BIT,ECDATA_IS_DATA,ECDATA_IS_RES +0,1,0,0,1,2,0x1336,0x4879,0x8163,0x94e3,0x8a2d,0x72bd,0xe23b,0xda93,1,1,0 +0,1,0,1,1,2,0xcd39,0x885c,0x6bfd,0xedbc,0x45e6,0xbafc,0xfc8f,0xa685,1,1,0 +0,1,0,2,1,2,0x0e0e,0x4c9d,0x0374,0x6d28,0x7b34,0x1d52,0x4619,0x46a1,1,1,0 +0,1,0,3,1,2,0xc865,0x002c,0x35ba,0x9bd6,0xb789,0xfc26,0xa526,0xd121,1,1,0 +0,1,0,4,1,2,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,1,1,0 +0,1,0,5,1,2,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,1,1,0 +0,1,0,6,1,2,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,1,1,0 +0,1,0,7,1,2,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,1,1,0 +0,1,0,8,1,2,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,1,1,0 +0,1,0,9,1,2,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,1,1,0 +0,1,0,10,1,2,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,1,1,0 +0,1,0,11,1,2,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,1,1,0 +0,1,0,12,2,2,0x0b96,0x24a6,0x2e11,0x5247,0x146d,0x4643,0xe8d4,0xdaf0,1,1,0 +0,1,0,13,2,2,0x7ff1,0x8000,0x0fcf,0x9f02,0xc84c,0xc569,0x2b2c,0x0526,1,1,0 +0,1,0,14,2,2,0x1cb9,0x908c,0x06bf,0x3099,0xf153,0x8277,0x102b,0x31e3,1,1,0 +0,1,0,15,2,2,0x1d02,0x2dc6,0x4770,0xbc13,0x0df1,0x4dae,0xf728,0x30e4,1,1,0 +0,1,0,16,2,2,0x2977,0x858b,0x214a,0x3cb4,0x3fa4,0x0249,0x76dd,0x1675,1,1,0 +0,1,0,17,2,2,0x9b1b,0xf536,0x7e63,0x18da,0x3545,0xe697,0xb993,0x1671,1,1,0 +0,1,0,18,2,2,0x06fc,0xfd4b,0x9ca0,0x3fb1,0x45ff,0x273e,0x480e,0xfda3,1,1,0 +0,1,0,19,2,2,0xc8a7,0xaef6,0x4882,0xefcb,0xd892,0x0b44,0x58e1,0xef3d,1,1,0 +0,1,0,20,2,2,0x2815,0x0832,0x6108,0x3097,0x78f9,0xcdf9,0xc39a,0x4c4d,1,1,0 +0,1,0,21,2,2,0xc90a,0x405c,0x0cfb,0xfd5d,0x20fe,0xc4e4,0x7acc,0xe66f,1,1,0 +0,1,0,22,2,2,0x10d2,0x4b6f,0x0b87,0xc1e3,0xf78b,0x80b9,0x67ba,0xc765,1,1,0 +0,1,0,23,2,2,0x763f,0x38c5,0x3a43,0x77e9,0xa97e,0x2761,0x758a,0x92f1,1,1,0 +0,1,0,0,0,2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,0,1 +0,1,0,1,0,2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,1,0,1 +1,1,0,0,1,2,0x0b96,0x24a6,0x2e11,0x5247,0x146d,0x4643,0xe8d4,0xdaf0,1,1,0 +1,1,0,1,1,2,0x7ff1,0x8000,0x0fcf,0x9f02,0xc84c,0xc569,0x2b2c,0x0526,1,1,0 +1,1,0,2,1,2,0x13aa,0xbde6,0xda72,0x6f8f,0xc6fc,0xc33f,0x7156,0x267a,1,1,0 +1,1,0,3,1,2,0x7a7f,0x3ccb,0x2101,0x0e7a,0x2e2f,0x3e67,0xe154,0xcc63,1,1,0 +1,1,0,4,1,2,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,1,1,0 +1,1,0,5,1,2,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,1,1,0 +1,1,0,6,1,2,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,1,1,0 +1,1,0,7,1,2,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,1,1,0 +1,1,0,8,1,2,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,1,1,0 +1,1,0,9,1,2,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,1,1,0 +1,1,0,10,1,2,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,1,1,0 +1,1,0,11,1,2,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,1,1,0 +1,1,0,12,2,2,0x0b96,0x24a6,0x2e11,0x5247,0x146d,0x4643,0xe8d4,0xdaf0,1,1,0 +1,1,0,13,2,2,0x7ff1,0x8000,0x0fcf,0x9f02,0xc84c,0xc569,0x2b2c,0x0526,1,1,0 +1,1,0,14,2,2,0x1cb9,0x908c,0x06bf,0x3099,0xf153,0x8277,0x102b,0x31e3,1,1,0 +1,1,0,15,2,2,0x1d02,0x2dc6,0x4770,0xbc13,0x0df1,0x4dae,0xf728,0x30e4,1,1,0 +1,1,0,16,2,2,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,1,1,0 +1,1,0,17,2,2,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,1,1,0 +1,1,0,18,2,2,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,1,1,0 +1,1,0,19,2,2,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,1,1,0 +1,1,0,20,2,2,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,1,1,0 +1,1,0,21,2,2,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,1,1,0 +1,1,0,22,2,2,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,1,1,0 +1,1,0,23,2,2,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,1,1,0 +1,1,0,0,0,2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,1,0,1 +1,1,0,1,0,2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,1,0,1 diff --git a/prover/zkevm/prover/ecpair/testdata/ecpair_two_pairings_module.csv b/prover/zkevm/prover/ecpair/testdata/ecpair_two_pairings_module.csv index 1ac1becf567..be997e76aa0 100644 --- a/prover/zkevm/prover/ecpair/testdata/ecpair_two_pairings_module.csv +++ b/prover/zkevm/prover/ecpair/testdata/ecpair_two_pairings_module.csv @@ -1,257 +1,257 @@ -ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT -0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x1,0x1,0x0 -0x1,0x1,0x2,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x3,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x4,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x5,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x6,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x7,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x8,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x9,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xa,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xb,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xc,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xd,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xe,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xf,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x10,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x11,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x12,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x13,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x14,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x15,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x16,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x17,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x13364879816394e38a2d72bde23bda93,0x1,0x0 -0x1,0x1,0x19,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xcd39885c6bfdedbc45e6bafcfc8fa685,0x1,0x0 -0x1,0x1,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xe0e4c9d03746d287b341d52461946a1,0x1,0x0 -0x1,0x1,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xc865002c35ba9bd6b789fc26a526d121,0x1,0x0 -0x1,0x1,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xe82be8514331e947408a3a27a54d580,0x1,0x0 -0x1,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x9866db37d74db5abc7de8f0d3d0f7ee3,0x1,0x0 -0x1,0x1,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf89c9a7bb2eb9418d2d89310306196d,0x1,0x0 -0x1,0x1,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf1ae8d9de0173f3e1151487bb5157cd7,0x1,0x0 -0x1,0x1,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x10b30b9925aace81dcec2ccce77c3eea,0x1,0x0 -0x1,0x1,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa949c366d7cd71a6a6748bcdd996b762,0x1,0x0 -0x1,0x1,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x11497987c563ade267b3bdfcc9c04022,0x1,0x0 -0x1,0x1,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3e25664c3bcdd28858b1daa7ac249034,0x1,0x0 -0x1,0x1,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x1fc57e97fc7f579bbc2ba220d9b10d46,0x1,0x0 -0x1,0x1,0x25,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4c95627608bdbb0235762c7048400f93,0x1,0x0 -0x1,0x1,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2b4305dcdfcf51d41a169cbe7b4e89d4,0x1,0x0 -0x1,0x1,0x27,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x59f4578a51cdbe050925fc0b9312aa86,0x1,0x0 -0x1,0x1,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1133d6c9d0cacf4e7cd03b8ae8654f3b,0x1,0x0 -0x1,0x1,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xfbfc80323c91c70825d4aa8accfd77b8,0x1,0x0 -0x1,0x1,0x2a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2b45ce688738a571621b63dba9880856,0x1,0x0 -0x1,0x1,0x2b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x9dd4ff917cefc257d7cfe3ea571e206a,0x1,0x0 -0x1,0x1,0x2c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x653b8af047158278411df902874a82a,0x1,0x0 -0x1,0x1,0x2d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x401206aafb12aa7c2d704f51f115d8c2,0x1,0x0 -0x1,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1373a842ceca78f2ae076804f168559c,0x1,0x0 -0x1,0x1,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1781cbb3451085c1166bdadbc7c92688,0x1,0x0 -0x1,0x1,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2c8c1f272129cf6b0866ad1d8f3ac818,0x1,0x0 -0x1,0x1,0x31,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2f12833bfd8a1711d7947461776699df,0x1,0x0 -0x1,0x1,0x32,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x16e10599cfcd3537d808d197ce64c2c5,0x1,0x0 -0x1,0x1,0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xdaf005b2c0be94b08c52e30acfb098e,0x1,0x0 -0x1,0x1,0x34,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd5d04cfad426760d9019d3d15b98aee,0x1,0x0 -0x1,0x1,0x35,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x8c37f28a10bb3cfa2f3971505c77db23,0x1,0x0 -0x1,0x1,0x36,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x22af99c52785193aa8920826c0d96380,0x1,0x0 -0x1,0x1,0x37,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xe8213976bbbab27922a2cd8c8fe4adeb,0x1,0x0 -0x1,0x1,0x38,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xa6356a8a0caaec7d1a28661b990a20b,0x1,0x0 -0x1,0x1,0x39,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x217f227c48e2682613693d3afb8231e,0x1,0x0 -0x1,0x1,0x3a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x5641ef4d251e87484afef7cae876258,0x1,0x0 -0x1,0x1,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xc199d8553a68a9408d2603bd9ff29c36,0x1,0x0 -0x1,0x1,0x3c,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1fc57e97fc7f579bbc2ba220d9b10d46,0x0,0x1 -0x1,0x1,0x3d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4c95627608bdbb0235762c7048400f93,0x0,0x1 -0x1,0x1,0x3e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2b4305dcdfcf51d41a169cbe7b4e89d4,0x0,0x1 -0x1,0x1,0x3f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x59f4578a51cdbe050925fc0b9312aa86,0x0,0x1 -0x1,0x1,0x40,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1133d6c9d0cacf4e7cd03b8ae8654f3b,0x0,0x1 -0x1,0x1,0x41,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xfbfc80323c91c70825d4aa8accfd77b8,0x0,0x1 -0x1,0x1,0x42,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2b45ce688738a571621b63dba9880856,0x0,0x1 -0x1,0x1,0x43,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x9dd4ff917cefc257d7cfe3ea571e206a,0x0,0x1 -0x1,0x1,0x44,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x653b8af047158278411df902874a82a,0x0,0x1 -0x1,0x1,0x45,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x401206aafb12aa7c2d704f51f115d8c2,0x0,0x1 -0x1,0x1,0x46,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1373a842ceca78f2ae076804f168559c,0x0,0x1 -0x1,0x1,0x47,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1781cbb3451085c1166bdadbc7c92688,0x0,0x1 -0x1,0x1,0x48,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2c8c1f272129cf6b0866ad1d8f3ac818,0x0,0x1 -0x1,0x1,0x49,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2f12833bfd8a1711d7947461776699df,0x0,0x1 -0x1,0x1,0x4a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x16e10599cfcd3537d808d197ce64c2c5,0x0,0x1 -0x1,0x1,0x4b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xdaf005b2c0be94b08c52e30acfb098e,0x0,0x1 -0x1,0x1,0x4c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd5d04cfad426760d9019d3d15b98aee,0x0,0x1 -0x1,0x1,0x4d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x8c37f28a10bb3cfa2f3971505c77db23,0x0,0x1 -0x1,0x1,0x4e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x22af99c52785193aa8920826c0d96380,0x0,0x1 -0x1,0x1,0x4f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xe8213976bbbab27922a2cd8c8fe4adeb,0x0,0x1 -0x1,0x1,0x50,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xa6356a8a0caaec7d1a28661b990a20b,0x0,0x1 -0x1,0x1,0x51,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x217f227c48e2682613693d3afb8231e,0x0,0x1 -0x1,0x1,0x52,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x5641ef4d251e87484afef7cae876258,0x0,0x1 -0x1,0x1,0x53,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xc199d8553a68a9408d2603bd9ff29c36,0x0,0x1 -0x1,0x1,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xb9624a62e115247146d4643e8d4daf0,0x0,0x1 -0x1,0x1,0x55,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x7ff180000fcf9f02c84cc5692b2c0526,0x0,0x1 -0x1,0x1,0x56,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1cb9908c06bf3099f1538277102b31e3,0x0,0x1 -0x1,0x1,0x57,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1d022dc64770bc130df14daef72830e4,0x0,0x1 -0x1,0x1,0x58,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2977858b214a3cb43fa4024976dd1675,0x0,0x1 -0x1,0x1,0x59,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x9b1bf5367e6318da3545e697b9931671,0x0,0x1 -0x1,0x1,0x5a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x6fcfd4b9ca03fb145ff273e480efda3,0x0,0x1 -0x1,0x1,0x5b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xc8a7aef64882efcbd8920b4458e1ef3d,0x0,0x1 -0x1,0x1,0x5c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x281508326108309778f9cdf9c39a4c4d,0x0,0x1 -0x1,0x1,0x5d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xc90a405c0cfbfd5d20fec4e47acce66f,0x0,0x1 -0x1,0x1,0x5e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x10d24b6f0b87c1e3f78b80b967bac765,0x0,0x1 -0x1,0x1,0x5f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x763f38c53a4377e9a97e2761758a92f1,0x0,0x1 -0x1,0x1,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0,0x0,0x1 -0x1,0x1,0x61,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x1,0x0,0x1 -0x1,0x1,0x0,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x1,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x1,0x1,0x0 -0x1,0x1,0x2,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x3,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x4,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x5,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x6,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x7,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x8,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x9,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xa,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xb,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xc,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xd,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xe,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0xf,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x10,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x11,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x12,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x13,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x14,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x15,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x16,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x17,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0,0x1,0x0 -0x1,0x1,0x18,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xb9624a62e115247146d4643e8d4daf0,0x1,0x0 -0x1,0x1,0x19,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x7ff180000fcf9f02c84cc5692b2c0526,0x1,0x0 -0x1,0x1,0x1a,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x13aabde6da726f8fc6fcc33f7156267a,0x1,0x0 -0x1,0x1,0x1b,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x7a7f3ccb21010e7a2e2f3e67e154cc63,0x1,0x0 -0x1,0x1,0x1c,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xe82be8514331e947408a3a27a54d580,0x1,0x0 -0x1,0x1,0x1d,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x9866db37d74db5abc7de8f0d3d0f7ee3,0x1,0x0 -0x1,0x1,0x1e,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf89c9a7bb2eb9418d2d89310306196d,0x1,0x0 -0x1,0x1,0x1f,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf1ae8d9de0173f3e1151487bb5157cd7,0x1,0x0 -0x1,0x1,0x20,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x10b30b9925aace81dcec2ccce77c3eea,0x1,0x0 -0x1,0x1,0x21,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa949c366d7cd71a6a6748bcdd996b762,0x1,0x0 -0x1,0x1,0x22,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x11497987c563ade267b3bdfcc9c04022,0x1,0x0 -0x1,0x1,0x23,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3e25664c3bcdd28858b1daa7ac249034,0x1,0x0 -0x1,0x1,0x24,0x1,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x1d986c0862b80ece8d231a383cb73943,0x1,0x0 -0x1,0x1,0x25,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x3dbbc8770d85f0584f6dc86875624cea,0x1,0x0 -0x1,0x1,0x26,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x3c51f8072e2a8a07f6a06f5088e9ab2,0x1,0x0 -0x1,0x1,0x27,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xdbc106c833cd19dffcb9e1073ec1805c,0x1,0x0 -0x1,0x1,0x28,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x24ef30331e45aacaa2c0db503198129d,0x1,0x0 -0x1,0x1,0x29,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x698da943542b3b26946e11a08dc6144,0x1,0x0 -0x1,0x1,0x2a,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x229bffeec7cae24f754f3353492e06b7,0x1,0x0 -0x1,0x1,0x2b,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x38b7714ed0c32e48e7afaf62a4efa110,0x1,0x0 -0x1,0x1,0x2c,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x10bc1cc6e37e745faa3ed918cc36edc9,0x1,0x0 -0x1,0x1,0x2d,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x21edc644688a0705476f795d39af8b66,0x1,0x0 -0x1,0x1,0x2e,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2adcf726eec4f68995c3207f92aea375,0x1,0x0 -0x1,0x1,0x2f,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xfcd13ed4fe7b43ad615735680a4485e7,0x1,0x0 -0x1,0x1,0x30,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1f0e7e775eefc2a5672928b4efc2c508,0x1,0x0 -0x1,0x1,0x31,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd1b9522023a1105027220223481cad5e,0x1,0x0 -0x1,0x1,0x32,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x241401f805f060cf5e55b76d0a1d9703,0x1,0x0 -0x1,0x1,0x33,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x623d8250a84288f9a9d6b32e4a79ab25,0x1,0x0 -0x1,0x1,0x34,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2aefa1de34a54b19496ac527550823fc,0x1,0x0 -0x1,0x1,0x35,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4b742adbe4a5e836b5a4c3c601d721be,0x1,0x0 -0x1,0x1,0x36,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2feeac4095267db703b602ff985fc423,0x1,0x0 -0x1,0x1,0x37,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x235e6c11ea98a28c6a34a72c6ee2ddc,0x1,0x0 -0x1,0x1,0x38,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1d75dcc79d6ddd435182ca5de99635c0,0x1,0x0 -0x1,0x1,0x39,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x212f3e7e80bdfa698ac725005f8dae63,0x1,0x0 -0x1,0x1,0x3a,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x5aeef8c0490c8356ffdd4913155eb21,0x1,0x0 -0x1,0x1,0x3b,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd66a1367a4c8c3f6c041b4227c1bf352,0x1,0x0 -0x1,0x1,0x3c,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1d986c0862b80ece8d231a383cb73943,0x0,0x1 -0x1,0x1,0x3d,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x3dbbc8770d85f0584f6dc86875624cea,0x0,0x1 -0x1,0x1,0x3e,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x3c51f8072e2a8a07f6a06f5088e9ab2,0x0,0x1 -0x1,0x1,0x3f,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xdbc106c833cd19dffcb9e1073ec1805c,0x0,0x1 -0x1,0x1,0x40,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x24ef30331e45aacaa2c0db503198129d,0x0,0x1 -0x1,0x1,0x41,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x698da943542b3b26946e11a08dc6144,0x0,0x1 -0x1,0x1,0x42,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x229bffeec7cae24f754f3353492e06b7,0x0,0x1 -0x1,0x1,0x43,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x38b7714ed0c32e48e7afaf62a4efa110,0x0,0x1 -0x1,0x1,0x44,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x10bc1cc6e37e745faa3ed918cc36edc9,0x0,0x1 -0x1,0x1,0x45,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x21edc644688a0705476f795d39af8b66,0x0,0x1 -0x1,0x1,0x46,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2adcf726eec4f68995c3207f92aea375,0x0,0x1 -0x1,0x1,0x47,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xfcd13ed4fe7b43ad615735680a4485e7,0x0,0x1 -0x1,0x1,0x48,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1f0e7e775eefc2a5672928b4efc2c508,0x0,0x1 -0x1,0x1,0x49,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd1b9522023a1105027220223481cad5e,0x0,0x1 -0x1,0x1,0x4a,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x241401f805f060cf5e55b76d0a1d9703,0x0,0x1 -0x1,0x1,0x4b,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x623d8250a84288f9a9d6b32e4a79ab25,0x0,0x1 -0x1,0x1,0x4c,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2aefa1de34a54b19496ac527550823fc,0x0,0x1 -0x1,0x1,0x4d,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4b742adbe4a5e836b5a4c3c601d721be,0x0,0x1 -0x1,0x1,0x4e,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2feeac4095267db703b602ff985fc423,0x0,0x1 -0x1,0x1,0x4f,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x235e6c11ea98a28c6a34a72c6ee2ddc,0x0,0x1 -0x1,0x1,0x50,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1d75dcc79d6ddd435182ca5de99635c0,0x0,0x1 -0x1,0x1,0x51,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x212f3e7e80bdfa698ac725005f8dae63,0x0,0x1 -0x1,0x1,0x52,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x5aeef8c0490c8356ffdd4913155eb21,0x0,0x1 -0x1,0x1,0x53,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd66a1367a4c8c3f6c041b4227c1bf352,0x0,0x1 -0x1,0x1,0x54,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xb9624a62e115247146d4643e8d4daf0,0x0,0x1 -0x1,0x1,0x55,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x7ff180000fcf9f02c84cc5692b2c0526,0x0,0x1 -0x1,0x1,0x56,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1cb9908c06bf3099f1538277102b31e3,0x0,0x1 -0x1,0x1,0x57,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1d022dc64770bc130df14daef72830e4,0x0,0x1 -0x1,0x1,0x58,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xe82be8514331e947408a3a27a54d580,0x0,0x1 -0x1,0x1,0x59,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x9866db37d74db5abc7de8f0d3d0f7ee3,0x0,0x1 -0x1,0x1,0x5a,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xf89c9a7bb2eb9418d2d89310306196d,0x0,0x1 -0x1,0x1,0x5b,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xf1ae8d9de0173f3e1151487bb5157cd7,0x0,0x1 -0x1,0x1,0x5c,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x10b30b9925aace81dcec2ccce77c3eea,0x0,0x1 -0x1,0x1,0x5d,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xa949c366d7cd71a6a6748bcdd996b762,0x0,0x1 -0x1,0x1,0x5e,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x11497987c563ade267b3bdfcc9c04022,0x0,0x1 -0x1,0x1,0x5f,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x3e25664c3bcdd28858b1daa7ac249034,0x0,0x1 -0x1,0x1,0x60,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0,0x0,0x1 -0x1,0x1,0x61,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x1,0x0,0x1 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +ECPAIR_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACTIVE,ECPAIR_UNALIGNED_PAIRING_DATA_INDEX,ECPAIR_UNALIGNED_PAIRING_DATA_INSTANCE_ID,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_INSTANCE,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_INIT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_PREV_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_PREV,ECPAIR_UNALIGNED_PAIRING_DATA_IS_FIRST_LINE_OF_CURR_ACC,ECPAIR_UNALIGNED_PAIRING_DATA_IS_ACCUMULATOR_CURR,ECPAIR_UNALIGNED_PAIRING_DATA_IS_RESULT,ECPAIR_UNALIGNED_PAIRING_DATA_IS_COMPUTED,ECPAIR_UNALIGNED_PAIRING_DATA_IS_PULLING,ECPAIR_UNALIGNED_PAIRING_DATA_PAIR_ID,ECPAIR_UNALIGNED_PAIRING_DATA_TOTAL_PAIRS,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_0,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_1,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_2,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_3,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_4,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_5,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_6,ECPAIR_UNALIGNED_PAIRING_DATA_LIMB_7,ECPAIR_UNALIGNED_PAIRING_DATA_TO_MILLER_LOOP_CIRCUIT,ECPAIR_UNALIGNED_PAIRING_DATA_TO_FINAL_EXP_CIRCUIT +0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x1,0x0 +0x1,0x1,0x2,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x3,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x4,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x5,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x6,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x7,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x8,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x9,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xa,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xb,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xc,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xd,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xe,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xf,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x10,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x11,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x12,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x13,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x14,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x15,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x16,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x17,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x1336,0x4879,0x8163,0x94e3,0x8a2d,0x72bd,0xe23b,0xda93,0x1,0x0 +0x1,0x1,0x19,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xcd39,0x885c,0x6bfd,0xedbc,0x45e6,0xbafc,0xfc8f,0xa685,0x1,0x0 +0x1,0x1,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0e0e,0x4c9d,0x0374,0x6d28,0x7b34,0x1d52,0x4619,0x46a1,0x1,0x0 +0x1,0x1,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xc865,0x002c,0x35ba,0x9bd6,0xb789,0xfc26,0xa526,0xd121,0x1,0x0 +0x1,0x1,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,0x1,0x0 +0x1,0x1,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,0x1,0x0 +0x1,0x1,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,0x1,0x0 +0x1,0x1,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,0x1,0x0 +0x1,0x1,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,0x1,0x0 +0x1,0x1,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,0x1,0x0 +0x1,0x1,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,0x1,0x0 +0x1,0x1,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,0x1,0x0 +0x1,0x1,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x1fc5,0x7e97,0xfc7f,0x579b,0xbc2b,0xa220,0xd9b1,0x0d46,0x1,0x0 +0x1,0x1,0x25,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4c95,0x6276,0x08bd,0xbb02,0x3576,0x2c70,0x4840,0x0f93,0x1,0x0 +0x1,0x1,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2b43,0x05dc,0xdfcf,0x51d4,0x1a16,0x9cbe,0x7b4e,0x89d4,0x1,0x0 +0x1,0x1,0x27,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x59f4,0x578a,0x51cd,0xbe05,0x0925,0xfc0b,0x9312,0xaa86,0x1,0x0 +0x1,0x1,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1133,0xd6c9,0xd0ca,0xcf4e,0x7cd0,0x3b8a,0xe865,0x4f3b,0x1,0x0 +0x1,0x1,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xfbfc,0x8032,0x3c91,0xc708,0x25d4,0xaa8a,0xccfd,0x77b8,0x1,0x0 +0x1,0x1,0x2a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2b45,0xce68,0x8738,0xa571,0x621b,0x63db,0xa988,0x0856,0x1,0x0 +0x1,0x1,0x2b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x9dd4,0xff91,0x7cef,0xc257,0xd7cf,0xe3ea,0x571e,0x206a,0x1,0x0 +0x1,0x1,0x2c,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0653,0xb8af,0x0471,0x5827,0x8411,0xdf90,0x2874,0xa82a,0x1,0x0 +0x1,0x1,0x2d,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4012,0x06aa,0xfb12,0xaa7c,0x2d70,0x4f51,0xf115,0xd8c2,0x1,0x0 +0x1,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1373,0xa842,0xceca,0x78f2,0xae07,0x6804,0xf168,0x559c,0x1,0x0 +0x1,0x1,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1781,0xcbb3,0x4510,0x85c1,0x166b,0xdadb,0xc7c9,0x2688,0x1,0x0 +0x1,0x1,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2c8c,0x1f27,0x2129,0xcf6b,0x0866,0xad1d,0x8f3a,0xc818,0x1,0x0 +0x1,0x1,0x31,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2f12,0x833b,0xfd8a,0x1711,0xd794,0x7461,0x7766,0x99df,0x1,0x0 +0x1,0x1,0x32,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x16e1,0x0599,0xcfcd,0x3537,0xd808,0xd197,0xce64,0xc2c5,0x1,0x0 +0x1,0x1,0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0daf,0x005b,0x2c0b,0xe94b,0x08c5,0x2e30,0xacfb,0x098e,0x1,0x0 +0x1,0x1,0x34,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0d5d,0x04cf,0xad42,0x6760,0xd901,0x9d3d,0x15b9,0x8aee,0x1,0x0 +0x1,0x1,0x35,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x8c37,0xf28a,0x10bb,0x3cfa,0x2f39,0x7150,0x5c77,0xdb23,0x1,0x0 +0x1,0x1,0x36,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x22af,0x99c5,0x2785,0x193a,0xa892,0x0826,0xc0d9,0x6380,0x1,0x0 +0x1,0x1,0x37,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xe821,0x3976,0xbbba,0xb279,0x22a2,0xcd8c,0x8fe4,0xadeb,0x1,0x0 +0x1,0x1,0x38,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0a63,0x56a8,0xa0ca,0xaec7,0xd1a2,0x8661,0xb990,0xa20b,0x1,0x0 +0x1,0x1,0x39,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0217,0xf227,0xc48e,0x2682,0x6136,0x93d3,0xafb8,0x231e,0x1,0x0 +0x1,0x1,0x3a,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0564,0x1ef4,0xd251,0xe874,0x84af,0xef7c,0xae87,0x6258,0x1,0x0 +0x1,0x1,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xc199,0xd855,0x3a68,0xa940,0x8d26,0x03bd,0x9ff2,0x9c36,0x1,0x0 +0x1,0x1,0x3c,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1fc5,0x7e97,0xfc7f,0x579b,0xbc2b,0xa220,0xd9b1,0x0d46,0x0,0x1 +0x1,0x1,0x3d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4c95,0x6276,0x08bd,0xbb02,0x3576,0x2c70,0x4840,0x0f93,0x0,0x1 +0x1,0x1,0x3e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2b43,0x05dc,0xdfcf,0x51d4,0x1a16,0x9cbe,0x7b4e,0x89d4,0x0,0x1 +0x1,0x1,0x3f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x59f4,0x578a,0x51cd,0xbe05,0x0925,0xfc0b,0x9312,0xaa86,0x0,0x1 +0x1,0x1,0x40,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1133,0xd6c9,0xd0ca,0xcf4e,0x7cd0,0x3b8a,0xe865,0x4f3b,0x0,0x1 +0x1,0x1,0x41,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xfbfc,0x8032,0x3c91,0xc708,0x25d4,0xaa8a,0xccfd,0x77b8,0x0,0x1 +0x1,0x1,0x42,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2b45,0xce68,0x8738,0xa571,0x621b,0x63db,0xa988,0x0856,0x0,0x1 +0x1,0x1,0x43,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x9dd4,0xff91,0x7cef,0xc257,0xd7cf,0xe3ea,0x571e,0x206a,0x0,0x1 +0x1,0x1,0x44,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0653,0xb8af,0x0471,0x5827,0x8411,0xdf90,0x2874,0xa82a,0x0,0x1 +0x1,0x1,0x45,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4012,0x06aa,0xfb12,0xaa7c,0x2d70,0x4f51,0xf115,0xd8c2,0x0,0x1 +0x1,0x1,0x46,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1373,0xa842,0xceca,0x78f2,0xae07,0x6804,0xf168,0x559c,0x0,0x1 +0x1,0x1,0x47,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1781,0xcbb3,0x4510,0x85c1,0x166b,0xdadb,0xc7c9,0x2688,0x0,0x1 +0x1,0x1,0x48,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2c8c,0x1f27,0x2129,0xcf6b,0x0866,0xad1d,0x8f3a,0xc818,0x0,0x1 +0x1,0x1,0x49,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2f12,0x833b,0xfd8a,0x1711,0xd794,0x7461,0x7766,0x99df,0x0,0x1 +0x1,0x1,0x4a,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x16e1,0x0599,0xcfcd,0x3537,0xd808,0xd197,0xce64,0xc2c5,0x0,0x1 +0x1,0x1,0x4b,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0daf,0x005b,0x2c0b,0xe94b,0x08c5,0x2e30,0xacfb,0x098e,0x0,0x1 +0x1,0x1,0x4c,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0d5d,0x04cf,0xad42,0x6760,0xd901,0x9d3d,0x15b9,0x8aee,0x0,0x1 +0x1,0x1,0x4d,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x8c37,0xf28a,0x10bb,0x3cfa,0x2f39,0x7150,0x5c77,0xdb23,0x0,0x1 +0x1,0x1,0x4e,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x22af,0x99c5,0x2785,0x193a,0xa892,0x0826,0xc0d9,0x6380,0x0,0x1 +0x1,0x1,0x4f,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xe821,0x3976,0xbbba,0xb279,0x22a2,0xcd8c,0x8fe4,0xadeb,0x0,0x1 +0x1,0x1,0x50,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0a63,0x56a8,0xa0ca,0xaec7,0xd1a2,0x8661,0xb990,0xa20b,0x0,0x1 +0x1,0x1,0x51,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0217,0xf227,0xc48e,0x2682,0x6136,0x93d3,0xafb8,0x231e,0x0,0x1 +0x1,0x1,0x52,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0564,0x1ef4,0xd251,0xe874,0x84af,0xef7c,0xae87,0x6258,0x0,0x1 +0x1,0x1,0x53,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xc199,0xd855,0x3a68,0xa940,0x8d26,0x03bd,0x9ff2,0x9c36,0x0,0x1 +0x1,0x1,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x0b96,0x24a6,0x2e11,0x5247,0x146d,0x4643,0xe8d4,0xdaf0,0x0,0x1 +0x1,0x1,0x55,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x7ff1,0x8000,0x0fcf,0x9f02,0xc84c,0xc569,0x2b2c,0x0526,0x0,0x1 +0x1,0x1,0x56,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1cb9,0x908c,0x06bf,0x3099,0xf153,0x8277,0x102b,0x31e3,0x0,0x1 +0x1,0x1,0x57,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1d02,0x2dc6,0x4770,0xbc13,0x0df1,0x4dae,0xf728,0x30e4,0x0,0x1 +0x1,0x1,0x58,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2977,0x858b,0x214a,0x3cb4,0x3fa4,0x0249,0x76dd,0x1675,0x0,0x1 +0x1,0x1,0x59,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x9b1b,0xf536,0x7e63,0x18da,0x3545,0xe697,0xb993,0x1671,0x0,0x1 +0x1,0x1,0x5a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x06fc,0xfd4b,0x9ca0,0x3fb1,0x45ff,0x273e,0x480e,0xfda3,0x0,0x1 +0x1,0x1,0x5b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xc8a7,0xaef6,0x4882,0xefcb,0xd892,0x0b44,0x58e1,0xef3d,0x0,0x1 +0x1,0x1,0x5c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x2815,0x0832,0x6108,0x3097,0x78f9,0xcdf9,0xc39a,0x4c4d,0x0,0x1 +0x1,0x1,0x5d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xc90a,0x405c,0x0cfb,0xfd5d,0x20fe,0xc4e4,0x7acc,0xe66f,0x0,0x1 +0x1,0x1,0x5e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x10d2,0x4b6f,0x0b87,0xc1e3,0xf78b,0x80b9,0x67ba,0xc765,0x0,0x1 +0x1,0x1,0x5f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x763f,0x38c5,0x3a43,0x77e9,0xa97e,0x2761,0x758a,0x92f1,0x0,0x1 +0x1,0x1,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x1,0x1,0x61,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0,0x1 +0x1,0x1,0x0,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x1,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x1,0x0 +0x1,0x1,0x2,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x3,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x4,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x5,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x6,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x7,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x8,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x9,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xa,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xb,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xc,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xd,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xe,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0xf,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x10,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x11,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x12,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x13,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x14,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x15,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x16,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x17,0x1,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1,0x0 +0x1,0x1,0x18,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0b96,0x24a6,0x2e11,0x5247,0x146d,0x4643,0xe8d4,0xdaf0,0x1,0x0 +0x1,0x1,0x19,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x7ff1,0x8000,0x0fcf,0x9f02,0xc84c,0xc569,0x2b2c,0x0526,0x1,0x0 +0x1,0x1,0x1a,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x13aa,0xbde6,0xda72,0x6f8f,0xc6fc,0xc33f,0x7156,0x267a,0x1,0x0 +0x1,0x1,0x1b,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x7a7f,0x3ccb,0x2101,0x0e7a,0x2e2f,0x3e67,0xe154,0xcc63,0x1,0x0 +0x1,0x1,0x1c,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,0x1,0x0 +0x1,0x1,0x1d,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,0x1,0x0 +0x1,0x1,0x1e,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,0x1,0x0 +0x1,0x1,0x1f,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,0x1,0x0 +0x1,0x1,0x20,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,0x1,0x0 +0x1,0x1,0x21,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,0x1,0x0 +0x1,0x1,0x22,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,0x1,0x0 +0x1,0x1,0x23,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,0x1,0x0 +0x1,0x1,0x24,0x1,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x1,0x0,0x1,0x2,0x1d98,0x6c08,0x62b8,0x0ece,0x8d23,0x1a38,0x3cb7,0x3943,0x1,0x0 +0x1,0x1,0x25,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x3dbb,0xc877,0x0d85,0xf058,0x4f6d,0xc868,0x7562,0x4cea,0x1,0x0 +0x1,0x1,0x26,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x03c5,0x1f80,0x72e2,0xa8a0,0x7f6a,0x06f5,0x088e,0x9ab2,0x1,0x0 +0x1,0x1,0x27,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xdbc1,0x06c8,0x33cd,0x19df,0xfcb9,0xe107,0x3ec1,0x805c,0x1,0x0 +0x1,0x1,0x28,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x24ef,0x3033,0x1e45,0xaaca,0xa2c0,0xdb50,0x3198,0x129d,0x1,0x0 +0x1,0x1,0x29,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0698,0xda94,0x3542,0xb3b2,0x6946,0xe11a,0x08dc,0x6144,0x1,0x0 +0x1,0x1,0x2a,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x229b,0xffee,0xc7ca,0xe24f,0x754f,0x3353,0x492e,0x06b7,0x1,0x0 +0x1,0x1,0x2b,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x38b7,0x714e,0xd0c3,0x2e48,0xe7af,0xaf62,0xa4ef,0xa110,0x1,0x0 +0x1,0x1,0x2c,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x10bc,0x1cc6,0xe37e,0x745f,0xaa3e,0xd918,0xcc36,0xedc9,0x1,0x0 +0x1,0x1,0x2d,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x21ed,0xc644,0x688a,0x0705,0x476f,0x795d,0x39af,0x8b66,0x1,0x0 +0x1,0x1,0x2e,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2adc,0xf726,0xeec4,0xf689,0x95c3,0x207f,0x92ae,0xa375,0x1,0x0 +0x1,0x1,0x2f,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xfcd1,0x3ed4,0xfe7b,0x43ad,0x6157,0x3568,0x0a44,0x85e7,0x1,0x0 +0x1,0x1,0x30,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1f0e,0x7e77,0x5eef,0xc2a5,0x6729,0x28b4,0xefc2,0xc508,0x1,0x0 +0x1,0x1,0x31,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd1b9,0x5220,0x23a1,0x1050,0x2722,0x0223,0x481c,0xad5e,0x1,0x0 +0x1,0x1,0x32,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2414,0x01f8,0x05f0,0x60cf,0x5e55,0xb76d,0x0a1d,0x9703,0x1,0x0 +0x1,0x1,0x33,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x623d,0x8250,0xa842,0x88f9,0xa9d6,0xb32e,0x4a79,0xab25,0x1,0x0 +0x1,0x1,0x34,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2aef,0xa1de,0x34a5,0x4b19,0x496a,0xc527,0x5508,0x23fc,0x1,0x0 +0x1,0x1,0x35,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x4b74,0x2adb,0xe4a5,0xe836,0xb5a4,0xc3c6,0x01d7,0x21be,0x1,0x0 +0x1,0x1,0x36,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x2fee,0xac40,0x9526,0x7db7,0x03b6,0x02ff,0x985f,0xc423,0x1,0x0 +0x1,0x1,0x37,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x0235,0xe6c1,0x1ea9,0x8a28,0xc6a3,0x4a72,0xc6ee,0x2ddc,0x1,0x0 +0x1,0x1,0x38,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x1d75,0xdcc7,0x9d6d,0xdd43,0x5182,0xca5d,0xe996,0x35c0,0x1,0x0 +0x1,0x1,0x39,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x212f,0x3e7e,0x80bd,0xfa69,0x8ac7,0x2500,0x5f8d,0xae63,0x1,0x0 +0x1,0x1,0x3a,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0x05ae,0xef8c,0x0490,0xc835,0x6ffd,0xd491,0x3155,0xeb21,0x1,0x0 +0x1,0x1,0x3b,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1,0x2,0xd66a,0x1367,0xa4c8,0xc3f6,0xc041,0xb422,0x7c1b,0xf352,0x1,0x0 +0x1,0x1,0x3c,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1d98,0x6c08,0x62b8,0x0ece,0x8d23,0x1a38,0x3cb7,0x3943,0x0,0x1 +0x1,0x1,0x3d,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x3dbb,0xc877,0x0d85,0xf058,0x4f6d,0xc868,0x7562,0x4cea,0x0,0x1 +0x1,0x1,0x3e,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x03c5,0x1f80,0x72e2,0xa8a0,0x7f6a,0x06f5,0x088e,0x9ab2,0x0,0x1 +0x1,0x1,0x3f,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xdbc1,0x06c8,0x33cd,0x19df,0xfcb9,0xe107,0x3ec1,0x805c,0x0,0x1 +0x1,0x1,0x40,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x24ef,0x3033,0x1e45,0xaaca,0xa2c0,0xdb50,0x3198,0x129d,0x0,0x1 +0x1,0x1,0x41,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0698,0xda94,0x3542,0xb3b2,0x6946,0xe11a,0x08dc,0x6144,0x0,0x1 +0x1,0x1,0x42,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x229b,0xffee,0xc7ca,0xe24f,0x754f,0x3353,0x492e,0x06b7,0x0,0x1 +0x1,0x1,0x43,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x38b7,0x714e,0xd0c3,0x2e48,0xe7af,0xaf62,0xa4ef,0xa110,0x0,0x1 +0x1,0x1,0x44,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x10bc,0x1cc6,0xe37e,0x745f,0xaa3e,0xd918,0xcc36,0xedc9,0x0,0x1 +0x1,0x1,0x45,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x21ed,0xc644,0x688a,0x0705,0x476f,0x795d,0x39af,0x8b66,0x0,0x1 +0x1,0x1,0x46,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2adc,0xf726,0xeec4,0xf689,0x95c3,0x207f,0x92ae,0xa375,0x0,0x1 +0x1,0x1,0x47,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xfcd1,0x3ed4,0xfe7b,0x43ad,0x6157,0x3568,0x0a44,0x85e7,0x0,0x1 +0x1,0x1,0x48,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1f0e,0x7e77,0x5eef,0xc2a5,0x6729,0x28b4,0xefc2,0xc508,0x0,0x1 +0x1,0x1,0x49,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd1b9,0x5220,0x23a1,0x1050,0x2722,0x0223,0x481c,0xad5e,0x0,0x1 +0x1,0x1,0x4a,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2414,0x01f8,0x05f0,0x60cf,0x5e55,0xb76d,0x0a1d,0x9703,0x0,0x1 +0x1,0x1,0x4b,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x623d,0x8250,0xa842,0x88f9,0xa9d6,0xb32e,0x4a79,0xab25,0x0,0x1 +0x1,0x1,0x4c,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2aef,0xa1de,0x34a5,0x4b19,0x496a,0xc527,0x5508,0x23fc,0x0,0x1 +0x1,0x1,0x4d,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x4b74,0x2adb,0xe4a5,0xe836,0xb5a4,0xc3c6,0x01d7,0x21be,0x0,0x1 +0x1,0x1,0x4e,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x2fee,0xac40,0x9526,0x7db7,0x03b6,0x02ff,0x985f,0xc423,0x0,0x1 +0x1,0x1,0x4f,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x0235,0xe6c1,0x1ea9,0x8a28,0xc6a3,0x4a72,0xc6ee,0x2ddc,0x0,0x1 +0x1,0x1,0x50,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x1d75,0xdcc7,0x9d6d,0xdd43,0x5182,0xca5d,0xe996,0x35c0,0x0,0x1 +0x1,0x1,0x51,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x212f,0x3e7e,0x80bd,0xfa69,0x8ac7,0x2500,0x5f8d,0xae63,0x0,0x1 +0x1,0x1,0x52,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0x05ae,0xef8c,0x0490,0xc835,0x6ffd,0xd491,0x3155,0xeb21,0x0,0x1 +0x1,0x1,0x53,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x2,0x2,0xd66a,0x1367,0xa4c8,0xc3f6,0xc041,0xb422,0x7c1b,0xf352,0x0,0x1 +0x1,0x1,0x54,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x0b96,0x24a6,0x2e11,0x5247,0x146d,0x4643,0xe8d4,0xdaf0,0x0,0x1 +0x1,0x1,0x55,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x7ff1,0x8000,0x0fcf,0x9f02,0xc84c,0xc569,0x2b2c,0x0526,0x0,0x1 +0x1,0x1,0x56,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1cb9,0x908c,0x06bf,0x3099,0xf153,0x8277,0x102b,0x31e3,0x0,0x1 +0x1,0x1,0x57,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1d02,0x2dc6,0x4770,0xbc13,0x0df1,0x4dae,0xf728,0x30e4,0x0,0x1 +0x1,0x1,0x58,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x0e82,0xbe85,0x1433,0x1e94,0x7408,0xa3a2,0x7a54,0xd580,0x0,0x1 +0x1,0x1,0x59,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x9866,0xdb37,0xd74d,0xb5ab,0xc7de,0x8f0d,0x3d0f,0x7ee3,0x0,0x1 +0x1,0x1,0x5a,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x0f89,0xc9a7,0xbb2e,0xb941,0x8d2d,0x8931,0x0306,0x196d,0x0,0x1 +0x1,0x1,0x5b,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xf1ae,0x8d9d,0xe017,0x3f3e,0x1151,0x487b,0xb515,0x7cd7,0x0,0x1 +0x1,0x1,0x5c,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x10b3,0x0b99,0x25aa,0xce81,0xdcec,0x2ccc,0xe77c,0x3eea,0x0,0x1 +0x1,0x1,0x5d,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0xa949,0xc366,0xd7cd,0x71a6,0xa674,0x8bcd,0xd996,0xb762,0x0,0x1 +0x1,0x1,0x5e,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x1149,0x7987,0xc563,0xade2,0x67b3,0xbdfc,0xc9c0,0x4022,0x0,0x1 +0x1,0x1,0x5f,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x2,0x3e25,0x664c,0x3bcd,0xd288,0x58b1,0xdaa7,0xac24,0x9034,0x0,0x1 +0x1,0x1,0x60,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x1 +0x1,0x1,0x61,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0,0x1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0,0x0 diff --git a/prover/zkevm/prover/ecpair/utils.go b/prover/zkevm/prover/ecpair/utils.go index 9eac4bad38f..ae0064e6393 100644 --- a/prover/zkevm/prover/ecpair/utils.go +++ b/prover/zkevm/prover/ecpair/utils.go @@ -5,36 +5,62 @@ import ( "github.com/consensys/gnark-crypto/ecc/bn254/fp" "github.com/consensys/linea-monorepo/prover/maths/field" "github.com/consensys/linea-monorepo/prover/utils" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) -func convG1WizardToGnark(limbs [nbG1Limbs]field.Element) bn254.G1Affine { +// limbSize holds the size of each "outer" limb. 16 * 8 = 128 bits +const limbSize = 16 +const bytesPerLimb = 2 + +type GtLimbs = [nbGtLimbs]field.Element +type G1Limbs = [nbG1Limbs]field.Element +type G2Limbs = [nbG2Limbs]field.Element +type ResultLimbs = [2]field.Element + +func convG1WizardToGnark(limbs [common.NbLimbU128]G1Limbs) bn254.G1Affine { var res bn254.G1Affine var buf [fp.Bytes]byte copyTo := func(i int, dst *fp.Element) { - l0 := limbs[i].Bytes() - l1 := limbs[i+1].Bytes() - copy(buf[0:16], l0[16:32]) - copy(buf[16:32], l1[16:32]) + offset := 0 + for j := range common.NbLimbU128 { + l0 := limbs[j][i].Bytes() + copy(buf[offset:offset+bytesPerLimb], l0[30:32]) + + l1 := limbs[j][i+1].Bytes() + copy(buf[offset+limbSize:offset+limbSize+bytesPerLimb], l1[30:32]) + + offset += bytesPerLimb + } + dst.SetBytes(buf[:]) } + copyTo(0, &res.X) copyTo(2, &res.Y) return res } -func convG2WizardToGnark(limbs [nbG2Limbs]field.Element) bn254.G2Affine { +func convG2WizardToGnark(limbs [common.NbLimbU128]G2Limbs) bn254.G2Affine { var res bn254.G2Affine var buf [fp.Bytes]byte copyTo := func(i int, dst *fp.Element) { - l0 := limbs[i].Bytes() - l1 := limbs[i+1].Bytes() - copy(buf[0:16], l0[16:32]) - copy(buf[16:32], l1[16:32]) + offset := 0 + for j := range common.NbLimbU128 { + l0 := limbs[j][i].Bytes() + copy(buf[offset:offset+bytesPerLimb], l0[30:32]) + + l1 := limbs[j][i+1].Bytes() + copy(buf[offset+limbSize:offset+limbSize+bytesPerLimb], l1[30:32]) + + offset += bytesPerLimb + } + dst.SetBytes(buf[:]) } + // arithmetization provides G2 coordinates in the following order: // X_Im, X_Re, Y_Im, Y_Re // but in gnark we expect @@ -48,16 +74,19 @@ func convG2WizardToGnark(limbs [nbG2Limbs]field.Element) bn254.G2Affine { return res } -func convGtGnarkToWizard(elem bn254.GT) [nbGtLimbs]field.Element { - var res [nbGtLimbs]field.Element - var buf [fp.Bytes / 2]byte +func convGtGnarkToWizard(elem bn254.GT) [common.NbLimbU128]GtLimbs { + var res [common.NbLimbU128]GtLimbs copyTo := func(i int, b [fp.Bytes]byte) { - copy(buf[:], b[0:16]) - res[i].SetBytes(buf[:]) - copy(buf[:], b[16:32]) - res[i+1].SetBytes(buf[:]) + offset := 0 + for j := range common.NbLimbU128 { + res[j][i].SetBytes(b[offset : offset+bytesPerLimb]) + res[j][i+1].SetBytes(b[offset+limbSize : offset+limbSize+bytesPerLimb]) + + offset += bytesPerLimb + } } + copyTo(0, elem.C0.B0.A0.Bytes()) copyTo(2, elem.C0.B0.A1.Bytes()) copyTo(4, elem.C0.B1.A0.Bytes()) @@ -80,69 +109,69 @@ func inputFillerMillerLoop(circuitInstance, inputIndex int) field.Element { // q = g2 gen // curr = e(p, q) tbl := []string{ - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000001", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000001", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000002", - "0x198e9393920d483a7260bfb731fb5d25", - "0xf1aa493335a9e71297e485b7aef312c2", - "0x1800deef121f1e76426a00665e5c4479", - "0x674322d4f75edadd46debd5cd992f6ed", - "0x090689d0585ff075ec9e99ad690c3395", - "0xbc4b313370b38ef355acdadcd122975b", - "0x12c85ea5db8c6deb4aab71808dcb408f", - "0xe3d1e7690c43d37b4ce6cc0166fa7daa", - "0x132504eb4501a5bf6b07af56b7db0fa2", - "0xe466d6409233e66e4c91574681ba8566", - "0x16edf1040913f3d354676315f5d158d6", - "0x1ba6a7369eaac1bc4f0c2d72be31cee2", - "0x132b66f5e20b77a759f41f13a5e6b041", - "0x2c6112212e6365529f630c85192ad16f", - "0x0770c0ea6116b19864141f82724368f7", - "0xe62dc0d6b74c6235d06cd152fd8981d2", - "0x258c92380ebc5b7819f43f64398a51e1", - "0xa120ab1c39458a75df4f071d669f97d1", - "0x21268548f1cacec5a8e6204eaead3b3f", - "0xf317a4e81f0629d828e9b62d1a4e2c5e", - "0x0f326699d970d1caa67566242f7e890d", - "0xe6209956a9456136d1dc8268abbb37ed", - "0x229254d20275bc1ceb9160311563e534", - "0x219446c3d731aefb89d34d10fff95c96", - "0x22a66075e8f04e7efd62a63433a2d91d", - "0x2e5c673334cacb9339aaf16706d99466", - "0x04278698c016ccc6a0ed44a6bd596c36", - "0xfd06e50ce5e2ed5605f9f606a88ce821", - "0x0b02989b4da34883f8736e7cf91e7ffb", - "0x573732553ebd0ea9e9719e6d7ad47418", - "0x12f11cc371163663d21b72b6f86808cb", - "0x6481e1abded4465c6e15feb7a389480b", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0001", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0001", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0002", + "0x198e", "0x9393", "0x920d", "0x483a", "0x7260", "0xbfb7", "0x31fb", "0x5d25", + "0xf1aa", "0x4933", "0x35a9", "0xe712", "0x97e4", "0x85b7", "0xaef3", "0x12c2", + "0x1800", "0xdeef", "0x121f", "0x1e76", "0x426a", "0x0066", "0x5e5c", "0x4479", + "0x6743", "0x22d4", "0xf75e", "0xdadd", "0x46de", "0xbd5c", "0xd992", "0xf6ed", + "0x0906", "0x89d0", "0x585f", "0xf075", "0xec9e", "0x99ad", "0x690c", "0x3395", + "0xbc4b", "0x3133", "0x70b3", "0x8ef3", "0x55ac", "0xdadc", "0xd122", "0x975b", + "0x12c8", "0x5ea5", "0xdb8c", "0x6deb", "0x4aab", "0x7180", "0x8dcb", "0x408f", + "0xe3d1", "0xe769", "0x0c43", "0xd37b", "0x4ce6", "0xcc01", "0x66fa", "0x7daa", + "0x1325", "0x04eb", "0x4501", "0xa5bf", "0x6b07", "0xaf56", "0xb7db", "0x0fa2", + "0xe466", "0xd640", "0x9233", "0xe66e", "0x4c91", "0x5746", "0x81ba", "0x8566", + "0x16ed", "0xf104", "0x0913", "0xf3d3", "0x5467", "0x6315", "0xf5d1", "0x58d6", + "0x1ba6", "0xa736", "0x9eaa", "0xc1bc", "0x4f0c", "0x2d72", "0xbe31", "0xcee2", + "0x132b", "0x66f5", "0xe20b", "0x77a7", "0x59f4", "0x1f13", "0xa5e6", "0xb041", + "0x2c61", "0x1221", "0x2e63", "0x6552", "0x9f63", "0x0c85", "0x192a", "0xd16f", + "0x0770", "0xc0ea", "0x6116", "0xb198", "0x6414", "0x1f82", "0x7243", "0x68f7", + "0xe62d", "0xc0d6", "0xb74c", "0x6235", "0xd06c", "0xd152", "0xfd89", "0x81d2", + "0x258c", "0x9238", "0x0ebc", "0x5b78", "0x19f4", "0x3f64", "0x398a", "0x51e1", + "0xa120", "0xab1c", "0x3945", "0x8a75", "0xdf4f", "0x071d", "0x669f", "0x97d1", + "0x2126", "0x8548", "0xf1ca", "0xcec5", "0xa8e6", "0x204e", "0xaead", "0x3b3f", + "0xf317", "0xa4e8", "0x1f06", "0x29d8", "0x28e9", "0xb62d", "0x1a4e", "0x2c5e", + "0x0f32", "0x6699", "0xd970", "0xd1ca", "0xa675", "0x6624", "0x2f7e", "0x890d", + "0xe620", "0x9956", "0xa945", "0x6136", "0xd1dc", "0x8268", "0xabbb", "0x37ed", + "0x2292", "0x54d2", "0x0275", "0xbc1c", "0xeb91", "0x6031", "0x1563", "0xe534", + "0x2194", "0x46c3", "0xd731", "0xaefb", "0x89d3", "0x4d10", "0xfff9", "0x5c96", + "0x22a6", "0x6075", "0xe8f0", "0x4e7e", "0xfd62", "0xa634", "0x33a2", "0xd91d", + "0x2e5c", "0x6733", "0x34ca", "0xcb93", "0x39aa", "0xf167", "0x06d9", "0x9466", + "0x0427", "0x8698", "0xc016", "0xccc6", "0xa0ed", "0x44a6", "0xbd59", "0x6c36", + "0xfd06", "0xe50c", "0xe5e2", "0xed56", "0x05f9", "0xf606", "0xa88c", "0xe821", + "0x0b02", "0x989b", "0x4da3", "0x4883", "0xf873", "0x6e7c", "0xf91e", "0x7ffb", + "0x5737", "0x3255", "0x3ebd", "0x0ea9", "0xe971", "0x9e6d", "0x7ad4", "0x7418", + "0x12f1", "0x1cc3", "0x7116", "0x3663", "0xd21b", "0x72b6", "0xf868", "0x08cb", + "0x6481", "0xe1ab", "0xded4", "0x465c", "0x6e15", "0xfeb7", "0xa389", "0x480b", } var res field.Element - _, err := res.SetString(tbl[inputIndex%(nbG1Limbs+nbG2Limbs+2*nbGtLimbs)]) + _, err := res.SetString(tbl[inputIndex%(common.NbLimbU128*(nbG1Limbs+nbG2Limbs+2*nbGtLimbs))]) if err != nil { utils.Panic("failed to set string: %v", err) } @@ -154,47 +183,47 @@ func inputFillerFinalExp(circuitInstance, inputIndex int) field.Element { // inputs e(p, q) // result e(-p, q) * e(p, q) == 1 tbl := []string{ - "0x132504eb4501a5bf6b07af56b7db0fa2", - "0xe466d6409233e66e4c91574681ba8566", - "0x16edf1040913f3d354676315f5d158d6", - "0x1ba6a7369eaac1bc4f0c2d72be31cee2", - "0x132b66f5e20b77a759f41f13a5e6b041", - "0x2c6112212e6365529f630c85192ad16f", - "0x0770c0ea6116b19864141f82724368f7", - "0xe62dc0d6b74c6235d06cd152fd8981d2", - "0x258c92380ebc5b7819f43f64398a51e1", - "0xa120ab1c39458a75df4f071d669f97d1", - "0x21268548f1cacec5a8e6204eaead3b3f", - "0xf317a4e81f0629d828e9b62d1a4e2c5e", - "0x2131e7d907c0ce5f11dadf925202cf4f", - "0xb160d13abf2c69566a4409ae2cc1c55a", - "0x0dd1f9a0debbe40cccbee5856c1d7329", - "0x75ed23cd91401b91b24d3f05d883a0b1", - "0x0dbdedfcf84151aabaed9f824dde7f40", - "0x6925035e33a6fefa02759aafd1a368e1", - "0x2c3cc7da211ad3631763010fc427ec26", - "0x9a7a8584828edd37362696102ff01526", - "0x2561b5d7938e57a5bfdcd7398862d862", - "0x404a383c29b4bbe352aeeda95da8892f", - "0x1d7331af701b69c5e634d2ff89194f92", - "0x32ff88e5899d8430ce0a8d5f34f3b53c", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000001", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000002", - "0x198e9393920d483a7260bfb731fb5d25", - "0xf1aa493335a9e71297e485b7aef312c2", - "0x1800deef121f1e76426a00665e5c4479", - "0x674322d4f75edadd46debd5cd992f6ed", - "0x090689d0585ff075ec9e99ad690c3395", - "0xbc4b313370b38ef355acdadcd122975b", - "0x12c85ea5db8c6deb4aab71808dcb408f", - "0xe3d1e7690c43d37b4ce6cc0166fa7daa", - "0x00000000000000000000000000000000", - "0x00000000000000000000000000000001", + "0x1325", "0x04eb", "0x4501", "0xa5bf", "0x6b07", "0xaf56", "0xb7db", "0x0fa2", + "0xe466", "0xd640", "0x9233", "0xe66e", "0x4c91", "0x5746", "0x81ba", "0x8566", + "0x16ed", "0xf104", "0x0913", "0xf3d3", "0x5467", "0x6315", "0xf5d1", "0x58d6", + "0x1ba6", "0xa736", "0x9eaa", "0xc1bc", "0x4f0c", "0x2d72", "0xbe31", "0xcee2", + "0x132b", "0x66f5", "0xe20b", "0x77a7", "0x59f4", "0x1f13", "0xa5e6", "0xb041", + "0x2c61", "0x1221", "0x2e63", "0x6552", "0x9f63", "0x0c85", "0x192a", "0xd16f", + "0x0770", "0xc0ea", "0x6116", "0xb198", "0x6414", "0x1f82", "0x7243", "0x68f7", + "0xe62d", "0xc0d6", "0xb74c", "0x6235", "0xd06c", "0xd152", "0xfd89", "0x81d2", + "0x258c", "0x9238", "0x0ebc", "0x5b78", "0x19f4", "0x3f64", "0x398a", "0x51e1", + "0xa120", "0xab1c", "0x3945", "0x8a75", "0xdf4f", "0x071d", "0x669f", "0x97d1", + "0x2126", "0x8548", "0xf1ca", "0xcec5", "0xa8e6", "0x204e", "0xaead", "0x3b3f", + "0xf317", "0xa4e8", "0x1f06", "0x29d8", "0x28e9", "0xb62d", "0x1a4e", "0x2c5e", + "0x2131", "0xe7d9", "0x07c0", "0xce5f", "0x11da", "0xdf92", "0x5202", "0xcf4f", + "0xb160", "0xd13a", "0xbf2c", "0x6956", "0x6a44", "0x09ae", "0x2cc1", "0xc55a", + "0x0dd1", "0xf9a0", "0xdebb", "0xe40c", "0xccbe", "0xe585", "0x6c1d", "0x7329", + "0x75ed", "0x23cd", "0x9140", "0x1b91", "0xb24d", "0x3f05", "0xd883", "0xa0b1", + "0x0dbd", "0xedfc", "0xf841", "0x51aa", "0xbaed", "0x9f82", "0x4dde", "0x7f40", + "0x6925", "0x035e", "0x33a6", "0xfefa", "0x0275", "0x9aaf", "0xd1a3", "0x68e1", + "0x2c3c", "0xc7da", "0x211a", "0xd363", "0x1763", "0x010f", "0xc427", "0xec26", + "0x9a7a", "0x8584", "0x828e", "0xdd37", "0x3626", "0x9610", "0x2ff0", "0x1526", + "0x2561", "0xb5d7", "0x938e", "0x57a5", "0xbfdc", "0xd739", "0x8862", "0xd862", + "0x404a", "0x383c", "0x29b4", "0xbbe3", "0x52ae", "0xeda9", "0x5da8", "0x892f", + "0x1d73", "0x31af", "0x701b", "0x69c5", "0xe634", "0xd2ff", "0x8919", "0x4f92", + "0x32ff", "0x88e5", "0x899d", "0x8430", "0xce0a", "0x8d5f", "0x34f3", "0xb53c", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0001", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0002", + "0x198e", "0x9393", "0x920d", "0x483a", "0x7260", "0xbfb7", "0x31fb", "0x5d25", + "0xf1aa", "0x4933", "0x35a9", "0xe712", "0x97e4", "0x85b7", "0xaef3", "0x12c2", + "0x1800", "0xdeef", "0x121f", "0x1e76", "0x426a", "0x0066", "0x5e5c", "0x4479", + "0x6743", "0x22d4", "0xf75e", "0xdadd", "0x46de", "0xbd5c", "0xd992", "0xf6ed", + "0x0906", "0x89d0", "0x585f", "0xf075", "0xec9e", "0x99ad", "0x690c", "0x3395", + "0xbc4b", "0x3133", "0x70b3", "0x8ef3", "0x55ac", "0xdadc", "0xd122", "0x975b", + "0x12c8", "0x5ea5", "0xdb8c", "0x6deb", "0x4aab", "0x7180", "0x8dcb", "0x408f", + "0xe3d1", "0xe769", "0x0c43", "0xd37b", "0x4ce6", "0xcc01", "0x66fa", "0x7daa", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0001", } var res field.Element - _, err := res.SetString(tbl[inputIndex%(nbG1Limbs+nbG2Limbs+nbGtLimbs+2)]) + _, err := res.SetString(tbl[inputIndex%(common.NbLimbU128*(nbG1Limbs+nbG2Limbs+nbGtLimbs+2))]) if err != nil { utils.Panic("failed to set string: %v", err) } @@ -204,18 +233,18 @@ func inputFillerFinalExp(circuitInstance, inputIndex int) field.Element { func inputFillerG2Membership(circuitInstance, inputIndex int) field.Element { // g2 generator tbl := []string{ - "0x198e9393920d483a7260bfb731fb5d25", - "0xf1aa493335a9e71297e485b7aef312c2", - "0x1800deef121f1e76426a00665e5c4479", - "0x674322d4f75edadd46debd5cd992f6ed", - "0x090689d0585ff075ec9e99ad690c3395", - "0xbc4b313370b38ef355acdadcd122975b", - "0x12c85ea5db8c6deb4aab71808dcb408f", - "0xe3d1e7690c43d37b4ce6cc0166fa7daa", - "0x1", + "0x198e", "0x9393", "0x920d", "0x483a", "0x7260", "0xbfb7", "0x31fb", "0x5d25", + "0xf1aa", "0x4933", "0x35a9", "0xe712", "0x97e4", "0x85b7", "0xaef3", "0x12c2", + "0x1800", "0xdeef", "0x121f", "0x1e76", "0x426a", "0x0066", "0x5e5c", "0x4479", + "0x6743", "0x22d4", "0xf75e", "0xdadd", "0x46de", "0xbd5c", "0xd992", "0xf6ed", + "0x0906", "0x89d0", "0x585f", "0xf075", "0xec9e", "0x99ad", "0x690c", "0x3395", + "0xbc4b", "0x3133", "0x70b3", "0x8ef3", "0x55ac", "0xdadc", "0xd122", "0x975b", + "0x12c8", "0x5ea5", "0xdb8c", "0x6deb", "0x4aab", "0x7180", "0x8dcb", "0x408f", + "0xe3d1", "0xe769", "0x0c43", "0xd37b", "0x4ce6", "0xcc01", "0x66fa", "0x7daa", + "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0000", "0x0001", } var res field.Element - _, err := res.SetString(tbl[inputIndex%(nbG2Limbs+1)]) + _, err := res.SetString(tbl[inputIndex%(common.NbLimbU128*(nbG2Limbs+1))]) if err != nil { utils.Panic("failed to set string: %v", err) } diff --git a/prover/zkevm/prover/hash/generic/gen_byte_module.go b/prover/zkevm/prover/hash/generic/gen_byte_module.go index fdfb443eb5c..a96da12d896 100644 --- a/prover/zkevm/prover/hash/generic/gen_byte_module.go +++ b/prover/zkevm/prover/hash/generic/gen_byte_module.go @@ -2,17 +2,23 @@ package generic import ( "bytes" - "github.com/consensys/linea-monorepo/prover/maths/field" "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" ) -// GenericByteModule encodes the limbs with a left alignment approach -const GEN_LEFT_ALIGNMENT = 16 +const ( + // TotalLimbSize is the total size of a limb in bytes. + TotalLimbSize = 16 + // nbUnusedBytes is the number of unused bytes in of the limb + // represented by the field element. The field element is 32 bytes + // long, and the limb is 16 bytes long, so 16 bytes are unused. + nbUnusedBytes = field.Bytes - TotalLimbSize +) -// Generic byte module as specified by the arithmetization. It contains two set -// of columns, Data and Info. This module can be used for various concrete +// GenericByteModule encodes the limbs with a left alignment approach as +// specified by the arithmetization. It contains two set of columns, +// Data and Info. This module can be used for various concrete // arithmetization modules that call the hash module. type GenericByteModule struct { // Data module summarizing the information about the data to hash. @@ -24,30 +30,30 @@ type GenericByteModule struct { // GenDataModule collects the columns summarizing the information about the // data to hash. type GenDataModule struct { - HashNum ifaces.Column // identifier for the hash - Index ifaces.Column // identifier for the current limb - Limb ifaces.Column // the content of the limb to hash - NBytes ifaces.Column // indicates the size of the current limb + HashNum ifaces.Column // identifier for the hash + Index ifaces.Column // identifier for the current limb + Limbs []ifaces.Column // the content of the limbs to hash + NBytes ifaces.Column // indicates the total number of bytes to use from limbs cols ToHash ifaces.Column } // GenInfoModule collects the columns summarizing information about the result of the hash type GenInfoModule struct { - HashNum ifaces.Column // Identifier for the hash. Allows joining with the data module - HashLo ifaces.Column // The Low part of the hash result - HashHi ifaces.Column // The Hi part of the hash result - IsHashLo ifaces.Column // indicating the location of HashHi - IsHashHi ifaces.Column // indicting the location od HashLo + HashNum ifaces.Column // Identifier for the hash. Allows joining with the data module + HashLo []ifaces.Column // The Low part of the hash result + HashHi []ifaces.Column // The Hi part of the hash result + IsHashLo ifaces.Column // indicating the location of HashHi + IsHashHi ifaces.Column // indicting the location od HashLo } -// ScanStream scans the receiver GenDataModule's assignment and returns the list +// ScanStreams scans the receiver GenDataModule's assignment and returns the list // of the byte stream encoded in the assignment. func (gdm *GenDataModule) ScanStreams(run *wizard.ProverRuntime) [][]byte { var ( - numRow = gdm.Limb.Size() + numRow = gdm.Limbs[0].Size() + numСols = uint64(len(gdm.Limbs)) index = gdm.Index.GetColAssignment(run).IntoRegVecSaveAlloc() - limbs = gdm.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() toHash = gdm.ToHash.GetColAssignment(run).IntoRegVecSaveAlloc() hashNum = gdm.HashNum.GetColAssignment(run).IntoRegVecSaveAlloc() nByte = gdm.NBytes.GetColAssignment(run).IntoRegVecSaveAlloc() @@ -56,6 +62,12 @@ func (gdm *GenDataModule) ScanStreams(run *wizard.ProverRuntime) [][]byte { currHashNum field.Element ) + maxNbBytesPerLimb := (TotalLimbSize + numСols - 1) / numСols + limbs := make([][]field.Element, numСols) + for i := uint64(0); i < numСols; i++ { + limbs[i] = gdm.Limbs[i].GetColAssignment(run).IntoRegVecSaveAlloc() + } + for row := 0; row < numRow; row++ { if toHash[row].IsZero() { @@ -70,13 +82,19 @@ func (gdm *GenDataModule) ScanStreams(run *wizard.ProverRuntime) [][]byte { currHashNum = hashNum[row] } - var ( - currLimbLA = limbs[row].Bytes() // LA = left-aligned on the 16-th byte - currNbBytes = nByte[row].Uint64() - currLimb = currLimbLA[16 : 16+currNbBytes] - ) + currNbBytes := nByte[row].Uint64() + for col := uint64(0); col < numСols; col++ { + currLimb := limbs[col][row].Bytes() - buffer.Write(currLimb) + if (col+1)*maxNbBytesPerLimb <= currNbBytes { + buffer.Write(currLimb[nbUnusedBytes : nbUnusedBytes+maxNbBytesPerLimb]) + continue + } + + nonZeroBytes := currNbBytes % maxNbBytesPerLimb + buffer.Write(currLimb[nbUnusedBytes : nbUnusedBytes+nonZeroBytes]) + break + } } streams = append(streams, buffer.Bytes()) diff --git a/prover/zkevm/prover/hash/generic/gen_byte_module_test.go b/prover/zkevm/prover/hash/generic/gen_byte_module_test.go index 03dc16b252c..6b94e2c177d 100644 --- a/prover/zkevm/prover/hash/generic/gen_byte_module_test.go +++ b/prover/zkevm/prover/hash/generic/gen_byte_module_test.go @@ -4,89 +4,181 @@ import ( "testing" "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils" "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "github.com/stretchr/testify/assert" ) +type testCase struct { + name string + streams [][]byte + nbLimbsCols int + bytesPerRow int +} + func TestScanByteStream(t *testing.T) { + testCases := []testCase{ + { + name: "Single limbs column (16 bytes per row)", + streams: [][]byte{ + mustDecodeHex("0x067845465329789679797Ffed67658"), + mustDecodeHex("0xab477997edff98089860"), + }, + nbLimbsCols: 1, + bytesPerRow: 2, + }, + { + name: "2 limb columns (8 bytes per column)", + streams: [][]byte{ + mustDecodeHex("0x00112233445566778899aabbccddeeff"), + }, + nbLimbsCols: 2, + bytesPerRow: TotalLimbSize, + }, + { + name: "4 limb columns (4 bytes per column)", + streams: [][]byte{ + mustDecodeHex("0x00112233445566778899aabbccddeeff"), + }, + nbLimbsCols: 4, + bytesPerRow: TotalLimbSize, + }, + { + name: "8 limb columns (2 bytes per column)", + streams: [][]byte{ + mustDecodeHex("0x00112233445566778899aabbccddeeff"), + }, + nbLimbsCols: 8, + bytesPerRow: TotalLimbSize, + }, + { + name: "16 limb columns (1 byte per column)", + streams: [][]byte{ + mustDecodeHex("0x00112233445566778899aabbccddeeff"), + }, + nbLimbsCols: 16, + bytesPerRow: TotalLimbSize, + }, + { + name: "Mixed size streams with 4 columns", + streams: [][]byte{ + mustDecodeHex("0x00112233445566778899aabbccddeeff"), // 16 bytes - exactly one row + mustDecodeHex("0x0011223344"), // 5 bytes - partial row + mustDecodeHex("0x00112233445566778899aabbccddeeff00"), // 17 bytes - spans multiple rows + }, + nbLimbsCols: 4, + bytesPerRow: TotalLimbSize, + }, + { + name: "Uneven division with 3 columns", + streams: [][]byte{ + mustDecodeHex("0x00112233445566778899aabbccddeeff"), // 16 bytes + }, + nbLimbsCols: 3, // 16/3 = 5.33 bytes per column + bytesPerRow: TotalLimbSize, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, tc.testScanByteStream) + } +} +func (tc *testCase) testScanByteStream(t *testing.T) { var ( - mustDecodeHex = func(s string) []byte { - b, _ := utils.HexDecodeString(s) - return b - } - gdm = &GenDataModule{} - streams = [][]byte{ - mustDecodeHex("0x067845465329789679797Ffed67658"), - mustDecodeHex("0xab477997edff98089860"), - } - recoveredStreams = [][]byte{} + gdm GenDataModule + recoveredStreams [][]byte ) comp := wizard.Compile(func(build *wizard.Builder) { - - *gdm = GenDataModule{ + gdm = GenDataModule{ HashNum: build.RegisterCommit("A", 32), - Limb: build.RegisterCommit("B", 32), + Limbs: make([]ifaces.Column, tc.nbLimbsCols), ToHash: build.RegisterCommit("C", 32), NBytes: build.RegisterCommit("D", 32), Index: build.RegisterCommit("E", 32), } + + for i := 0; i < tc.nbLimbsCols; i++ { + gdm.Limbs[i] = build.RegisterCommit(ifaces.ColIDf("B_%d", i), 32) + } }) _ = wizard.Prove(comp, func(run *wizard.ProverRuntime) { - assignGdbFromStream(run, gdm, streams) + tc.assignGdbFromStream(run, &gdm) recoveredStreams = gdm.ScanStreams(run) }) - for i := range streams { + for i := range tc.streams { assert.Equalf(t, - utils.HexEncodeToString(streams[i]), + utils.HexEncodeToString(tc.streams[i]), utils.HexEncodeToString(recoveredStreams[i]), "position %v", i, ) } } -func assignGdbFromStream(run *wizard.ProverRuntime, gdm *GenDataModule, stream [][]byte) { +func (tc *testCase) assignGdbFromStream(run *wizard.ProverRuntime, gdm *GenDataModule) { + nbCols := len(gdm.Limbs) - var ( - limbs = common.NewVectorBuilder(gdm.Limb) - hashNum = common.NewVectorBuilder(gdm.HashNum) - nbBytes = common.NewVectorBuilder(gdm.NBytes) - toHash = common.NewVectorBuilder(gdm.ToHash) - index = common.NewVectorBuilder(gdm.Index) - ) + hashNum := common.NewVectorBuilder(gdm.HashNum) + nbBytes := common.NewVectorBuilder(gdm.NBytes) + toHash := common.NewVectorBuilder(gdm.ToHash) + index := common.NewVectorBuilder(gdm.Index) + + limbs := make([]*common.VectorBuilder, nbCols) + for j := 0; j < nbCols; j++ { + limbs[j] = common.NewVectorBuilder(gdm.Limbs[j]) + } - for hashID := range stream { + maxBytesPerLimb := (TotalLimbSize + nbCols - 1) / nbCols + + // Iterate over the streams in test case + for hashID, currStream := range tc.streams { ctr := 0 - currStream := stream[hashID] - for i := 0; i < len(currStream); i += 2 { + // Split the stream into rows + for i := 0; i < len(currStream); { + currRowBytes := utils.Min(len(currStream)-i, tc.bytesPerRow) + + // Split the current row into columns + for col := 0; col < nbCols; col++ { + var currLimb [field.Bytes]byte + + bytesCurrLimb := maxBytesPerLimb + if (col+1)*maxBytesPerLimb > currRowBytes { + bytesCurrLimb = currRowBytes % maxBytesPerLimb + } - var ( - currNbBytes = utils.Min(len(currStream)-i, 2) - currLimb = currStream[i : i+currNbBytes] - currLimbLA = [32]byte{} - ) + if bytesCurrLimb > 0 && i < len(currStream) { + copy(currLimb[nbUnusedBytes:], currStream[i:i+bytesCurrLimb]) + i += bytesCurrLimb + } + + limbs[col].PushLo(currLimb) + } - copy(currLimbLA[16:], currLimb[:currNbBytes]) - limbs.PushLo(currLimbLA) hashNum.PushInt(hashID + 1) index.PushInt(ctr) - nbBytes.PushInt(currNbBytes) + nbBytes.PushInt(currRowBytes) toHash.PushOne() ctr++ } - } - limbs.PadAndAssign(run, field.Zero()) + for _, limb := range limbs { + limb.PadAndAssign(run, field.Zero()) + } hashNum.PadAndAssign(run, field.Zero()) nbBytes.PadAndAssign(run, field.Zero()) toHash.PadAndAssign(run, field.Zero()) index.PadAndAssign(run) } + +func mustDecodeHex(s string) []byte { + b, _ := utils.HexDecodeString(s) + return b +} diff --git a/prover/zkevm/prover/hash/generic/testdata/gen.go b/prover/zkevm/prover/hash/generic/testdata/gen.go index 474b9b9a1c1..97263d3a7fc 100644 --- a/prover/zkevm/prover/hash/generic/testdata/gen.go +++ b/prover/zkevm/prover/hash/generic/testdata/gen.go @@ -3,36 +3,61 @@ package testdata import ( "fmt" "math/rand/v2" + "strings" "github.com/consensys/linea-monorepo/prover/backend/files" "github.com/consensys/linea-monorepo/prover/crypto/keccak" "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils" "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" ) +// SplitBytes splits the input slice into subarrays of the provided size. +func SplitBytes(input []byte, limbSize int) [][]byte { + if len(input) == 0 { + return [][]byte{} + } + + var result [][]byte + for i := 0; i < len(input); i += limbSize { + end := i + limbSize + if end > len(input) { + end = len(input) + } + result = append(result, input[i:end]) + } + return result +} + // it receives columns hashNum and toHash and generates GenDataModule. func GenerateAndAssignGenDataModule(run *wizard.ProverRuntime, gdm *generic.GenDataModule, hashNumInt, toHashInt []int, flag bool, path ...string) { var ( - size = gdm.Limb.Size() - limbs = make([]field.Element, size) + size = gdm.Limbs[0].Size() nBytes = make([]field.Element, size) toHash = make([]field.Element, size) index = make([]field.Element, size) hashNum = make([]field.Element, size) - rng = rand.New(rand.NewChaCha8([32]byte{})) + + limbs [common.NbLimbU128][]field.Element + limbCols [common.NbLimbU128]*common.VectorBuilder + + rng = rand.New(rand.NewChaCha8([32]byte{})) nByteCol = common.NewVectorBuilder(gdm.NBytes) - limbCol = common.NewVectorBuilder(gdm.Limb) hashNumCol = common.NewVectorBuilder(gdm.HashNum) toHashCol = common.NewVectorBuilder(gdm.ToHash) indexCol = common.NewVectorBuilder(gdm.Index) ) + for i := 0; i < common.NbLimbU128; i++ { + limbCols[i] = common.NewVectorBuilder(gdm.Limbs[i]) + } + for i := range hashNumInt { if i == 0 { @@ -57,16 +82,32 @@ func GenerateAndAssignGenDataModule(run *wizard.ProverRuntime, gdm *generic.GenD numBytesInt = 16 } - limbs[i] = randLimbs(rng, numBytesInt) + randElement := randLimbs(rng, numBytesInt) + limbBytes := randElement.Bytes() + dividedLimbs := SplitBytes(limbBytes[16:], 16/common.NbLimbU128) + + for j, limb := range dividedLimbs { + var bytes [16]byte + copy(bytes[:], limb) + + var l field.Element + l.SetBytes(bytes[:]) + + limbs[j] = append(limbs[j], l) + } + } - limbCol.PushSliceF(limbs) nByteCol.PushSliceF(nBytes) hashNumCol.PushSliceF(hashNum) indexCol.PushSliceF(index) toHashCol.PushSliceF(toHash) - limbCol.PadAndAssign(run) + for i, col := range limbCols { + col.PushSliceF(limbs[i]) + col.PadAndAssign(run) + } + nByteCol.PadAndAssign(run) hashNumCol.PadAndAssign(run) indexCol.PadAndAssign(run) @@ -78,12 +119,17 @@ func GenerateAndAssignGenDataModule(run *wizard.ProverRuntime, gdm *generic.GenD fmt.Fprint(oF, "TO_HASH,HASH_NUM,INDEX,NBYTES,LIMBS\n") for i := range hashNumInt { + var limbsStr []string + for _, l := range limbs[i] { + limbsStr = append(limbsStr, fmt.Sprintf("0x%s", l.Text(16))) + } + fmt.Fprintf(oF, "%v,%v,%v,%v,0x%v\n", toHash[i].String(), hashNum[i].String(), index[i].String(), nBytes[i].String(), - limbs[i].Text(16), + strings.Join(limbsStr, ","), ) } @@ -123,7 +169,11 @@ func CreateGenDataModule( createCol := common.CreateColFn(comp, name, size) gbm.HashNum = createCol("HASH_NUM") gbm.Index = createCol("INDEX") - gbm.Limb = createCol("LIMBS") + + for i := 0; i < common.NbLimbU128; i++ { + gbm.Limbs = append(gbm.Limbs, createCol("LIMBS_%d", i)) + } + gbm.NBytes = createCol("NBYTES") gbm.ToHash = createCol("TO_HASH") return gbm @@ -136,8 +186,8 @@ func CreateGenInfoModule( size int, ) (gim generic.GenInfoModule) { createCol := common.CreateColFn(comp, name, size) - gim.HashHi = createCol("HASH_HI") - gim.HashLo = createCol("HASH_LO") + gim.HashHi = []ifaces.Column{createCol("HASH_HI")} + gim.HashLo = []ifaces.Column{createCol("HASH_LO")} gim.IsHashHi = createCol("IS_HASH_HI") gim.IsHashLo = createCol("IS_HASH_LO") return gim @@ -152,8 +202,8 @@ func GenerateAndAssignGenInfoModule( ) { var ( - hashHi = common.NewVectorBuilder(gim.HashHi) - hashLo = common.NewVectorBuilder(gim.HashLo) + hashHi = common.NewVectorBuilder(gim.HashHi[0]) + hashLo = common.NewVectorBuilder(gim.HashLo[0]) isHashHiCol = common.NewVectorBuilder(gim.IsHashHi) isHashLoCol = common.NewVectorBuilder(gim.IsHashLo) ) diff --git a/prover/zkevm/prover/hash/importpad/import_pad.go b/prover/zkevm/prover/hash/importpad/import_pad.go index 80d3bcd38b2..3eb6799f636 100644 --- a/prover/zkevm/prover/hash/importpad/import_pad.go +++ b/prover/zkevm/prover/hash/importpad/import_pad.go @@ -187,8 +187,8 @@ func ImportAndPad(comp *wizard.CompiledIOP, inp ImportAndPadInputs, numRows int) projection.InsertProjection( comp, ifaces.QueryIDf("%v_IMPORT_PAD_PROJECTION", inp.Name), - []ifaces.Column{inp.Src.Data.HashNum, inp.Src.Data.Limb, inp.Src.Data.NBytes, inp.Src.Data.Index}, - []ifaces.Column{res.HashNum, res.Limbs, res.NBytes, res.Index}, + append(inp.Src.Data.Limbs, inp.Src.Data.HashNum, inp.Src.Data.NBytes, inp.Src.Data.Index), + []ifaces.Column{res.Limbs, res.HashNum, res.NBytes, res.Index}, inp.Src.Data.ToHash, res.IsInserted, ) @@ -203,7 +203,7 @@ func (imp *importation) Run(run *wizard.ProverRuntime) { sha2Count = 0 srcData = imp.Inputs.Src.Data hashNum = srcData.HashNum.GetColAssignment(run).IntoRegVecSaveAlloc() - limbs = srcData.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() + limbs = srcData.Limbs[0].GetColAssignment(run).IntoRegVecSaveAlloc() nBytes = srcData.NBytes.GetColAssignment(run).IntoRegVecSaveAlloc() index = srcData.Index.GetColAssignment(run).IntoRegVecSaveAlloc() toHash = srcData.ToHash.GetColAssignment(run).IntoRegVecSaveAlloc() diff --git a/prover/zkevm/prover/hash/importpad/import_pad_test.go b/prover/zkevm/prover/hash/importpad/import_pad_test.go index 0387fbd8ddd..22d7d21000c 100644 --- a/prover/zkevm/prover/hash/importpad/import_pad_test.go +++ b/prover/zkevm/prover/hash/importpad/import_pad_test.go @@ -7,6 +7,7 @@ import ( "github.com/consensys/linea-monorepo/prover/crypto/keccak" "github.com/consensys/linea-monorepo/prover/crypto/sha2" "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils/csvtraces" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" @@ -59,7 +60,7 @@ func TestImportAndPad(t *testing.T) { Index: inpCt.GetCommit(build, "INDEX"), ToHash: inpCt.GetCommit(build, "TO_HASH"), NBytes: inpCt.GetCommit(build, "NBYTES"), - Limb: inpCt.GetCommit(build, "LIMBS"), + Limbs: []ifaces.Column{inpCt.GetCommit(build, "LIMBS")}, }}, PaddingStrategy: uc.UseCase, } @@ -111,7 +112,7 @@ func checkPaddingAssignment(t *testing.T, run *wizard.ProverRuntime, paddingFunc var ( paddedGdm = &generic.GenDataModule{ HashNum: mod.HashNum, - Limb: mod.Limbs, + Limbs: []ifaces.Column{mod.Limbs}, NBytes: mod.NBytes, ToHash: mod.IsActive, Index: mod.Index, diff --git a/prover/zkevm/prover/hash/keccak/acc_module/data_acc.go b/prover/zkevm/prover/hash/keccak/acc_module/data_acc.go index 8019ff20a02..521577948b1 100644 --- a/prover/zkevm/prover/hash/keccak/acc_module/data_acc.go +++ b/prover/zkevm/prover/hash/keccak/acc_module/data_acc.go @@ -71,8 +71,8 @@ func NewGenericDataAccumulator(comp *wizard.CompiledIOP, inp GenericAccumulatorI for i, gbm := range d.Inputs.ProvidersData { projection.InsertProjection(comp, ifaces.QueryIDf("Stitch_Modules_%v", i), - []ifaces.Column{gbm.HashNum, gbm.Limb, gbm.NBytes, gbm.Index}, - []ifaces.Column{d.Provider.HashNum, d.Provider.Limb, d.Provider.NBytes, d.Provider.Index}, + append(gbm.Limbs, gbm.HashNum, gbm.NBytes, gbm.Index), + append(d.Provider.Limbs, d.Provider.HashNum, d.Provider.NBytes, d.Provider.Index), gbm.ToHash, d.sFilters[i], ) @@ -92,7 +92,7 @@ func (d *GenericDataAccumulator) declareColumns(comp *wizard.CompiledIOP, nbProv d.IsActive = createCol("IsActive") d.Provider.HashNum = createCol("sHashNum") - d.Provider.Limb = createCol("sLimb") + d.Provider.Limbs = []ifaces.Column{createCol("sLimb")} d.Provider.NBytes = createCol("sNBytes") d.Provider.Index = createCol("sIndex") d.Provider.ToHash = d.IsActive @@ -105,7 +105,7 @@ func (d *GenericDataAccumulator) Run(run *wizard.ProverRuntime) { asb := make([]assignmentBuilder, len(providers)) for i := range providers { asb[i].HashNum = providers[i].HashNum.GetColAssignment(run).IntoRegVecSaveAlloc() - asb[i].Limb = providers[i].Limb.GetColAssignment(run).IntoRegVecSaveAlloc() + asb[i].Limb = providers[i].Limbs[0].GetColAssignment(run).IntoRegVecSaveAlloc() asb[i].NBytes = providers[i].NBytes.GetColAssignment(run).IntoRegVecSaveAlloc() asb[i].Index = providers[i].Index.GetColAssignment(run).IntoRegVecSaveAlloc() asb[i].TO_HASH = providers[i].ToHash.GetColAssignment(run).IntoRegVecSaveAlloc() @@ -160,7 +160,7 @@ func (d *GenericDataAccumulator) Run(run *wizard.ProverRuntime) { } run.AssignColumn(d.Provider.HashNum.GetColID(), smartvectors.RightZeroPadded(sHashNum, d.size)) - run.AssignColumn(d.Provider.Limb.GetColID(), smartvectors.RightZeroPadded(sLimb, d.size)) + run.AssignColumn(d.Provider.Limbs[0].GetColID(), smartvectors.RightZeroPadded(sLimb, d.size)) run.AssignColumn(d.Provider.NBytes.GetColID(), smartvectors.RightZeroPadded(sNBytes, d.size)) run.AssignColumn(d.Provider.Index.GetColID(), smartvectors.RightZeroPadded(sIndex, d.size)) diff --git a/prover/zkevm/prover/hash/keccak/acc_module/info_acc.go b/prover/zkevm/prover/hash/keccak/acc_module/info_acc.go index 90dec74f666..fd056e84585 100644 --- a/prover/zkevm/prover/hash/keccak/acc_module/info_acc.go +++ b/prover/zkevm/prover/hash/keccak/acc_module/info_acc.go @@ -60,15 +60,15 @@ func NewGenericInfoAccumulator(comp *wizard.CompiledIOP, inp GenericAccumulatorI for i, gbm := range info.Inputs.ProvidersInfo { projection.InsertProjection(comp, ifaces.QueryIDf("Stitch_Modules_Hi_%v", i), - []ifaces.Column{gbm.HashHi}, - []ifaces.Column{info.Provider.HashHi}, + gbm.HashHi, + info.Provider.HashHi, gbm.IsHashHi, info.sFilters[i], ) projection.InsertProjection(comp, ifaces.QueryIDf("Stitch_Modules_Lo_%v", i), - []ifaces.Column{gbm.HashLo}, - []ifaces.Column{info.Provider.HashLo}, + gbm.HashLo, + info.Provider.HashLo, gbm.IsHashLo, info.sFilters[i], ) @@ -87,8 +87,8 @@ func (info *GenericInfoAccumulator) declareColumns(comp *wizard.CompiledIOP, nbP info.sFilters[i] = createCol("sFilterOut_%v", i) } - info.Provider.HashHi = createCol("Hash_Hi") - info.Provider.HashLo = createCol("Hash_Lo") + info.Provider.HashHi = []ifaces.Column{createCol("Hash_Hi")} + info.Provider.HashLo = []ifaces.Column{createCol("Hash_Lo")} info.Provider.IsHashHi = info.IsActive info.Provider.IsHashLo = info.IsActive @@ -100,8 +100,8 @@ func (info *GenericInfoAccumulator) Run(run *wizard.ProverRuntime) { providers := info.Inputs.ProvidersInfo asb := make([]infoAssignmentBuilder, len(providers)) for i := range providers { - asb[i].hashHi = providers[i].HashHi.GetColAssignment(run).IntoRegVecSaveAlloc() - asb[i].hashLo = providers[i].HashLo.GetColAssignment(run).IntoRegVecSaveAlloc() + asb[i].hashHi = providers[i].HashHi[0].GetColAssignment(run).IntoRegVecSaveAlloc() + asb[i].hashLo = providers[i].HashLo[0].GetColAssignment(run).IntoRegVecSaveAlloc() asb[i].isHashHi = providers[i].IsHashHi.GetColAssignment(run).IntoRegVecSaveAlloc() asb[i].isHashLo = providers[i].IsHashLo.GetColAssignment(run).IntoRegVecSaveAlloc() } @@ -152,8 +152,8 @@ func (info *GenericInfoAccumulator) Run(run *wizard.ProverRuntime) { } } - run.AssignColumn(info.Provider.HashHi.GetColID(), smartvectors.RightZeroPadded(sHashHi, info.size)) - run.AssignColumn(info.Provider.HashLo.GetColID(), smartvectors.RightZeroPadded(sHashLo, info.size)) + run.AssignColumn(info.Provider.HashHi[0].GetColID(), smartvectors.RightZeroPadded(sHashHi, info.size)) + run.AssignColumn(info.Provider.HashLo[0].GetColID(), smartvectors.RightZeroPadded(sHashLo, info.size)) } diff --git a/prover/zkevm/prover/hash/keccak/acc_module/info_acc_test.go b/prover/zkevm/prover/hash/keccak/acc_module/info_acc_test.go index d93b725e108..24df2ba30d9 100644 --- a/prover/zkevm/prover/hash/keccak/acc_module/info_acc_test.go +++ b/prover/zkevm/prover/hash/keccak/acc_module/info_acc_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" @@ -27,8 +28,8 @@ func makeTestCaseInfoModule(c []makeInfoTestCase) ( for i := range gdms { createCol := common.CreateColFn(comp, "TESTING_INFO_ACCUMULATOR", c[i].Size) gdms[i] = generic.GenInfoModule{ - HashHi: createCol("Hash_Hi_%v", i), - HashLo: createCol("Hash_Lo_%v", i), + HashHi: []ifaces.Column{createCol("Hash_Hi_%v", i)}, + HashLo: []ifaces.Column{createCol("Hash_Lo_%v", i)}, IsHashLo: createCol("Is_Hash_Lo_%v", i), IsHashHi: createCol("Is_Hash_Hi_%v", i), } @@ -94,8 +95,8 @@ var infoTestCases = []makeInfoTestCase{ } func generateAndAssignGenInfoModule(run *wizard.ProverRuntime, gbm *generic.GenInfoModule, c makeInfoTestCase) { - hashHi := common.NewVectorBuilder(gbm.HashHi) - hashLo := common.NewVectorBuilder(gbm.HashLo) + hashHi := common.NewVectorBuilder(gbm.HashHi[0]) + hashLo := common.NewVectorBuilder(gbm.HashLo[0]) isHashHi := common.NewVectorBuilder(gbm.IsHashHi) isHashLo := common.NewVectorBuilder(gbm.IsHashLo) for i := range c.HashHi { diff --git a/prover/zkevm/prover/hash/keccak/keccak_single_provider.go b/prover/zkevm/prover/hash/keccak/keccak_single_provider.go index 931f652f0a8..4bca1979827 100644 --- a/prover/zkevm/prover/hash/keccak/keccak_single_provider.go +++ b/prover/zkevm/prover/hash/keccak/keccak_single_provider.go @@ -84,13 +84,13 @@ func NewKeccakSingleProvider(comp *wizard.CompiledIOP, inp KeccakSingleProviderI projection.InsertProjection(comp, "KECCAK_RES_HI", []ifaces.Column{cKeccak.HashHi}, - []ifaces.Column{inp.Provider.Info.HashHi}, + inp.Provider.Info.HashHi, cKeccak.IsActive, inp.Provider.Info.IsHashHi, ) projection.InsertProjection(comp, "KECCAK_RES_LO", []ifaces.Column{cKeccak.HashLo}, - []ifaces.Column{inp.Provider.Info.HashLo}, + inp.Provider.Info.HashLo, cKeccak.IsActive, inp.Provider.Info.IsHashLo, ) diff --git a/prover/zkevm/prover/hash/keccak/keccak_zkevm.go b/prover/zkevm/prover/hash/keccak/keccak_zkevm.go index 8b9b073cc21..90207106d50 100644 --- a/prover/zkevm/prover/hash/keccak/keccak_zkevm.go +++ b/prover/zkevm/prover/hash/keccak/keccak_zkevm.go @@ -7,6 +7,7 @@ package keccak import ( "github.com/consensys/linea-monorepo/prover/protocol/column" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic" gen_acc "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/keccak/acc_module" @@ -88,14 +89,14 @@ func getShakiraArithmetization(comp *wizard.CompiledIOP) generic.GenericByteModu Data: generic.GenDataModule{ HashNum: comp.Columns.GetHandle("shakiradata.ID"), Index: comp.Columns.GetHandle("shakiradata.INDEX"), - Limb: comp.Columns.GetHandle("shakiradata.LIMB"), + Limbs: []ifaces.Column{comp.Columns.GetHandle("shakiradata.LIMB")}, NBytes: comp.Columns.GetHandle("shakiradata.nBYTES"), ToHash: comp.Columns.GetHandle("shakiradata.IS_KECCAK_DATA"), }, Info: generic.GenInfoModule{ HashNum: comp.Columns.GetHandle("shakiradata.ID"), - HashLo: comp.Columns.GetHandle("shakiradata.LIMB"), - HashHi: comp.Columns.GetHandle("shakiradata.LIMB"), + HashLo: []ifaces.Column{comp.Columns.GetHandle("shakiradata.LIMB")}, + HashHi: []ifaces.Column{comp.Columns.GetHandle("shakiradata.LIMB")}, IsHashLo: column.Shift(comp.Columns.GetHandle("shakiradata.SELECTOR_KECCAK_RES_HI"), -1), IsHashHi: comp.Columns.GetHandle("shakiradata.SELECTOR_KECCAK_RES_HI"), }, @@ -107,14 +108,14 @@ func getRlpAddArithmetization(comp *wizard.CompiledIOP) generic.GenericByteModul Data: generic.GenDataModule{ HashNum: comp.Columns.GetHandle("rlpaddr.STAMP"), Index: comp.Columns.GetHandle("rlpaddr.INDEX"), - Limb: comp.Columns.GetHandle("rlpaddr.LIMB"), + Limbs: []ifaces.Column{comp.Columns.GetHandle("rlpaddr.LIMB")}, NBytes: comp.Columns.GetHandle("rlpaddr.nBYTES"), ToHash: comp.Columns.GetHandle("rlpaddr.LC"), }, Info: generic.GenInfoModule{ HashNum: comp.Columns.GetHandle("rlpaddr.STAMP"), - HashLo: comp.Columns.GetHandle("rlpaddr.DEP_ADDR_LO"), - HashHi: comp.Columns.GetHandle("rlpaddr.RAW_ADDR_HI"), + HashLo: []ifaces.Column{comp.Columns.GetHandle("rlpaddr.DEP_ADDR_LO")}, + HashHi: []ifaces.Column{comp.Columns.GetHandle("rlpaddr.RAW_ADDR_HI")}, IsHashLo: comp.Columns.GetHandle("rlpaddr.SELECTOR_KECCAK_RES"), IsHashHi: comp.Columns.GetHandle("rlpaddr.SELECTOR_KECCAK_RES"), }, diff --git a/prover/zkevm/prover/hash/sha2/sha2.go b/prover/zkevm/prover/hash/sha2/sha2.go index 6e16837a217..4b2f5c94f90 100644 --- a/prover/zkevm/prover/hash/sha2/sha2.go +++ b/prover/zkevm/prover/hash/sha2/sha2.go @@ -48,14 +48,14 @@ func NewSha2ZkEvm(comp *wizard.CompiledIOP, s Settings) *Sha2SingleProvider { Data: generic.GenDataModule{ HashNum: comp.Columns.GetHandle("shakiradata.ID"), Index: comp.Columns.GetHandle("shakiradata.INDEX"), - Limb: comp.Columns.GetHandle("shakiradata.LIMB"), + Limbs: []ifaces.Column{comp.Columns.GetHandle("shakiradata.LIMB")}, NBytes: comp.Columns.GetHandle("shakiradata.nBYTES"), ToHash: comp.Columns.GetHandle("shakiradata.IS_SHA2_DATA"), }, Info: generic.GenInfoModule{ HashNum: comp.Columns.GetHandle("shakiradata.ID"), - HashLo: comp.Columns.GetHandle("shakiradata.LIMB"), - HashHi: comp.Columns.GetHandle("shakiradata.LIMB"), + HashLo: []ifaces.Column{comp.Columns.GetHandle("shakiradata.LIMB")}, + HashHi: []ifaces.Column{comp.Columns.GetHandle("shakiradata.LIMB")}, IsHashLo: column.Shift(comp.Columns.GetHandle("shakiradata.SELECTOR_SHA2_RES_HI"), -1), IsHashHi: comp.Columns.GetHandle("shakiradata.SELECTOR_SHA2_RES_HI"), }, @@ -114,13 +114,13 @@ func newSha2SingleProvider(comp *wizard.CompiledIOP, inp Sha2SingleProviderInput projection.InsertProjection(comp, "SHA2_RES_HI", []ifaces.Column{cSha2.HashHi}, - []ifaces.Column{inp.Provider.Info.HashHi}, + inp.Provider.Info.HashHi, cSha2.IsEffFirstLaneOfNewHash, inp.Provider.Info.IsHashHi, ) projection.InsertProjection(comp, "SHA2_RES_LO", []ifaces.Column{cSha2.HashLo}, - []ifaces.Column{inp.Provider.Info.HashLo}, + inp.Provider.Info.HashLo, cSha2.IsEffFirstLaneOfNewHash, inp.Provider.Info.IsHashLo, ) diff --git a/prover/zkevm/prover/modexp/circuit.go b/prover/zkevm/prover/modexp/circuit.go index 173f17965d7..7744af2e9a6 100644 --- a/prover/zkevm/prover/modexp/circuit.go +++ b/prover/zkevm/prover/modexp/circuit.go @@ -7,6 +7,7 @@ import ( "github.com/consensys/gnark/std/math/emulated" "github.com/consensys/gnark/std/math/emulated/emparams" "github.com/consensys/linea-monorepo/prover/utils" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) const ( @@ -16,7 +17,7 @@ const ( // limbSize is the size (in bits) of a limb as in the public inputs of the // circuit. This is a parameter linked to how the arithmetization encodes // 256 bits integers. - limbSizeBits = 128 + limbSizeBits = 16 ) // modexpCircuit implements the [frontend.Circuit] interface and is responsible @@ -36,10 +37,10 @@ type modexpCircuit struct { // // The operands are represented in limbs of 16 bytes. type modexpCircuitInstance struct { - Base []frontend.Variable `gnark:",public"` - Exponent []frontend.Variable `gnark:",public"` - Modulus []frontend.Variable `gnark:",public"` - Result []frontend.Variable `gnark:",public"` + Base [common.NbLimbU128][]frontend.Variable `gnark:",public"` + Exponent [common.NbLimbU128][]frontend.Variable `gnark:",public"` + Modulus [common.NbLimbU128][]frontend.Variable `gnark:",public"` + Result [common.NbLimbU128][]frontend.Variable `gnark:",public"` } // allocate256Bits allocates [modexpCircuit] for n instances assuming the 256-bit @@ -58,10 +59,12 @@ func allocateCircuit(n int, numBits int) *modexpCircuit { ) for i := range res.Instances { - res.Instances[i].Base = make([]frontend.Variable, numLimbs) - res.Instances[i].Exponent = make([]frontend.Variable, numLimbs) - res.Instances[i].Modulus = make([]frontend.Variable, numLimbs) - res.Instances[i].Result = make([]frontend.Variable, numLimbs) + for j := range common.NbLimbU128 { + res.Instances[i].Base[j] = make([]frontend.Variable, numLimbs) + res.Instances[i].Exponent[j] = make([]frontend.Variable, numLimbs) + res.Instances[i].Modulus[j] = make([]frontend.Variable, numLimbs) + res.Instances[i].Result[j] = make([]frontend.Variable, numLimbs) + } } return res diff --git a/prover/zkevm/prover/modexp/input.go b/prover/zkevm/prover/modexp/input.go index 6162b1360d9..ce5d5bd4fc5 100644 --- a/prover/zkevm/prover/modexp/input.go +++ b/prover/zkevm/prover/modexp/input.go @@ -5,9 +5,10 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "github.com/consensys/linea-monorepo/prover/protocol/wizard" sym "github.com/consensys/linea-monorepo/prover/symbolic" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) -// input collects references to the columns of the arithmetization containing +// Input collects references to the columns of the arithmetization containing // the Modexp statements. These columns are constrained via a projection query // to describe the same statement as what is being stated in the antichamber // module. They are also used as a data source to assign the columns of the @@ -28,7 +29,7 @@ type Input struct { // 4 above columns. isModExp ifaces.Column // Multiplexed column containing limbs for base, exponent, modulus, and result - Limbs ifaces.Column + Limbs [common.NbLimbU128]ifaces.Column } type Settings struct { @@ -36,14 +37,19 @@ type Settings struct { } func newZkEVMInput(comp *wizard.CompiledIOP, settings Settings) Input { - return Input{ + input := Input{ Settings: settings, IsModExpBase: comp.Columns.GetHandle("blake2fmodexpdata.IS_MODEXP_BASE"), IsModExpExponent: comp.Columns.GetHandle("blake2fmodexpdata.IS_MODEXP_EXPONENT"), IsModExpModulus: comp.Columns.GetHandle("blake2fmodexpdata.IS_MODEXP_MODULUS"), IsModExpResult: comp.Columns.GetHandle("blake2fmodexpdata.IS_MODEXP_RESULT"), - Limbs: comp.Columns.GetHandle("blake2fmodexpdata.LIMB"), } + + for i := range common.NbLimbU128 { + input.Limbs[i] = comp.Columns.GetHandle(ifaces.ColIDf("blake2fmodexpdata.LIMB_%d", i)) + } + + return input } // setIsModexp constructs, constraints and set the [isModexpColumn] diff --git a/prover/zkevm/prover/modexp/module.go b/prover/zkevm/prover/modexp/module.go index fbe05a69b2b..996e6b0ca4b 100644 --- a/prover/zkevm/prover/modexp/module.go +++ b/prover/zkevm/prover/modexp/module.go @@ -1,6 +1,7 @@ package modexp import ( + "fmt" "github.com/consensys/linea-monorepo/prover/maths/common/smartvectors" "github.com/consensys/linea-monorepo/prover/maths/field" "github.com/consensys/linea-monorepo/prover/protocol/column" @@ -11,6 +12,7 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/wizard" sym "github.com/consensys/linea-monorepo/prover/symbolic" "github.com/consensys/linea-monorepo/prover/utils" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) const ( @@ -43,7 +45,7 @@ type Module struct { // Limb contains the modexp arguments and is subjected to a projection // constraint from the BLK_MDXP (using IsActive as filter). It is constrained // to zero when IsActive = 0. - Limbs ifaces.Column + Limbs [common.NbLimbU128]ifaces.Column // LsbIndicator is a precomputed column marking with a 1 the last two limbs // of every operands. The column is precomputed because all Modexp provided // by the arithmetization have exactly the same layout. @@ -59,6 +61,12 @@ type Module struct { // production, it will be always set to true. But for convenience we omit // the circuit in some of the test as this is CPU intensive. hasCircuit bool + // flattenLimbsSmall is a helper structure used to flatten the limbs columns + // of the small modexp instances into a single column. + flattenLimbsSmall *common.FlattenColumn + // flattenLimbsLarge is a helper structure used to flatten the limbs columns + // of the large modexp instances into a single column. + flattenLimbsLarge *common.FlattenColumn } // NewModuleZkEvm constructs an instance of the modexp module. It should be called @@ -82,7 +90,6 @@ func newModule(comp *wizard.CompiledIOP, input Input) *Module { MaxNb256BitsInstances: settings.MaxNbInstance256, MaxNb4096BitsInstances: settings.MaxNbInstance4096, IsActive: comp.InsertCommit(0, "MODEXP_IS_ACTIVE", size), - Limbs: comp.InsertCommit(0, "MODEXP_LIMBS", size), IsSmall: comp.InsertCommit(0, "MODEXP_IS_SMALL", size), IsLarge: comp.InsertCommit(0, "MODEXP_IS_LARGE", size), LsbIndicator: comp.InsertPrecomputed("MODEXP_LSB_INDICATOR", lsbIndicatorValue(size)), @@ -90,6 +97,10 @@ func newModule(comp *wizard.CompiledIOP, input Input) *Module { } ) + for i := 0; i < common.NbLimbU128; i++ { + mod.Limbs[i] = comp.InsertCommit(0, ifaces.ColIDf("MODEXP_LIMBS_%d", i), size) + } + mod.Input.setIsModexp(comp) mod.csIsActive(comp) @@ -98,9 +109,9 @@ func newModule(comp *wizard.CompiledIOP, input Input) *Module { projection.InsertProjection( comp, - "MODEXP_BLKMDXP_PROJECTION", - []ifaces.Column{mod.Input.Limbs}, - []ifaces.Column{mod.Limbs}, + ifaces.QueryID(fmt.Sprintf("MODEXP_BLKMDXP_PROJECTION")), + mod.Input.Limbs[:], + mod.Limbs[:], mod.Input.isModExp, mod.IsActive, ) @@ -108,18 +119,24 @@ func newModule(comp *wizard.CompiledIOP, input Input) *Module { return mod } -// WithCircuits adds the Plonk-in-Wizard circuit verification to complete +// WithCircuit adds the Plonk-in-Wizard circuit verification to complete // the anti-chamber. func (mod *Module) WithCircuit(comp *wizard.CompiledIOP, options ...plonk.Option) *Module { mod.hasCircuit = true + mod.flattenLimbsSmall = common.NewFlattenColumn(comp, common.NbLimbU128, mod.Limbs[:], mod.ToSmallCirc) + mod.flattenLimbsLarge = common.NewFlattenColumn(comp, common.NbLimbU128, mod.Limbs[:], mod.IsLarge) + + mod.flattenLimbsSmall.CsFlattenProjection(comp) + mod.flattenLimbsLarge.CsFlattenProjection(comp) + mod.GnarkCircuitConnector256Bits = plonk.DefineAlignment( comp, &plonk.CircuitAlignmentInput{ Name: "MODEXP_256_BITS", - DataToCircuit: mod.Limbs, - DataToCircuitMask: mod.ToSmallCirc, + DataToCircuit: mod.flattenLimbsSmall.Limbs(), + DataToCircuitMask: mod.flattenLimbsSmall.Mask(), Circuit: allocateCircuit(nbInstancePerCircuit256, 256), NbCircuitInstances: utils.DivCeil(mod.MaxNb256BitsInstances, nbInstancePerCircuit256), PlonkOptions: options, @@ -130,8 +147,8 @@ func (mod *Module) WithCircuit(comp *wizard.CompiledIOP, options ...plonk.Option comp, &plonk.CircuitAlignmentInput{ Name: "MODEXP_4096_BITS", - DataToCircuit: mod.Limbs, - DataToCircuitMask: mod.IsLarge, + DataToCircuit: mod.flattenLimbsLarge.Limbs(), + DataToCircuitMask: mod.flattenLimbsLarge.Mask(), Circuit: allocateCircuit(nbInstancePerCircuit4096, 4096), NbCircuitInstances: utils.DivCeil(mod.MaxNb4096BitsInstances, nbInstancePerCircuit4096), PlonkOptions: options, @@ -227,15 +244,17 @@ func (mod *Module) csIsSmallAndLarge(comp *wizard.CompiledIOP) { // not be wrong to supply // - comp.InsertGlobal( - 0, - "MODEXP_IS_SMALL_IMPLIES_SMALL_OPERANDS", - sym.Mul( - mod.Limbs, - mod.IsSmall, - sym.Sub(1, mod.LsbIndicator), - ), - ) + for i := 0; i < common.NbLimbU128; i++ { + comp.InsertGlobal( + 0, + ifaces.QueryIDf("MODEXP_IS_SMALL_IMPLIES_SMALL_OPERANDS_%d", i), + sym.Mul( + mod.Limbs[i], + mod.IsSmall, + sym.Sub(1, mod.LsbIndicator), + ), + ) + } } // csToCirc ensures the well-construction of ant.ToSmallCirc @@ -272,14 +291,15 @@ func mustBeBinary(comp *wizard.CompiledIOP, c ifaces.Column) { // mustCancelWhenBinCancel enforces to 'c' to be zero when the binary column // `bin` is zero. The constraint does not work if bin is not constrained to be // binary. -func mustCancelWhenBinCancel(comp *wizard.CompiledIOP, bin, c ifaces.Column) { - - comp.InsertGlobal( - 0, - ifaces.QueryIDf("%v_CANCEL_WHEN_NOT_%v", c.GetColID(), bin.GetColID()), - sym.Mul( - sym.Sub(1, bin), - c, - ), - ) +func mustCancelWhenBinCancel(comp *wizard.CompiledIOP, bin ifaces.Column, c [common.NbLimbU128]ifaces.Column) { + for i := range common.NbLimbU128 { + comp.InsertGlobal( + 0, + ifaces.QueryIDf("%v_CANCEL_WHEN_NOT_%v", c[i].GetColID(), bin.GetColID()), + sym.Mul( + sym.Sub(1, bin), + c[i], + ), + ) + } } diff --git a/prover/zkevm/prover/modexp/module_assignement.go b/prover/zkevm/prover/modexp/module_assignement.go index 7c3f1fbbce3..ba96cf0f92c 100644 --- a/prover/zkevm/prover/modexp/module_assignement.go +++ b/prover/zkevm/prover/modexp/module_assignement.go @@ -1,11 +1,11 @@ package modexp import ( + "github.com/consensys/linea-monorepo/prover/utils" "os" "github.com/consensys/linea-monorepo/prover/maths/field" "github.com/consensys/linea-monorepo/prover/protocol/wizard" - "github.com/consensys/linea-monorepo/prover/utils" "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "github.com/sirupsen/logrus" ) @@ -16,7 +16,7 @@ type antichamberAssignment struct { isActive *common.VectorBuilder isSmall *common.VectorBuilder isLarge *common.VectorBuilder - limbs *common.VectorBuilder + limbs [common.NbLimbU128]*common.VectorBuilder toSmallCirc *common.VectorBuilder } @@ -29,17 +29,24 @@ func (mod *Module) Assign(run *wizard.ProverRuntime) { modexpCountSmall int = 0 modexpCountLarge int = 0 isModexp = mod.Input.isModExp.GetColAssignment(run).IntoRegVecSaveAlloc() - limbs = mod.Input.Limbs.GetColAssignment(run).IntoRegVecSaveAlloc() - builder = antichamberAssignment{ + + builder = antichamberAssignment{ isActive: common.NewVectorBuilder(mod.IsActive), isSmall: common.NewVectorBuilder(mod.IsSmall), isLarge: common.NewVectorBuilder(mod.IsLarge), - limbs: common.NewVectorBuilder(mod.Limbs), toSmallCirc: common.NewVectorBuilder(mod.ToSmallCirc), } ) - for currPosition := 0; currPosition < len(limbs); { + // Retrieve the limbs assignment and initialize the limb builders + var limbs [common.NbLimbU128][]field.Element + for i := range common.NbLimbU128 { + limbs[i] = mod.Input.Limbs[i].GetColAssignment(run).IntoRegVecSaveAlloc() + builder.limbs[i] = common.NewVectorBuilder(mod.Limbs[i]) + } + + limbSize := len(limbs[0]) + for currPosition := 0; currPosition < limbSize; { if isModexp[currPosition].IsZero() { currPosition++ @@ -48,16 +55,23 @@ func (mod *Module) Assign(run *wizard.ProverRuntime) { // This sanity-check is purely defensive and will indicate that we // missed the start of a Modexp instance - if len(limbs)-currPosition < modexpNumRowsPerInstance { - utils.Panic("A new modexp is starting but there is not enough rows (currPosition=%v len(ecdata.Limb)=%v)", currPosition, len(limbs)) + for i := range common.NbLimbU128 { + if len(limbs[i])-currPosition < modexpNumRowsPerInstance { + utils.Panic("A new modexp is starting but there is not enough rows (currPosition=%v len(ecdata.Limb)=%v)", currPosition, len(limbs)) + } } isLarge := false // An instance is considered large if any of the operand has more than - // 2 16-bytes limbs. + // 2 16-bytes limbs (or 16 2-bytes limbs). for k := 0; k < modexpNumRowsPerInstance; k++ { - if k%32 < 30 && !limbs[currPosition+k].IsZero() { + isZeroLimbs := true + for i := range common.NbLimbU128 { + isZeroLimbs = isZeroLimbs && limbs[i][currPosition+k].IsZero() + } + + if k%32 < 30 && !isZeroLimbs { isLarge = true break } @@ -74,7 +88,10 @@ func (mod *Module) Assign(run *wizard.ProverRuntime) { builder.isActive.PushOne() builder.isSmall.PushBoolean(!isLarge) builder.isLarge.PushBoolean(isLarge) - builder.limbs.PushField(limbs[currPosition+k]) + + for i := range common.NbLimbU128 { + builder.limbs[i].PushField(limbs[i][currPosition+k]) + } if !isLarge && k%32 >= 30 { builder.toSmallCirc.PushOne() @@ -99,12 +116,17 @@ func (mod *Module) Assign(run *wizard.ProverRuntime) { builder.isActive.PadAndAssign(run, field.Zero()) builder.isSmall.PadAndAssign(run, field.Zero()) builder.isLarge.PadAndAssign(run, field.Zero()) - builder.limbs.PadAndAssign(run, field.Zero()) builder.toSmallCirc.PadAndAssign(run, field.Zero()) + for i := range common.NbLimbU128 { + builder.limbs[i].PadAndAssign(run, field.Zero()) + } // It is possible to not declare the circuit (for testing purpose) in that // case we skip the corresponding assignment part. if mod.hasCircuit { + mod.flattenLimbsSmall.Run(run) + mod.flattenLimbsLarge.Run(run) + mod.GnarkCircuitConnector256Bits.Assign(run) mod.GnarkCircuitConnector4096Bits.Assign(run) } diff --git a/prover/zkevm/prover/modexp/module_test.go b/prover/zkevm/prover/modexp/module_test.go index 5af2196e7e5..18cb20b6671 100644 --- a/prover/zkevm/prover/modexp/module_test.go +++ b/prover/zkevm/prover/modexp/module_test.go @@ -1,11 +1,14 @@ package modexp import ( + "fmt" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "testing" "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils/csvtraces" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) func TestModExpAntichamber(t *testing.T) { @@ -34,12 +37,17 @@ func TestModExpAntichamber(t *testing.T) { ) cmp := wizard.Compile(func(build *wizard.Builder) { + var limbs [common.NbLimbU128]ifaces.Column + for i := 0; i < common.NbLimbU128; i++ { + limbs[i] = inpCt.GetCommit(build, fmt.Sprintf("LIMBS_%d", i)) + } + inp = Input{ IsModExpBase: inpCt.GetCommit(build, "IS_MODEXP_BASE"), IsModExpExponent: inpCt.GetCommit(build, "IS_MODEXP_EXPONENT"), IsModExpModulus: inpCt.GetCommit(build, "IS_MODEXP_MODULUS"), IsModExpResult: inpCt.GetCommit(build, "IS_MODEXP_RESULT"), - Limbs: inpCt.GetCommit(build, "LIMBS"), + Limbs: limbs, Settings: Settings{MaxNbInstance256: 1, MaxNbInstance4096: 1}, } @@ -48,23 +56,24 @@ func TestModExpAntichamber(t *testing.T) { proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) { - inpCt.Assign(run, - "LIMBS", - "IS_MODEXP_BASE", - "IS_MODEXP_EXPONENT", - "IS_MODEXP_MODULUS", - "IS_MODEXP_RESULT", - ) + var names []string + for i := 0; i < common.NbLimbU128; i++ { + names = append(names, fmt.Sprintf("LIMBS_%d", i)) + } + + names = append(names, "IS_MODEXP_BASE", "IS_MODEXP_EXPONENT", "IS_MODEXP_MODULUS", "IS_MODEXP_RESULT") + inpCt.Assign(run, names...) mod.Assign(run) - modCt.CheckAssignment(run, - "MODEXP_LIMBS", - "MODEXP_IS_ACTIVE", - "MODEXP_IS_SMALL", - "MODEXP_IS_LARGE", - "MODEXP_TO_SMALL_CIRC", - ) + var moduleNames []string + for i := 0; i < common.NbLimbU128; i++ { + moduleNames = append(moduleNames, fmt.Sprintf("MODEXP_LIMBS_%d", i)) + } + + moduleNames = append(moduleNames, "MODEXP_IS_ACTIVE", "MODEXP_IS_SMALL", "MODEXP_IS_LARGE", "MODEXP_TO_SMALL_CIRC") + + modCt.CheckAssignment(run, moduleNames...) }) if err := wizard.Verify(cmp, proof); err != nil { diff --git a/prover/zkevm/prover/modexp/module_with_circuit_test.go b/prover/zkevm/prover/modexp/module_with_circuit_test.go index 1d68a3311f0..ded6e746eca 100644 --- a/prover/zkevm/prover/modexp/module_with_circuit_test.go +++ b/prover/zkevm/prover/modexp/module_with_circuit_test.go @@ -3,12 +3,15 @@ package modexp import ( + "fmt" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" "testing" "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils/csvtraces" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" ) func TestModexpWithCircuit(t *testing.T) { @@ -36,12 +39,17 @@ func TestModexpWithCircuit(t *testing.T) { ) cmp := wizard.Compile(func(build *wizard.Builder) { + var limbs [common.NbLimbU128]ifaces.Column + for i := 0; i < common.NbLimbU128; i++ { + limbs[i] = inpCt.GetCommit(build, fmt.Sprintf("LIMBS_%d", i)) + } + inp = Input{ IsModExpBase: inpCt.GetCommit(build, "IS_MODEXP_BASE"), IsModExpExponent: inpCt.GetCommit(build, "IS_MODEXP_EXPONENT"), IsModExpModulus: inpCt.GetCommit(build, "IS_MODEXP_MODULUS"), IsModExpResult: inpCt.GetCommit(build, "IS_MODEXP_RESULT"), - Limbs: inpCt.GetCommit(build, "LIMBS"), + Limbs: limbs, Settings: Settings{MaxNbInstance256: 1, MaxNbInstance4096: 1}, } @@ -51,13 +59,14 @@ func TestModexpWithCircuit(t *testing.T) { proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) { - inpCt.Assign(run, - "LIMBS", - "IS_MODEXP_BASE", - "IS_MODEXP_EXPONENT", - "IS_MODEXP_MODULUS", - "IS_MODEXP_RESULT", - ) + var names []string + for i := 0; i < common.NbLimbU128; i++ { + names = append(names, fmt.Sprintf("LIMBS_%d", i)) + } + + names = append(names, "IS_MODEXP_BASE", "IS_MODEXP_EXPONENT", "IS_MODEXP_MODULUS", "IS_MODEXP_RESULT") + + inpCt.Assign(run, names...) mod.Assign(run) }) diff --git a/prover/zkevm/prover/modexp/testdata/main.go b/prover/zkevm/prover/modexp/testdata/main.go index a0fc7813873..e773c2fe284 100644 --- a/prover/zkevm/prover/modexp/testdata/main.go +++ b/prover/zkevm/prover/modexp/testdata/main.go @@ -1,160 +1,130 @@ package main import ( + "encoding/csv" "fmt" - "io" - "math/big" - "math/rand/v2" - - "github.com/consensys/gnark/std/math/emulated/emparams" - "github.com/consensys/linea-monorepo/prover/backend/files" + "os" ) -func main() { - - for _, tcase := range testCases { - f := files.MustOverwrite("./" + tcase.name + "_input.csv") - dumpAsCsv(f, tcase.tab) - f.Close() - } -} +// Data represents a row in the CSV file -var testCases = []struct { - name string - tab [][]*big.Int -}{ - { - name: "single_256_bits", - tab: func() [][]*big.Int { - - var ( - tab = make([][]*big.Int, 5) - rng = rand.New(rand.NewChaCha8([32]byte{})) - inst = createRandomModexp(rng, false) - ) - - pushModexpToInput(inst, tab) - return tab - }(), - }, - { - name: "single_4096_bits", - tab: func() [][]*big.Int { - - var ( - tab = make([][]*big.Int, 5) - rng = rand.New(rand.NewChaCha8([32]byte{})) - inst = createRandomModexp(rng, true) - ) - - pushModexpToInput(inst, tab) - return tab - }(), - }, +type DataWrite struct { + Limbs []string + IsModexpBase string + IsModexpExponent string + IsModexpModulus string + IsModexpResult string } -func createRandomModexp(rng *rand.Rand, large bool) [4]*big.Int { - - var ( - maxValue = emparams.Mod1e256{}.Modulus() - res = [4]*big.Int{} - ) - - if large { - maxValue = emparams.Mod1e4096{}.Modulus() +func splitIntoPairs(input string) []string { + if len(input) == 0 { + return []string{} } - res[0] = new(big.Int).Rand(rng, maxValue) - res[1] = new(big.Int).Rand(rng, maxValue) - res[2] = new(big.Int).Rand(rng, maxValue) - res[3] = new(big.Int).Exp(res[0], res[1], res[2]) + var result []string + for i := 0; i < len(input); i += 4 { + var inp string + + if i+4 > len(input) { + inp = input[i:] + } else { + inp = input[i : i+4] + } + + if inp == "0000" { + result = append(result, "0x0") + } else { + result = append(result, "0x"+inp) + } + } - return res + return result } -func dumpAsCsv(w io.Writer, tab [][]*big.Int) { - - fmt.Fprintf(w, "LIMBS,IS_MODEXP_BASE,IS_MODEXP_EXPONENT,IS_MODEXP_MODULUS,IS_MODEXP_RESULT\n") - - for i := range tab[0] { - fmt.Fprintf(w, "0x%v,%v,%v,%v,%v\n", tab[0][i].Text(16), tab[1][i].String(), tab[2][i].String(), tab[3][i].String(), tab[4][i].String()) +func writeCsv(name string, dataEntries []DataWrite) { + // Open a new CSV file for writing + file, err := os.Create(name) + if err != nil { + fmt.Println("Error creating file:", err) + return } -} + defer file.Close() -func pushFillerToInput(tab [][]*big.Int, rng *rand.Rand, numRow int) { + // Create a CSV writer + writer := csv.NewWriter(file) + defer writer.Flush() - maxValue := emparams.Mod1e256{}.Modulus() + var header []string + for i := 0; i < 8; i++ { + //header = append(header, fmt.Sprintf("MODEXP_LIMBS_%d", i)) + header = append(header, fmt.Sprintf("LIMBS_%d", i)) + } - for i := 0; i < numRow; i++ { + //header = append(header, []string{"MODEXP_IS_ACTIVE", "MODEXP_IS_SMALL", "MODEXP_IS_LARGE", "MODEXP_TO_SMALL"}...) + header = append(header, []string{"IS_MODEXP_BASE", "IS_MODEXP_EXPONENT", "IS_MODEXP_MODULUS", "IS_MODEXP_RESULT"}...) + // Write the header row - tab[0] = append(tab[0], new(big.Int).Rand(rng, maxValue)) - tab[1] = append(tab[1], &big.Int{}) - tab[2] = append(tab[2], &big.Int{}) - tab[3] = append(tab[3], &big.Int{}) - tab[4] = append(tab[4], &big.Int{}) + if err := writer.Write(header); err != nil { + fmt.Println("Error writing header:", err) + return } -} -func pushModexpToInput(inst [4]*big.Int, tab [][]*big.Int) { + // Write each data entry to the CSV file + for _, entry := range dataEntries { + var row []string + row = append(row, entry.Limbs...) + row = append(row, []string{entry.IsModexpBase, entry.IsModexpExponent, entry.IsModexpModulus, entry.IsModexpResult}...) - var ( - limbs = splitIn32LimbsOf128Bits(inst[0]) - zero = &big.Int{} - one = big.NewInt(1) - ) - - for i := range limbs { - tab[0] = append(tab[0], limbs[i]) - tab[1] = append(tab[1], one) - tab[2] = append(tab[2], zero) - tab[3] = append(tab[3], zero) - tab[4] = append(tab[4], zero) + if err := writer.Write(row); err != nil { + fmt.Println("Error writing row:", err) + return + } } +} - limbs = splitIn32LimbsOf128Bits(inst[1]) - - for i := range limbs { - tab[0] = append(tab[0], limbs[i]) - tab[1] = append(tab[1], zero) - tab[2] = append(tab[2], one) - tab[3] = append(tab[3], zero) - tab[4] = append(tab[4], zero) +func main() { + // Open the CSV file + file, err := os.Open("old/single_4096_bits_input.csv") + if err != nil { + fmt.Println("Error opening file:", err) + return } + defer file.Close() - limbs = splitIn32LimbsOf128Bits(inst[2]) + // Create a new CSV reader + reader := csv.NewReader(file) - for i := range limbs { - tab[0] = append(tab[0], limbs[i]) - tab[1] = append(tab[1], zero) - tab[2] = append(tab[2], zero) - tab[3] = append(tab[3], one) - tab[4] = append(tab[4], zero) + // Read all rows from the CSV file + rows, err := reader.ReadAll() + if err != nil { + fmt.Println("Error reading CSV:", err) + return } - limbs = splitIn32LimbsOf128Bits(inst[3]) - - for i := range limbs { - tab[0] = append(tab[0], limbs[i]) - tab[1] = append(tab[1], zero) - tab[2] = append(tab[2], zero) - tab[3] = append(tab[3], zero) - tab[4] = append(tab[4], one) + // Ensure the file has a header row + if len(rows) < 2 { + fmt.Println("CSV file is empty or missing header row.") + return } -} -func splitIn32LimbsOf128Bits(x *big.Int) [32]*big.Int { + // Parse the rows into the Data structure + var mergedEntries []DataWrite - var ( - res = [32]*big.Int{} - extended = make([]byte, 512) - xBytes = x.Bytes() - ) + for i, row := range rows[1:] { + if len(row) != 5 { + fmt.Printf("Skipping row %d due to incorrect number of columns\n", i+1) + continue + } - copy(extended[len(extended)-len(xBytes):], xBytes) + mergedEntries = append(mergedEntries, DataWrite{ + Limbs: splitIntoPairs(fmt.Sprintf("%032s", row[0][2:])), + IsModexpBase: row[1], + IsModexpExponent: row[2], + IsModexpModulus: row[3], + IsModexpResult: row[4], + }) - for i := range res { - res[i] = new(big.Int).SetBytes(extended[16*i : 16*i+16]) } - return res + writeCsv("single_4096_bits_input.csv", mergedEntries) } diff --git a/prover/zkevm/prover/modexp/testdata/single_256_bits_input.csv b/prover/zkevm/prover/modexp/testdata/single_256_bits_input.csv index e94e5ee9725..0c9ea03d2f3 100644 --- a/prover/zkevm/prover/modexp/testdata/single_256_bits_input.csv +++ b/prover/zkevm/prover/modexp/testdata/single_256_bits_input.csv @@ -1,129 +1,129 @@ -LIMBS,IS_MODEXP_BASE,IS_MODEXP_EXPONENT,IS_MODEXP_MODULUS,IS_MODEXP_RESULT -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0x0,1,0,0,0 -0xb9d237bc9af422932a1613122bf70a18,1,0,0,0 -0xe54c4f73a5c887ed3fb89f2f55e93794,1,0,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0x0,0,1,0,0 -0xffe4613281683f3223a4558356b7aaa,0,1,0,0 -0x414f3d10d8a3d71fc9b64ce4f40bd3d6,0,1,0,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x0,0,0,1,0 -0x185ed98edd3133848c0a23ffa7b71214,0,0,1,0 -0xbee28a239cc27425929644400a6652eb,0,0,1,0 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0x0,0,0,0,1 -0xcde2ac27b25783774c2ac1d3aae1945,0,0,0,1 -0xc067903d1c0f68d5af4461fbb67684eb,0,0,0,1 +LIMBS_0,LIMBS_1,LIMBS_2,LIMBS_3,LIMBS_4,LIMBS_5,LIMBS_6,LIMBS_7,IS_MODEXP_BASE,IS_MODEXP_EXPONENT,IS_MODEXP_MODULUS,IS_MODEXP_RESULT +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,0,0,0 +0xb9d2,0x37bc,0x9af4,0x2293,0x2a16,0x1312,0x2bf7,0x0a18,1,0,0,0 +0xe54c,0x4f73,0xa5c8,0x87ed,0x3fb8,0x9f2f,0x55e9,0x3794,1,0,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,1,0,0 +0x0ffe,0x4613,0x2816,0x83f3,0x223a,0x4558,0x356b,0x7aaa,0,1,0,0 +0x414f,0x3d10,0xd8a3,0xd71f,0xc9b6,0x4ce4,0xf40b,0xd3d6,0,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,1,0 +0x185e,0xd98e,0xdd31,0x3384,0x8c0a,0x23ff,0xa7b7,0x1214,0,0,1,0 +0xbee2,0x8a23,0x9cc2,0x7425,0x9296,0x4440,0x0a66,0x52eb,0,0,1,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1 +0x0cde,0x2ac2,0x7b25,0x7837,0x74c2,0xac1d,0x3aae,0x1945,0,0,0,1 +0xc067,0x903d,0x1c0f,0x68d5,0xaf44,0x61fb,0xb676,0x84eb,0,0,0,1 diff --git a/prover/zkevm/prover/modexp/testdata/single_256_bits_module.csv b/prover/zkevm/prover/modexp/testdata/single_256_bits_module.csv index 90fc6c00376..eb0f6d1e004 100644 --- a/prover/zkevm/prover/modexp/testdata/single_256_bits_module.csv +++ b/prover/zkevm/prover/modexp/testdata/single_256_bits_module.csv @@ -1,129 +1,129 @@ -MODEXP_LIMBS,MODEXP_IS_ACTIVE,MODEXP_IS_SMALL,MODEXP_IS_LARGE,MODEXP_TO_SMALL_CIRC -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0xb9d237bc9af422932a1613122bf70a18,1,1,0,1 -0xe54c4f73a5c887ed3fb89f2f55e93794,1,1,0,1 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0xffe4613281683f3223a4558356b7aaa,1,1,0,1 -0x414f3d10d8a3d71fc9b64ce4f40bd3d6,1,1,0,1 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x185ed98edd3133848c0a23ffa7b71214,1,1,0,1 -0xbee28a239cc27425929644400a6652eb,1,1,0,1 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0x0,1,1,0,0 -0xcde2ac27b25783774c2ac1d3aae1945,1,1,0,1 -0xc067903d1c0f68d5af4461fbb67684eb,1,1,0,1 \ No newline at end of file +MODEXP_LIMBS_0,MODEXP_LIMBS_1,MODEXP_LIMBS_2,MODEXP_LIMBS_3,MODEXP_LIMBS_4,MODEXP_LIMBS_5,MODEXP_LIMBS_6,MODEXP_LIMBS_7,MODEXP_IS_ACTIVE,MODEXP_IS_SMALL,MODEXP_IS_LARGE,MODEXP_TO_SMALL_CIRC +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0xb9d2,0x37bc,0x9af4,0x2293,0x2a16,0x1312,0x2bf7,0x0a18,1,1,0,1 +0xe54c,0x4f73,0xa5c8,0x87ed,0x3fb8,0x9f2f,0x55e9,0x3794,1,1,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0ffe,0x4613,0x2816,0x83f3,0x223a,0x4558,0x356b,0x7aaa,1,1,0,1 +0x414f,0x3d10,0xd8a3,0xd71f,0xc9b6,0x4ce4,0xf40b,0xd3d6,1,1,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x185e,0xd98e,0xdd31,0x3384,0x8c0a,0x23ff,0xa7b7,0x1214,1,1,0,1 +0xbee2,0x8a23,0x9cc2,0x7425,0x9296,0x4440,0x0a66,0x52eb,1,1,0,1 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,1,1,0,0 +0x0cde,0x2ac2,0x7b25,0x7837,0x74c2,0xac1d,0x3aae,0x1945,1,1,0,1 +0xc067,0x903d,0x1c0f,0x68d5,0xaf44,0x61fb,0xb676,0x84eb,1,1,0,1 diff --git a/prover/zkevm/prover/modexp/testdata/single_4096_bits_input.csv b/prover/zkevm/prover/modexp/testdata/single_4096_bits_input.csv index 6a328a06ca6..e65c22bfcf0 100644 --- a/prover/zkevm/prover/modexp/testdata/single_4096_bits_input.csv +++ b/prover/zkevm/prover/modexp/testdata/single_4096_bits_input.csv @@ -1,129 +1,129 @@ -LIMBS,IS_MODEXP_BASE,IS_MODEXP_EXPONENT,IS_MODEXP_MODULUS,IS_MODEXP_RESULT -0xfa36a19336257d25607928a6c4657d2d,1,0,0,0 -0xa0b5850742f0f89511af1716f14294a2,1,0,0,0 -0xb383d80a95dc4e544d5de1abc305193a,1,0,0,0 -0xc0e4e1ba345b574b4ec15c777b1a05b4,1,0,0,0 -0x1191a01c0e03f2eba6b404a66f69daf0,1,0,0,0 -0x47da282d1217786a73e324d142a5425d,1,0,0,0 -0xd2ac784ad8586bd89a7cecbd5e3f050d,1,0,0,0 -0x7c4215f4f146eaab44c62febfe8a39eb,1,0,0,0 -0x4c7b5e94d4463c8d7ff0f78fc58255ed,1,0,0,0 -0xdfba98a4409fa7a90090fe2ef186771a,1,0,0,0 -0x68ecc2bd4c2d6282f69f432b520bd004,1,0,0,0 -0x68301b4bf755e6f1703ee94a89a14463,1,0,0,0 -0x262c95388bc6c75c9b7f571339b3bada,1,0,0,0 -0xc8218dc7128cb49abfcd735616f62df,1,0,0,0 -0xe75428d914595cbd42a9e6219de78c61,1,0,0,0 -0xbd5893a19a8ef60f5abeac2cc6de18c3,1,0,0,0 -0xbb993b66a9e72394f5bb36a162b3aaca,1,0,0,0 -0x2ea80d0241def4d3ca670d8c720afd9c,1,0,0,0 -0xfc32cdcb084b1c94a4155e361084fd8b,1,0,0,0 -0x3eb9d1a0e96d8f102dc693d7b02790ab,1,0,0,0 -0x7e7cec24f1c58ebb2f577507eb6fec53,1,0,0,0 -0xfffc17656a2ffc7ebe76b401f9b6093b,1,0,0,0 -0xfb8cd63748e27400f9dcaf6649f30492,1,0,0,0 -0xfcad32247833e6dd9c96d75a76b0cf72,1,0,0,0 -0x4787f23261fec2835ec8d292f1695dbc,1,0,0,0 -0x3d03031de11f037cf223f09e396ace62,1,0,0,0 -0xe460308538e063e4b7f76f8c86194efe,1,0,0,0 -0x44f3ff14fd27398c9b7661daec1f72ea,1,0,0,0 -0x9383010b292af824b73021761b286276,1,0,0,0 -0xb1791eac1b703c8d8445708f269f4b7a,1,0,0,0 -0x91987aaf9008ea7769c4a5afc3c3757b,1,0,0,0 -0x1433b8958e73c43be8daadc85557b4d1,1,0,0,0 -0xf00a79a19b30a00c11ad6e0fd0afc47,0,1,0,0 -0x8bf35a3ff08c3e71abf93e1dba4760ce,0,1,0,0 -0xc9095b748238b83f87266e8cc758fd30,0,1,0,0 -0x4484a4bb028bc38b1b4e180ef884d17f,0,1,0,0 -0xe6882756fe147fcab9dcee5d61beb823,0,1,0,0 -0xa016a77297cbc914eecf14954365f5de,0,1,0,0 -0x8bde973b7010319217573aa6c8154ddd,0,1,0,0 -0xf213dd4b3a2b350749f8b2ab629a3e37,0,1,0,0 -0x1a291fd88a57d6239f12fc24fa081808,0,1,0,0 -0x11aa5e77863015ca51e2435c6bb83381,0,1,0,0 -0x11e04f7c83ed35c7cee1ca6393e4963e,0,1,0,0 -0x696a4e916841af841fde0b55db76b716,0,1,0,0 -0xba2e6d7cded0828c81dd70fd39353c01,0,1,0,0 -0xbce59d88e76105ad22dbc2754ff30a2d,0,1,0,0 -0xe9a18ee8e20d2ae60d548ca2f6d05926,0,1,0,0 -0xee4ec5a9a0f81f7f6611aa4fb7b6104b,0,1,0,0 -0x3412c16883a4c9ba0333550d20cc85a8,0,1,0,0 -0x1780c57e024b404d5a5e503cc61a7d21,0,1,0,0 -0xfa701bfbabb91dcb3f27ac67535e18c3,0,1,0,0 -0x59c54ab272d1b090692a3137651c345d,0,1,0,0 -0xe332d6514d30a0e5bc6d9099e063ea38,0,1,0,0 -0x53333dbbea6370b38d07be1b09de4e7b,0,1,0,0 -0x967f8fc9b99c1e0b00ee5df3ae050494,0,1,0,0 -0xbeb0b979986f2ff3f9e9240a17666bba,0,1,0,0 -0xd01f2223ce4b50eb1f4b46f8741eaf0b,0,1,0,0 -0x6f65e4cac4d1000a24d4e661d060d19e,0,1,0,0 -0x1f6a2d3f025a9a5c5266341695187eec,0,1,0,0 -0x51d3baa3e02edb8e386a6af5dfe8a29d,0,1,0,0 -0x9e1025bdd09a8cadd0bfbff2f1e2ac95,0,1,0,0 -0x78a7fa7a77730744d256fe9b48a6d302,0,1,0,0 -0x68343573af52764489331e1841f51f24,0,1,0,0 -0x4f7ed126913fb75b17cc978861f90cf2,0,1,0,0 -0x93872ed4300b3068237bc54fd249397e,0,0,1,0 -0x8e2820b29b2fa7f990a5e2fe2f87e639,0,0,1,0 -0xfa0b88d404777a49c318ad1fed342fc4,0,0,1,0 -0xd3b1df0eed495b1bbf91ef6fd1bf2ca6,0,0,1,0 -0x27bc8d568c381b78388ca128ed47febc,0,0,1,0 -0xca84b5b2c5b7aefd05e1f95b32116083,0,0,1,0 -0x26b0c642d3f8486f8cc04d5a4c7e2bcd,0,0,1,0 -0x9495b2aff6fd7ff8414ad2428af52c67,0,0,1,0 -0x8d1e00d28897a2bc6e4bfbcd319bf9ae,0,0,1,0 -0xe9b91fedc43dfc8592ce4ccc4f8eab9c,0,0,1,0 -0xadaa6d3b6a74004b357011339db955da,0,0,1,0 -0xabf256c6120eec344d05ce7e2c8bfc3f,0,0,1,0 -0xe1e00ed738590a86b364c86c195802e3,0,0,1,0 -0xb9c7408dbd10479dd3791be911a65f04,0,0,1,0 -0xf751b9756b327608d004159203711688,0,0,1,0 -0xa5a2c968d17defaf2e9e79e0d3e4a3f6,0,0,1,0 -0x3444bc7bd18a0a7193af286ff35d3239,0,0,1,0 -0x10230ed40beb92426a103a650f10c4b6,0,0,1,0 -0x1c97d93083cb139de3d2a5e40c957a20,0,0,1,0 -0x169d341348526b7c9136db7b6ef60ddd,0,0,1,0 -0x16933596a34a46f045b84b59349a8b0c,0,0,1,0 -0xe1906d4e932ade4a35a332a8acb1fc73,0,0,1,0 -0xfcfd4e9f7bf471ea646926f0e0e0fd1b,0,0,1,0 -0x2717a57f62b57603553d283a7cbc2817,0,0,1,0 -0xceb453bef30b627fd1f1e51b01a8ffe4,0,0,1,0 -0xfe05346321133b5d110584783229d734,0,0,1,0 -0xd55268182edddaa5852da77d99c0549a,0,0,1,0 -0xc0768cd3767b483634cfcf0f642e2e3b,0,0,1,0 -0xa1c91ee12d00f0d421c4689b1a6a756c,0,0,1,0 -0x28e3eb4a9812106127a1e984377f53,0,0,1,0 -0x233ae25af3e052529eb6be7ae7005b19,0,0,1,0 -0x8927c7e63ad3a1a96d38dae68406d376,0,0,1,0 -0x84b2a93d39ed0604491780dcf649bd58,0,0,0,1 -0xb62168da52a4c17dd0f1e165ee7158d5,0,0,0,1 -0x25fe4873e06ef079ec362547b9c4cf34,0,0,0,1 -0xe9ed31ddec5338c1adc26a0d51a438bd,0,0,0,1 -0x2d4ee95f2157443bf00f3002e58842ee,0,0,0,1 -0x4ecae477abecad8c3449bd38db6e4151,0,0,0,1 -0x1154b8d205966060f9c39d311a5cc7c9,0,0,0,1 -0x8dbc3e6701a48963a5ff101f9e9d6157,0,0,0,1 -0x9be47b995f4a094818ac2c87044dc377,0,0,0,1 -0xd5556c8708674af5d15a2a4c8eb5da3a,0,0,0,1 -0xa2a2999da42d03fa9d1e2e7793b3b0dc,0,0,0,1 -0x4d87a46a32d039b4076912796bbea745,0,0,0,1 -0x577d96f2e5bbdefd692332e91a26b16e,0,0,0,1 -0xa4493c1c4effb7e410cb2e4f066b5b73,0,0,0,1 -0xfc65b9fd43b7a378d4b0fc89a91e55ef,0,0,0,1 -0xba4252037d9ab315cbc2207b213707e6,0,0,0,1 -0xd43a14e6743fd633116eeea69b04c0e2,0,0,0,1 -0x7a082878c02022c8f46afeeb8661ed5b,0,0,0,1 -0x6d8845ae458b2146da5e7604f6195731,0,0,0,1 -0xba8d2658ecf4b78b3cc61630cf8c77b0,0,0,0,1 -0xdd788984c60ce9214d3ff13fc59dd382,0,0,0,1 -0x44c042c6d2bba923b320b75283bb4db5,0,0,0,1 -0x51468f00d2e947f7238a408cf589a5d2,0,0,0,1 -0xe40170072f09135e67f1c0aa914bfa1,0,0,0,1 -0xbc64b7b43d122a15a3c385e83831bc1,0,0,0,1 -0xa98152a19583c03791413ee2bc7fe0ea,0,0,0,1 -0x34230686550e9624cdaa9772aa5b1324,0,0,0,1 -0xe525a2fd884ffba4b433fc55ee4ac1c1,0,0,0,1 -0x317a92fd348be4e013a151db7b210a44,0,0,0,1 -0xa63a83365b57050abb63ab35ca3b333d,0,0,0,1 -0xbd5fc817bbe7d62dc623500f13bf6cb2,0,0,0,1 -0x13dfbc9175d156df6b72f17a2c1cb31b,0,0,0,1 +LIMBS_0,LIMBS_1,LIMBS_2,LIMBS_3,LIMBS_4,LIMBS_5,LIMBS_6,LIMBS_7,IS_MODEXP_BASE,IS_MODEXP_EXPONENT,IS_MODEXP_MODULUS,IS_MODEXP_RESULT +0xfa36,0xa193,0x3625,0x7d25,0x6079,0x28a6,0xc465,0x7d2d,1,0,0,0 +0xa0b5,0x8507,0x42f0,0xf895,0x11af,0x1716,0xf142,0x94a2,1,0,0,0 +0xb383,0xd80a,0x95dc,0x4e54,0x4d5d,0xe1ab,0xc305,0x193a,1,0,0,0 +0xc0e4,0xe1ba,0x345b,0x574b,0x4ec1,0x5c77,0x7b1a,0x05b4,1,0,0,0 +0x1191,0xa01c,0x0e03,0xf2eb,0xa6b4,0x04a6,0x6f69,0xdaf0,1,0,0,0 +0x47da,0x282d,0x1217,0x786a,0x73e3,0x24d1,0x42a5,0x425d,1,0,0,0 +0xd2ac,0x784a,0xd858,0x6bd8,0x9a7c,0xecbd,0x5e3f,0x050d,1,0,0,0 +0x7c42,0x15f4,0xf146,0xeaab,0x44c6,0x2feb,0xfe8a,0x39eb,1,0,0,0 +0x4c7b,0x5e94,0xd446,0x3c8d,0x7ff0,0xf78f,0xc582,0x55ed,1,0,0,0 +0xdfba,0x98a4,0x409f,0xa7a9,0x0090,0xfe2e,0xf186,0x771a,1,0,0,0 +0x68ec,0xc2bd,0x4c2d,0x6282,0xf69f,0x432b,0x520b,0xd004,1,0,0,0 +0x6830,0x1b4b,0xf755,0xe6f1,0x703e,0xe94a,0x89a1,0x4463,1,0,0,0 +0x262c,0x9538,0x8bc6,0xc75c,0x9b7f,0x5713,0x39b3,0xbada,1,0,0,0 +0x0c82,0x18dc,0x7128,0xcb49,0xabfc,0xd735,0x616f,0x62df,1,0,0,0 +0xe754,0x28d9,0x1459,0x5cbd,0x42a9,0xe621,0x9de7,0x8c61,1,0,0,0 +0xbd58,0x93a1,0x9a8e,0xf60f,0x5abe,0xac2c,0xc6de,0x18c3,1,0,0,0 +0xbb99,0x3b66,0xa9e7,0x2394,0xf5bb,0x36a1,0x62b3,0xaaca,1,0,0,0 +0x2ea8,0x0d02,0x41de,0xf4d3,0xca67,0x0d8c,0x720a,0xfd9c,1,0,0,0 +0xfc32,0xcdcb,0x084b,0x1c94,0xa415,0x5e36,0x1084,0xfd8b,1,0,0,0 +0x3eb9,0xd1a0,0xe96d,0x8f10,0x2dc6,0x93d7,0xb027,0x90ab,1,0,0,0 +0x7e7c,0xec24,0xf1c5,0x8ebb,0x2f57,0x7507,0xeb6f,0xec53,1,0,0,0 +0xfffc,0x1765,0x6a2f,0xfc7e,0xbe76,0xb401,0xf9b6,0x093b,1,0,0,0 +0xfb8c,0xd637,0x48e2,0x7400,0xf9dc,0xaf66,0x49f3,0x0492,1,0,0,0 +0xfcad,0x3224,0x7833,0xe6dd,0x9c96,0xd75a,0x76b0,0xcf72,1,0,0,0 +0x4787,0xf232,0x61fe,0xc283,0x5ec8,0xd292,0xf169,0x5dbc,1,0,0,0 +0x3d03,0x031d,0xe11f,0x037c,0xf223,0xf09e,0x396a,0xce62,1,0,0,0 +0xe460,0x3085,0x38e0,0x63e4,0xb7f7,0x6f8c,0x8619,0x4efe,1,0,0,0 +0x44f3,0xff14,0xfd27,0x398c,0x9b76,0x61da,0xec1f,0x72ea,1,0,0,0 +0x9383,0x010b,0x292a,0xf824,0xb730,0x2176,0x1b28,0x6276,1,0,0,0 +0xb179,0x1eac,0x1b70,0x3c8d,0x8445,0x708f,0x269f,0x4b7a,1,0,0,0 +0x9198,0x7aaf,0x9008,0xea77,0x69c4,0xa5af,0xc3c3,0x757b,1,0,0,0 +0x1433,0xb895,0x8e73,0xc43b,0xe8da,0xadc8,0x5557,0xb4d1,1,0,0,0 +0x0f00,0xa79a,0x19b3,0x0a00,0xc11a,0xd6e0,0xfd0a,0xfc47,0,1,0,0 +0x8bf3,0x5a3f,0xf08c,0x3e71,0xabf9,0x3e1d,0xba47,0x60ce,0,1,0,0 +0xc909,0x5b74,0x8238,0xb83f,0x8726,0x6e8c,0xc758,0xfd30,0,1,0,0 +0x4484,0xa4bb,0x028b,0xc38b,0x1b4e,0x180e,0xf884,0xd17f,0,1,0,0 +0xe688,0x2756,0xfe14,0x7fca,0xb9dc,0xee5d,0x61be,0xb823,0,1,0,0 +0xa016,0xa772,0x97cb,0xc914,0xeecf,0x1495,0x4365,0xf5de,0,1,0,0 +0x8bde,0x973b,0x7010,0x3192,0x1757,0x3aa6,0xc815,0x4ddd,0,1,0,0 +0xf213,0xdd4b,0x3a2b,0x3507,0x49f8,0xb2ab,0x629a,0x3e37,0,1,0,0 +0x1a29,0x1fd8,0x8a57,0xd623,0x9f12,0xfc24,0xfa08,0x1808,0,1,0,0 +0x11aa,0x5e77,0x8630,0x15ca,0x51e2,0x435c,0x6bb8,0x3381,0,1,0,0 +0x11e0,0x4f7c,0x83ed,0x35c7,0xcee1,0xca63,0x93e4,0x963e,0,1,0,0 +0x696a,0x4e91,0x6841,0xaf84,0x1fde,0x0b55,0xdb76,0xb716,0,1,0,0 +0xba2e,0x6d7c,0xded0,0x828c,0x81dd,0x70fd,0x3935,0x3c01,0,1,0,0 +0xbce5,0x9d88,0xe761,0x05ad,0x22db,0xc275,0x4ff3,0x0a2d,0,1,0,0 +0xe9a1,0x8ee8,0xe20d,0x2ae6,0x0d54,0x8ca2,0xf6d0,0x5926,0,1,0,0 +0xee4e,0xc5a9,0xa0f8,0x1f7f,0x6611,0xaa4f,0xb7b6,0x104b,0,1,0,0 +0x3412,0xc168,0x83a4,0xc9ba,0x0333,0x550d,0x20cc,0x85a8,0,1,0,0 +0x1780,0xc57e,0x024b,0x404d,0x5a5e,0x503c,0xc61a,0x7d21,0,1,0,0 +0xfa70,0x1bfb,0xabb9,0x1dcb,0x3f27,0xac67,0x535e,0x18c3,0,1,0,0 +0x59c5,0x4ab2,0x72d1,0xb090,0x692a,0x3137,0x651c,0x345d,0,1,0,0 +0xe332,0xd651,0x4d30,0xa0e5,0xbc6d,0x9099,0xe063,0xea38,0,1,0,0 +0x5333,0x3dbb,0xea63,0x70b3,0x8d07,0xbe1b,0x09de,0x4e7b,0,1,0,0 +0x967f,0x8fc9,0xb99c,0x1e0b,0x00ee,0x5df3,0xae05,0x0494,0,1,0,0 +0xbeb0,0xb979,0x986f,0x2ff3,0xf9e9,0x240a,0x1766,0x6bba,0,1,0,0 +0xd01f,0x2223,0xce4b,0x50eb,0x1f4b,0x46f8,0x741e,0xaf0b,0,1,0,0 +0x6f65,0xe4ca,0xc4d1,0x000a,0x24d4,0xe661,0xd060,0xd19e,0,1,0,0 +0x1f6a,0x2d3f,0x025a,0x9a5c,0x5266,0x3416,0x9518,0x7eec,0,1,0,0 +0x51d3,0xbaa3,0xe02e,0xdb8e,0x386a,0x6af5,0xdfe8,0xa29d,0,1,0,0 +0x9e10,0x25bd,0xd09a,0x8cad,0xd0bf,0xbff2,0xf1e2,0xac95,0,1,0,0 +0x78a7,0xfa7a,0x7773,0x0744,0xd256,0xfe9b,0x48a6,0xd302,0,1,0,0 +0x6834,0x3573,0xaf52,0x7644,0x8933,0x1e18,0x41f5,0x1f24,0,1,0,0 +0x4f7e,0xd126,0x913f,0xb75b,0x17cc,0x9788,0x61f9,0x0cf2,0,1,0,0 +0x9387,0x2ed4,0x300b,0x3068,0x237b,0xc54f,0xd249,0x397e,0,0,1,0 +0x8e28,0x20b2,0x9b2f,0xa7f9,0x90a5,0xe2fe,0x2f87,0xe639,0,0,1,0 +0xfa0b,0x88d4,0x0477,0x7a49,0xc318,0xad1f,0xed34,0x2fc4,0,0,1,0 +0xd3b1,0xdf0e,0xed49,0x5b1b,0xbf91,0xef6f,0xd1bf,0x2ca6,0,0,1,0 +0x27bc,0x8d56,0x8c38,0x1b78,0x388c,0xa128,0xed47,0xfebc,0,0,1,0 +0xca84,0xb5b2,0xc5b7,0xaefd,0x05e1,0xf95b,0x3211,0x6083,0,0,1,0 +0x26b0,0xc642,0xd3f8,0x486f,0x8cc0,0x4d5a,0x4c7e,0x2bcd,0,0,1,0 +0x9495,0xb2af,0xf6fd,0x7ff8,0x414a,0xd242,0x8af5,0x2c67,0,0,1,0 +0x8d1e,0x00d2,0x8897,0xa2bc,0x6e4b,0xfbcd,0x319b,0xf9ae,0,0,1,0 +0xe9b9,0x1fed,0xc43d,0xfc85,0x92ce,0x4ccc,0x4f8e,0xab9c,0,0,1,0 +0xadaa,0x6d3b,0x6a74,0x004b,0x3570,0x1133,0x9db9,0x55da,0,0,1,0 +0xabf2,0x56c6,0x120e,0xec34,0x4d05,0xce7e,0x2c8b,0xfc3f,0,0,1,0 +0xe1e0,0x0ed7,0x3859,0x0a86,0xb364,0xc86c,0x1958,0x02e3,0,0,1,0 +0xb9c7,0x408d,0xbd10,0x479d,0xd379,0x1be9,0x11a6,0x5f04,0,0,1,0 +0xf751,0xb975,0x6b32,0x7608,0xd004,0x1592,0x0371,0x1688,0,0,1,0 +0xa5a2,0xc968,0xd17d,0xefaf,0x2e9e,0x79e0,0xd3e4,0xa3f6,0,0,1,0 +0x3444,0xbc7b,0xd18a,0x0a71,0x93af,0x286f,0xf35d,0x3239,0,0,1,0 +0x1023,0x0ed4,0x0beb,0x9242,0x6a10,0x3a65,0x0f10,0xc4b6,0,0,1,0 +0x1c97,0xd930,0x83cb,0x139d,0xe3d2,0xa5e4,0x0c95,0x7a20,0,0,1,0 +0x169d,0x3413,0x4852,0x6b7c,0x9136,0xdb7b,0x6ef6,0x0ddd,0,0,1,0 +0x1693,0x3596,0xa34a,0x46f0,0x45b8,0x4b59,0x349a,0x8b0c,0,0,1,0 +0xe190,0x6d4e,0x932a,0xde4a,0x35a3,0x32a8,0xacb1,0xfc73,0,0,1,0 +0xfcfd,0x4e9f,0x7bf4,0x71ea,0x6469,0x26f0,0xe0e0,0xfd1b,0,0,1,0 +0x2717,0xa57f,0x62b5,0x7603,0x553d,0x283a,0x7cbc,0x2817,0,0,1,0 +0xceb4,0x53be,0xf30b,0x627f,0xd1f1,0xe51b,0x01a8,0xffe4,0,0,1,0 +0xfe05,0x3463,0x2113,0x3b5d,0x1105,0x8478,0x3229,0xd734,0,0,1,0 +0xd552,0x6818,0x2edd,0xdaa5,0x852d,0xa77d,0x99c0,0x549a,0,0,1,0 +0xc076,0x8cd3,0x767b,0x4836,0x34cf,0xcf0f,0x642e,0x2e3b,0,0,1,0 +0xa1c9,0x1ee1,0x2d00,0xf0d4,0x21c4,0x689b,0x1a6a,0x756c,0,0,1,0 +0x0028,0xe3eb,0x4a98,0x1210,0x6127,0xa1e9,0x8437,0x7f53,0,0,1,0 +0x233a,0xe25a,0xf3e0,0x5252,0x9eb6,0xbe7a,0xe700,0x5b19,0,0,1,0 +0x8927,0xc7e6,0x3ad3,0xa1a9,0x6d38,0xdae6,0x8406,0xd376,0,0,1,0 +0x84b2,0xa93d,0x39ed,0x0604,0x4917,0x80dc,0xf649,0xbd58,0,0,0,1 +0xb621,0x68da,0x52a4,0xc17d,0xd0f1,0xe165,0xee71,0x58d5,0,0,0,1 +0x25fe,0x4873,0xe06e,0xf079,0xec36,0x2547,0xb9c4,0xcf34,0,0,0,1 +0xe9ed,0x31dd,0xec53,0x38c1,0xadc2,0x6a0d,0x51a4,0x38bd,0,0,0,1 +0x2d4e,0xe95f,0x2157,0x443b,0xf00f,0x3002,0xe588,0x42ee,0,0,0,1 +0x4eca,0xe477,0xabec,0xad8c,0x3449,0xbd38,0xdb6e,0x4151,0,0,0,1 +0x1154,0xb8d2,0x0596,0x6060,0xf9c3,0x9d31,0x1a5c,0xc7c9,0,0,0,1 +0x8dbc,0x3e67,0x01a4,0x8963,0xa5ff,0x101f,0x9e9d,0x6157,0,0,0,1 +0x9be4,0x7b99,0x5f4a,0x0948,0x18ac,0x2c87,0x044d,0xc377,0,0,0,1 +0xd555,0x6c87,0x0867,0x4af5,0xd15a,0x2a4c,0x8eb5,0xda3a,0,0,0,1 +0xa2a2,0x999d,0xa42d,0x03fa,0x9d1e,0x2e77,0x93b3,0xb0dc,0,0,0,1 +0x4d87,0xa46a,0x32d0,0x39b4,0x0769,0x1279,0x6bbe,0xa745,0,0,0,1 +0x577d,0x96f2,0xe5bb,0xdefd,0x6923,0x32e9,0x1a26,0xb16e,0,0,0,1 +0xa449,0x3c1c,0x4eff,0xb7e4,0x10cb,0x2e4f,0x066b,0x5b73,0,0,0,1 +0xfc65,0xb9fd,0x43b7,0xa378,0xd4b0,0xfc89,0xa91e,0x55ef,0,0,0,1 +0xba42,0x5203,0x7d9a,0xb315,0xcbc2,0x207b,0x2137,0x07e6,0,0,0,1 +0xd43a,0x14e6,0x743f,0xd633,0x116e,0xeea6,0x9b04,0xc0e2,0,0,0,1 +0x7a08,0x2878,0xc020,0x22c8,0xf46a,0xfeeb,0x8661,0xed5b,0,0,0,1 +0x6d88,0x45ae,0x458b,0x2146,0xda5e,0x7604,0xf619,0x5731,0,0,0,1 +0xba8d,0x2658,0xecf4,0xb78b,0x3cc6,0x1630,0xcf8c,0x77b0,0,0,0,1 +0xdd78,0x8984,0xc60c,0xe921,0x4d3f,0xf13f,0xc59d,0xd382,0,0,0,1 +0x44c0,0x42c6,0xd2bb,0xa923,0xb320,0xb752,0x83bb,0x4db5,0,0,0,1 +0x5146,0x8f00,0xd2e9,0x47f7,0x238a,0x408c,0xf589,0xa5d2,0,0,0,1 +0x0e40,0x1700,0x72f0,0x9135,0xe67f,0x1c0a,0xa914,0xbfa1,0,0,0,1 +0x0bc6,0x4b7b,0x43d1,0x22a1,0x5a3c,0x385e,0x8383,0x1bc1,0,0,0,1 +0xa981,0x52a1,0x9583,0xc037,0x9141,0x3ee2,0xbc7f,0xe0ea,0,0,0,1 +0x3423,0x0686,0x550e,0x9624,0xcdaa,0x9772,0xaa5b,0x1324,0,0,0,1 +0xe525,0xa2fd,0x884f,0xfba4,0xb433,0xfc55,0xee4a,0xc1c1,0,0,0,1 +0x317a,0x92fd,0x348b,0xe4e0,0x13a1,0x51db,0x7b21,0x0a44,0,0,0,1 +0xa63a,0x8336,0x5b57,0x050a,0xbb63,0xab35,0xca3b,0x333d,0,0,0,1 +0xbd5f,0xc817,0xbbe7,0xd62d,0xc623,0x500f,0x13bf,0x6cb2,0,0,0,1 +0x13df,0xbc91,0x75d1,0x56df,0x6b72,0xf17a,0x2c1c,0xb31b,0,0,0,1 diff --git a/prover/zkevm/prover/modexp/testdata/single_4096_bits_module.csv b/prover/zkevm/prover/modexp/testdata/single_4096_bits_module.csv index 7583295309f..5833f2004de 100644 --- a/prover/zkevm/prover/modexp/testdata/single_4096_bits_module.csv +++ b/prover/zkevm/prover/modexp/testdata/single_4096_bits_module.csv @@ -1,129 +1,129 @@ -MODEXP_LIMBS,MODEXP_IS_ACTIVE,MODEXP_IS_SMALL,MODEXP_IS_LARGE,MODEXP_TO_SMALL_CIRC -0xfa36a19336257d25607928a6c4657d2d,1,0,1,0 -0xa0b5850742f0f89511af1716f14294a2,1,0,1,0 -0xb383d80a95dc4e544d5de1abc305193a,1,0,1,0 -0xc0e4e1ba345b574b4ec15c777b1a05b4,1,0,1,0 -0x1191a01c0e03f2eba6b404a66f69daf0,1,0,1,0 -0x47da282d1217786a73e324d142a5425d,1,0,1,0 -0xd2ac784ad8586bd89a7cecbd5e3f050d,1,0,1,0 -0x7c4215f4f146eaab44c62febfe8a39eb,1,0,1,0 -0x4c7b5e94d4463c8d7ff0f78fc58255ed,1,0,1,0 -0xdfba98a4409fa7a90090fe2ef186771a,1,0,1,0 -0x68ecc2bd4c2d6282f69f432b520bd004,1,0,1,0 -0x68301b4bf755e6f1703ee94a89a14463,1,0,1,0 -0x262c95388bc6c75c9b7f571339b3bada,1,0,1,0 -0xc8218dc7128cb49abfcd735616f62df,1,0,1,0 -0xe75428d914595cbd42a9e6219de78c61,1,0,1,0 -0xbd5893a19a8ef60f5abeac2cc6de18c3,1,0,1,0 -0xbb993b66a9e72394f5bb36a162b3aaca,1,0,1,0 -0x2ea80d0241def4d3ca670d8c720afd9c,1,0,1,0 -0xfc32cdcb084b1c94a4155e361084fd8b,1,0,1,0 -0x3eb9d1a0e96d8f102dc693d7b02790ab,1,0,1,0 -0x7e7cec24f1c58ebb2f577507eb6fec53,1,0,1,0 -0xfffc17656a2ffc7ebe76b401f9b6093b,1,0,1,0 -0xfb8cd63748e27400f9dcaf6649f30492,1,0,1,0 -0xfcad32247833e6dd9c96d75a76b0cf72,1,0,1,0 -0x4787f23261fec2835ec8d292f1695dbc,1,0,1,0 -0x3d03031de11f037cf223f09e396ace62,1,0,1,0 -0xe460308538e063e4b7f76f8c86194efe,1,0,1,0 -0x44f3ff14fd27398c9b7661daec1f72ea,1,0,1,0 -0x9383010b292af824b73021761b286276,1,0,1,0 -0xb1791eac1b703c8d8445708f269f4b7a,1,0,1,0 -0x91987aaf9008ea7769c4a5afc3c3757b,1,0,1,0 -0x1433b8958e73c43be8daadc85557b4d1,1,0,1,0 -0xf00a79a19b30a00c11ad6e0fd0afc47,1,0,1,0 -0x8bf35a3ff08c3e71abf93e1dba4760ce,1,0,1,0 -0xc9095b748238b83f87266e8cc758fd30,1,0,1,0 -0x4484a4bb028bc38b1b4e180ef884d17f,1,0,1,0 -0xe6882756fe147fcab9dcee5d61beb823,1,0,1,0 -0xa016a77297cbc914eecf14954365f5de,1,0,1,0 -0x8bde973b7010319217573aa6c8154ddd,1,0,1,0 -0xf213dd4b3a2b350749f8b2ab629a3e37,1,0,1,0 -0x1a291fd88a57d6239f12fc24fa081808,1,0,1,0 -0x11aa5e77863015ca51e2435c6bb83381,1,0,1,0 -0x11e04f7c83ed35c7cee1ca6393e4963e,1,0,1,0 -0x696a4e916841af841fde0b55db76b716,1,0,1,0 -0xba2e6d7cded0828c81dd70fd39353c01,1,0,1,0 -0xbce59d88e76105ad22dbc2754ff30a2d,1,0,1,0 -0xe9a18ee8e20d2ae60d548ca2f6d05926,1,0,1,0 -0xee4ec5a9a0f81f7f6611aa4fb7b6104b,1,0,1,0 -0x3412c16883a4c9ba0333550d20cc85a8,1,0,1,0 -0x1780c57e024b404d5a5e503cc61a7d21,1,0,1,0 -0xfa701bfbabb91dcb3f27ac67535e18c3,1,0,1,0 -0x59c54ab272d1b090692a3137651c345d,1,0,1,0 -0xe332d6514d30a0e5bc6d9099e063ea38,1,0,1,0 -0x53333dbbea6370b38d07be1b09de4e7b,1,0,1,0 -0x967f8fc9b99c1e0b00ee5df3ae050494,1,0,1,0 -0xbeb0b979986f2ff3f9e9240a17666bba,1,0,1,0 -0xd01f2223ce4b50eb1f4b46f8741eaf0b,1,0,1,0 -0x6f65e4cac4d1000a24d4e661d060d19e,1,0,1,0 -0x1f6a2d3f025a9a5c5266341695187eec,1,0,1,0 -0x51d3baa3e02edb8e386a6af5dfe8a29d,1,0,1,0 -0x9e1025bdd09a8cadd0bfbff2f1e2ac95,1,0,1,0 -0x78a7fa7a77730744d256fe9b48a6d302,1,0,1,0 -0x68343573af52764489331e1841f51f24,1,0,1,0 -0x4f7ed126913fb75b17cc978861f90cf2,1,0,1,0 -0x93872ed4300b3068237bc54fd249397e,1,0,1,0 -0x8e2820b29b2fa7f990a5e2fe2f87e639,1,0,1,0 -0xfa0b88d404777a49c318ad1fed342fc4,1,0,1,0 -0xd3b1df0eed495b1bbf91ef6fd1bf2ca6,1,0,1,0 -0x27bc8d568c381b78388ca128ed47febc,1,0,1,0 -0xca84b5b2c5b7aefd05e1f95b32116083,1,0,1,0 -0x26b0c642d3f8486f8cc04d5a4c7e2bcd,1,0,1,0 -0x9495b2aff6fd7ff8414ad2428af52c67,1,0,1,0 -0x8d1e00d28897a2bc6e4bfbcd319bf9ae,1,0,1,0 -0xe9b91fedc43dfc8592ce4ccc4f8eab9c,1,0,1,0 -0xadaa6d3b6a74004b357011339db955da,1,0,1,0 -0xabf256c6120eec344d05ce7e2c8bfc3f,1,0,1,0 -0xe1e00ed738590a86b364c86c195802e3,1,0,1,0 -0xb9c7408dbd10479dd3791be911a65f04,1,0,1,0 -0xf751b9756b327608d004159203711688,1,0,1,0 -0xa5a2c968d17defaf2e9e79e0d3e4a3f6,1,0,1,0 -0x3444bc7bd18a0a7193af286ff35d3239,1,0,1,0 -0x10230ed40beb92426a103a650f10c4b6,1,0,1,0 -0x1c97d93083cb139de3d2a5e40c957a20,1,0,1,0 -0x169d341348526b7c9136db7b6ef60ddd,1,0,1,0 -0x16933596a34a46f045b84b59349a8b0c,1,0,1,0 -0xe1906d4e932ade4a35a332a8acb1fc73,1,0,1,0 -0xfcfd4e9f7bf471ea646926f0e0e0fd1b,1,0,1,0 -0x2717a57f62b57603553d283a7cbc2817,1,0,1,0 -0xceb453bef30b627fd1f1e51b01a8ffe4,1,0,1,0 -0xfe05346321133b5d110584783229d734,1,0,1,0 -0xd55268182edddaa5852da77d99c0549a,1,0,1,0 -0xc0768cd3767b483634cfcf0f642e2e3b,1,0,1,0 -0xa1c91ee12d00f0d421c4689b1a6a756c,1,0,1,0 -0x28e3eb4a9812106127a1e984377f53,1,0,1,0 -0x233ae25af3e052529eb6be7ae7005b19,1,0,1,0 -0x8927c7e63ad3a1a96d38dae68406d376,1,0,1,0 -0x84b2a93d39ed0604491780dcf649bd58,1,0,1,0 -0xb62168da52a4c17dd0f1e165ee7158d5,1,0,1,0 -0x25fe4873e06ef079ec362547b9c4cf34,1,0,1,0 -0xe9ed31ddec5338c1adc26a0d51a438bd,1,0,1,0 -0x2d4ee95f2157443bf00f3002e58842ee,1,0,1,0 -0x4ecae477abecad8c3449bd38db6e4151,1,0,1,0 -0x1154b8d205966060f9c39d311a5cc7c9,1,0,1,0 -0x8dbc3e6701a48963a5ff101f9e9d6157,1,0,1,0 -0x9be47b995f4a094818ac2c87044dc377,1,0,1,0 -0xd5556c8708674af5d15a2a4c8eb5da3a,1,0,1,0 -0xa2a2999da42d03fa9d1e2e7793b3b0dc,1,0,1,0 -0x4d87a46a32d039b4076912796bbea745,1,0,1,0 -0x577d96f2e5bbdefd692332e91a26b16e,1,0,1,0 -0xa4493c1c4effb7e410cb2e4f066b5b73,1,0,1,0 -0xfc65b9fd43b7a378d4b0fc89a91e55ef,1,0,1,0 -0xba4252037d9ab315cbc2207b213707e6,1,0,1,0 -0xd43a14e6743fd633116eeea69b04c0e2,1,0,1,0 -0x7a082878c02022c8f46afeeb8661ed5b,1,0,1,0 -0x6d8845ae458b2146da5e7604f6195731,1,0,1,0 -0xba8d2658ecf4b78b3cc61630cf8c77b0,1,0,1,0 -0xdd788984c60ce9214d3ff13fc59dd382,1,0,1,0 -0x44c042c6d2bba923b320b75283bb4db5,1,0,1,0 -0x51468f00d2e947f7238a408cf589a5d2,1,0,1,0 -0xe40170072f09135e67f1c0aa914bfa1,1,0,1,0 -0xbc64b7b43d122a15a3c385e83831bc1,1,0,1,0 -0xa98152a19583c03791413ee2bc7fe0ea,1,0,1,0 -0x34230686550e9624cdaa9772aa5b1324,1,0,1,0 -0xe525a2fd884ffba4b433fc55ee4ac1c1,1,0,1,0 -0x317a92fd348be4e013a151db7b210a44,1,0,1,0 -0xa63a83365b57050abb63ab35ca3b333d,1,0,1,0 -0xbd5fc817bbe7d62dc623500f13bf6cb2,1,0,1,0 -0x13dfbc9175d156df6b72f17a2c1cb31b,1,0,1,0 \ No newline at end of file +MODEXP_LIMBS_0,MODEXP_LIMBS_1,MODEXP_LIMBS_2,MODEXP_LIMBS_3,MODEXP_LIMBS_4,MODEXP_LIMBS_5,MODEXP_LIMBS_6,MODEXP_LIMBS_7,MODEXP_IS_ACTIVE,MODEXP_IS_SMALL,MODEXP_IS_LARGE,MODEXP_TO_SMALL_CIRC +0xfa36,0xa193,0x3625,0x7d25,0x6079,0x28a6,0xc465,0x7d2d,1,0,1,0 +0xa0b5,0x8507,0x42f0,0xf895,0x11af,0x1716,0xf142,0x94a2,1,0,1,0 +0xb383,0xd80a,0x95dc,0x4e54,0x4d5d,0xe1ab,0xc305,0x193a,1,0,1,0 +0xc0e4,0xe1ba,0x345b,0x574b,0x4ec1,0x5c77,0x7b1a,0x05b4,1,0,1,0 +0x1191,0xa01c,0x0e03,0xf2eb,0xa6b4,0x04a6,0x6f69,0xdaf0,1,0,1,0 +0x47da,0x282d,0x1217,0x786a,0x73e3,0x24d1,0x42a5,0x425d,1,0,1,0 +0xd2ac,0x784a,0xd858,0x6bd8,0x9a7c,0xecbd,0x5e3f,0x050d,1,0,1,0 +0x7c42,0x15f4,0xf146,0xeaab,0x44c6,0x2feb,0xfe8a,0x39eb,1,0,1,0 +0x4c7b,0x5e94,0xd446,0x3c8d,0x7ff0,0xf78f,0xc582,0x55ed,1,0,1,0 +0xdfba,0x98a4,0x409f,0xa7a9,0x0090,0xfe2e,0xf186,0x771a,1,0,1,0 +0x68ec,0xc2bd,0x4c2d,0x6282,0xf69f,0x432b,0x520b,0xd004,1,0,1,0 +0x6830,0x1b4b,0xf755,0xe6f1,0x703e,0xe94a,0x89a1,0x4463,1,0,1,0 +0x262c,0x9538,0x8bc6,0xc75c,0x9b7f,0x5713,0x39b3,0xbada,1,0,1,0 +0x0c82,0x18dc,0x7128,0xcb49,0xabfc,0xd735,0x616f,0x62df,1,0,1,0 +0xe754,0x28d9,0x1459,0x5cbd,0x42a9,0xe621,0x9de7,0x8c61,1,0,1,0 +0xbd58,0x93a1,0x9a8e,0xf60f,0x5abe,0xac2c,0xc6de,0x18c3,1,0,1,0 +0xbb99,0x3b66,0xa9e7,0x2394,0xf5bb,0x36a1,0x62b3,0xaaca,1,0,1,0 +0x2ea8,0x0d02,0x41de,0xf4d3,0xca67,0x0d8c,0x720a,0xfd9c,1,0,1,0 +0xfc32,0xcdcb,0x084b,0x1c94,0xa415,0x5e36,0x1084,0xfd8b,1,0,1,0 +0x3eb9,0xd1a0,0xe96d,0x8f10,0x2dc6,0x93d7,0xb027,0x90ab,1,0,1,0 +0x7e7c,0xec24,0xf1c5,0x8ebb,0x2f57,0x7507,0xeb6f,0xec53,1,0,1,0 +0xfffc,0x1765,0x6a2f,0xfc7e,0xbe76,0xb401,0xf9b6,0x093b,1,0,1,0 +0xfb8c,0xd637,0x48e2,0x7400,0xf9dc,0xaf66,0x49f3,0x0492,1,0,1,0 +0xfcad,0x3224,0x7833,0xe6dd,0x9c96,0xd75a,0x76b0,0xcf72,1,0,1,0 +0x4787,0xf232,0x61fe,0xc283,0x5ec8,0xd292,0xf169,0x5dbc,1,0,1,0 +0x3d03,0x031d,0xe11f,0x037c,0xf223,0xf09e,0x396a,0xce62,1,0,1,0 +0xe460,0x3085,0x38e0,0x63e4,0xb7f7,0x6f8c,0x8619,0x4efe,1,0,1,0 +0x44f3,0xff14,0xfd27,0x398c,0x9b76,0x61da,0xec1f,0x72ea,1,0,1,0 +0x9383,0x010b,0x292a,0xf824,0xb730,0x2176,0x1b28,0x6276,1,0,1,0 +0xb179,0x1eac,0x1b70,0x3c8d,0x8445,0x708f,0x269f,0x4b7a,1,0,1,0 +0x9198,0x7aaf,0x9008,0xea77,0x69c4,0xa5af,0xc3c3,0x757b,1,0,1,0 +0x1433,0xb895,0x8e73,0xc43b,0xe8da,0xadc8,0x5557,0xb4d1,1,0,1,0 +0x0f00,0xa79a,0x19b3,0x0a00,0xc11a,0xd6e0,0xfd0a,0xfc47,1,0,1,0 +0x8bf3,0x5a3f,0xf08c,0x3e71,0xabf9,0x3e1d,0xba47,0x60ce,1,0,1,0 +0xc909,0x5b74,0x8238,0xb83f,0x8726,0x6e8c,0xc758,0xfd30,1,0,1,0 +0x4484,0xa4bb,0x028b,0xc38b,0x1b4e,0x180e,0xf884,0xd17f,1,0,1,0 +0xe688,0x2756,0xfe14,0x7fca,0xb9dc,0xee5d,0x61be,0xb823,1,0,1,0 +0xa016,0xa772,0x97cb,0xc914,0xeecf,0x1495,0x4365,0xf5de,1,0,1,0 +0x8bde,0x973b,0x7010,0x3192,0x1757,0x3aa6,0xc815,0x4ddd,1,0,1,0 +0xf213,0xdd4b,0x3a2b,0x3507,0x49f8,0xb2ab,0x629a,0x3e37,1,0,1,0 +0x1a29,0x1fd8,0x8a57,0xd623,0x9f12,0xfc24,0xfa08,0x1808,1,0,1,0 +0x11aa,0x5e77,0x8630,0x15ca,0x51e2,0x435c,0x6bb8,0x3381,1,0,1,0 +0x11e0,0x4f7c,0x83ed,0x35c7,0xcee1,0xca63,0x93e4,0x963e,1,0,1,0 +0x696a,0x4e91,0x6841,0xaf84,0x1fde,0x0b55,0xdb76,0xb716,1,0,1,0 +0xba2e,0x6d7c,0xded0,0x828c,0x81dd,0x70fd,0x3935,0x3c01,1,0,1,0 +0xbce5,0x9d88,0xe761,0x05ad,0x22db,0xc275,0x4ff3,0x0a2d,1,0,1,0 +0xe9a1,0x8ee8,0xe20d,0x2ae6,0x0d54,0x8ca2,0xf6d0,0x5926,1,0,1,0 +0xee4e,0xc5a9,0xa0f8,0x1f7f,0x6611,0xaa4f,0xb7b6,0x104b,1,0,1,0 +0x3412,0xc168,0x83a4,0xc9ba,0x0333,0x550d,0x20cc,0x85a8,1,0,1,0 +0x1780,0xc57e,0x024b,0x404d,0x5a5e,0x503c,0xc61a,0x7d21,1,0,1,0 +0xfa70,0x1bfb,0xabb9,0x1dcb,0x3f27,0xac67,0x535e,0x18c3,1,0,1,0 +0x59c5,0x4ab2,0x72d1,0xb090,0x692a,0x3137,0x651c,0x345d,1,0,1,0 +0xe332,0xd651,0x4d30,0xa0e5,0xbc6d,0x9099,0xe063,0xea38,1,0,1,0 +0x5333,0x3dbb,0xea63,0x70b3,0x8d07,0xbe1b,0x09de,0x4e7b,1,0,1,0 +0x967f,0x8fc9,0xb99c,0x1e0b,0x00ee,0x5df3,0xae05,0x0494,1,0,1,0 +0xbeb0,0xb979,0x986f,0x2ff3,0xf9e9,0x240a,0x1766,0x6bba,1,0,1,0 +0xd01f,0x2223,0xce4b,0x50eb,0x1f4b,0x46f8,0x741e,0xaf0b,1,0,1,0 +0x6f65,0xe4ca,0xc4d1,0x000a,0x24d4,0xe661,0xd060,0xd19e,1,0,1,0 +0x1f6a,0x2d3f,0x025a,0x9a5c,0x5266,0x3416,0x9518,0x7eec,1,0,1,0 +0x51d3,0xbaa3,0xe02e,0xdb8e,0x386a,0x6af5,0xdfe8,0xa29d,1,0,1,0 +0x9e10,0x25bd,0xd09a,0x8cad,0xd0bf,0xbff2,0xf1e2,0xac95,1,0,1,0 +0x78a7,0xfa7a,0x7773,0x0744,0xd256,0xfe9b,0x48a6,0xd302,1,0,1,0 +0x6834,0x3573,0xaf52,0x7644,0x8933,0x1e18,0x41f5,0x1f24,1,0,1,0 +0x4f7e,0xd126,0x913f,0xb75b,0x17cc,0x9788,0x61f9,0x0cf2,1,0,1,0 +0x9387,0x2ed4,0x300b,0x3068,0x237b,0xc54f,0xd249,0x397e,1,0,1,0 +0x8e28,0x20b2,0x9b2f,0xa7f9,0x90a5,0xe2fe,0x2f87,0xe639,1,0,1,0 +0xfa0b,0x88d4,0x0477,0x7a49,0xc318,0xad1f,0xed34,0x2fc4,1,0,1,0 +0xd3b1,0xdf0e,0xed49,0x5b1b,0xbf91,0xef6f,0xd1bf,0x2ca6,1,0,1,0 +0x27bc,0x8d56,0x8c38,0x1b78,0x388c,0xa128,0xed47,0xfebc,1,0,1,0 +0xca84,0xb5b2,0xc5b7,0xaefd,0x05e1,0xf95b,0x3211,0x6083,1,0,1,0 +0x26b0,0xc642,0xd3f8,0x486f,0x8cc0,0x4d5a,0x4c7e,0x2bcd,1,0,1,0 +0x9495,0xb2af,0xf6fd,0x7ff8,0x414a,0xd242,0x8af5,0x2c67,1,0,1,0 +0x8d1e,0x00d2,0x8897,0xa2bc,0x6e4b,0xfbcd,0x319b,0xf9ae,1,0,1,0 +0xe9b9,0x1fed,0xc43d,0xfc85,0x92ce,0x4ccc,0x4f8e,0xab9c,1,0,1,0 +0xadaa,0x6d3b,0x6a74,0x004b,0x3570,0x1133,0x9db9,0x55da,1,0,1,0 +0xabf2,0x56c6,0x120e,0xec34,0x4d05,0xce7e,0x2c8b,0xfc3f,1,0,1,0 +0xe1e0,0x0ed7,0x3859,0x0a86,0xb364,0xc86c,0x1958,0x02e3,1,0,1,0 +0xb9c7,0x408d,0xbd10,0x479d,0xd379,0x1be9,0x11a6,0x5f04,1,0,1,0 +0xf751,0xb975,0x6b32,0x7608,0xd004,0x1592,0x0371,0x1688,1,0,1,0 +0xa5a2,0xc968,0xd17d,0xefaf,0x2e9e,0x79e0,0xd3e4,0xa3f6,1,0,1,0 +0x3444,0xbc7b,0xd18a,0x0a71,0x93af,0x286f,0xf35d,0x3239,1,0,1,0 +0x1023,0x0ed4,0x0beb,0x9242,0x6a10,0x3a65,0x0f10,0xc4b6,1,0,1,0 +0x1c97,0xd930,0x83cb,0x139d,0xe3d2,0xa5e4,0x0c95,0x7a20,1,0,1,0 +0x169d,0x3413,0x4852,0x6b7c,0x9136,0xdb7b,0x6ef6,0x0ddd,1,0,1,0 +0x1693,0x3596,0xa34a,0x46f0,0x45b8,0x4b59,0x349a,0x8b0c,1,0,1,0 +0xe190,0x6d4e,0x932a,0xde4a,0x35a3,0x32a8,0xacb1,0xfc73,1,0,1,0 +0xfcfd,0x4e9f,0x7bf4,0x71ea,0x6469,0x26f0,0xe0e0,0xfd1b,1,0,1,0 +0x2717,0xa57f,0x62b5,0x7603,0x553d,0x283a,0x7cbc,0x2817,1,0,1,0 +0xceb4,0x53be,0xf30b,0x627f,0xd1f1,0xe51b,0x01a8,0xffe4,1,0,1,0 +0xfe05,0x3463,0x2113,0x3b5d,0x1105,0x8478,0x3229,0xd734,1,0,1,0 +0xd552,0x6818,0x2edd,0xdaa5,0x852d,0xa77d,0x99c0,0x549a,1,0,1,0 +0xc076,0x8cd3,0x767b,0x4836,0x34cf,0xcf0f,0x642e,0x2e3b,1,0,1,0 +0xa1c9,0x1ee1,0x2d00,0xf0d4,0x21c4,0x689b,0x1a6a,0x756c,1,0,1,0 +0x0028,0xe3eb,0x4a98,0x1210,0x6127,0xa1e9,0x8437,0x7f53,1,0,1,0 +0x233a,0xe25a,0xf3e0,0x5252,0x9eb6,0xbe7a,0xe700,0x5b19,1,0,1,0 +0x8927,0xc7e6,0x3ad3,0xa1a9,0x6d38,0xdae6,0x8406,0xd376,1,0,1,0 +0x84b2,0xa93d,0x39ed,0x0604,0x4917,0x80dc,0xf649,0xbd58,1,0,1,0 +0xb621,0x68da,0x52a4,0xc17d,0xd0f1,0xe165,0xee71,0x58d5,1,0,1,0 +0x25fe,0x4873,0xe06e,0xf079,0xec36,0x2547,0xb9c4,0xcf34,1,0,1,0 +0xe9ed,0x31dd,0xec53,0x38c1,0xadc2,0x6a0d,0x51a4,0x38bd,1,0,1,0 +0x2d4e,0xe95f,0x2157,0x443b,0xf00f,0x3002,0xe588,0x42ee,1,0,1,0 +0x4eca,0xe477,0xabec,0xad8c,0x3449,0xbd38,0xdb6e,0x4151,1,0,1,0 +0x1154,0xb8d2,0x0596,0x6060,0xf9c3,0x9d31,0x1a5c,0xc7c9,1,0,1,0 +0x8dbc,0x3e67,0x01a4,0x8963,0xa5ff,0x101f,0x9e9d,0x6157,1,0,1,0 +0x9be4,0x7b99,0x5f4a,0x0948,0x18ac,0x2c87,0x044d,0xc377,1,0,1,0 +0xd555,0x6c87,0x0867,0x4af5,0xd15a,0x2a4c,0x8eb5,0xda3a,1,0,1,0 +0xa2a2,0x999d,0xa42d,0x03fa,0x9d1e,0x2e77,0x93b3,0xb0dc,1,0,1,0 +0x4d87,0xa46a,0x32d0,0x39b4,0x0769,0x1279,0x6bbe,0xa745,1,0,1,0 +0x577d,0x96f2,0xe5bb,0xdefd,0x6923,0x32e9,0x1a26,0xb16e,1,0,1,0 +0xa449,0x3c1c,0x4eff,0xb7e4,0x10cb,0x2e4f,0x066b,0x5b73,1,0,1,0 +0xfc65,0xb9fd,0x43b7,0xa378,0xd4b0,0xfc89,0xa91e,0x55ef,1,0,1,0 +0xba42,0x5203,0x7d9a,0xb315,0xcbc2,0x207b,0x2137,0x07e6,1,0,1,0 +0xd43a,0x14e6,0x743f,0xd633,0x116e,0xeea6,0x9b04,0xc0e2,1,0,1,0 +0x7a08,0x2878,0xc020,0x22c8,0xf46a,0xfeeb,0x8661,0xed5b,1,0,1,0 +0x6d88,0x45ae,0x458b,0x2146,0xda5e,0x7604,0xf619,0x5731,1,0,1,0 +0xba8d,0x2658,0xecf4,0xb78b,0x3cc6,0x1630,0xcf8c,0x77b0,1,0,1,0 +0xdd78,0x8984,0xc60c,0xe921,0x4d3f,0xf13f,0xc59d,0xd382,1,0,1,0 +0x44c0,0x42c6,0xd2bb,0xa923,0xb320,0xb752,0x83bb,0x4db5,1,0,1,0 +0x5146,0x8f00,0xd2e9,0x47f7,0x238a,0x408c,0xf589,0xa5d2,1,0,1,0 +0x0e40,0x1700,0x72f0,0x9135,0xe67f,0x1c0a,0xa914,0xbfa1,1,0,1,0 +0x0bc6,0x4b7b,0x43d1,0x22a1,0x5a3c,0x385e,0x8383,0x1bc1,1,0,1,0 +0xa981,0x52a1,0x9583,0xc037,0x9141,0x3ee2,0xbc7f,0xe0ea,1,0,1,0 +0x3423,0x0686,0x550e,0x9624,0xcdaa,0x9772,0xaa5b,0x1324,1,0,1,0 +0xe525,0xa2fd,0x884f,0xfba4,0xb433,0xfc55,0xee4a,0xc1c1,1,0,1,0 +0x317a,0x92fd,0x348b,0xe4e0,0x13a1,0x51db,0x7b21,0x0a44,1,0,1,0 +0xa63a,0x8336,0x5b57,0x050a,0xbb63,0xab35,0xca3b,0x333d,1,0,1,0 +0xbd5f,0xc817,0xbbe7,0xd62d,0xc623,0x500f,0x13bf,0x6cb2,1,0,1,0 +0x13df,0xbc91,0x75d1,0x56df,0x6b72,0xf17a,0x2c1c,0xb31b,1,0,1,0