diff --git a/documentation/everest_summer_school/Exercise1/icrc.c b/documentation/everest_summer_school/Exercise1/icrc.c
new file mode 100644
index 000000000..8852b50a1
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise1/icrc.c
@@ -0,0 +1,14 @@
+unsigned short icrc1(unsigned short crc, unsigned char onech)
+{
+ int i;
+ unsigned short ans=(crc^onech << 8);
+
+ for (i=0;i<8;i++) {
+ if (ans & 0x8000)
+ ans = (ans <<= 1) ^ 4129;
+ else
+ ans <<= 1;
+ }
+ return ans;
+}
+
diff --git a/documentation/everest_summer_school/Exercise1/test_icrc1.xml b/documentation/everest_summer_school/Exercise1/test_icrc1.xml
new file mode 100644
index 000000000..b34d465af
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise1/test_icrc1.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/documentation/everest_summer_school/Exercise2/gemm_32.c.interface.xml b/documentation/everest_summer_school/Exercise2/gemm_32.c.interface.xml
new file mode 100644
index 000000000..9631cd632
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise2/gemm_32.c.interface.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/documentation/everest_summer_school/Exercise2/gemm_32.mlir b/documentation/everest_summer_school/Exercise2/gemm_32.mlir
new file mode 100644
index 000000000..c4e5c1893
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise2/gemm_32.mlir
@@ -0,0 +1,19 @@
+func @gemm_32(%alpha: f32, %beta: f32, %C: memref<32x32xf32>, %A: memref<32x32xf32>, %B: memref<32x32xf32>) {
+ affine.for %i = 0 to 32 {
+ affine.for %j = 0 to 32 {
+ %0 = affine.load %C[%i, %j] : memref<32x32xf32>
+ %1 = mulf %beta, %0 : f32
+ affine.store %1, %C[%i, %j] : memref<32x32xf32>
+ affine.for %k = 0 to 32 {
+ %2 = affine.load %A[%i, %k] : memref<32x32xf32>
+ %3 = affine.load %B[%k, %j] : memref<32x32xf32>
+ %4 = affine.load %C[%i, %j] : memref<32x32xf32>
+ %5 = mulf %alpha, %2 : f32
+ %6 = mulf %5, %3 : f32
+ %7 = addf %4, %6 : f32
+ affine.store %7, %C[%i, %j] : memref<32x32xf32>
+ }
+ }
+ }
+ return
+}
\ No newline at end of file
diff --git a/documentation/everest_summer_school/Exercise2/gemm_32_test.xml b/documentation/everest_summer_school/Exercise2/gemm_32_test.xml
new file mode 100644
index 000000000..0d4d74e41
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise2/gemm_32_test.xml
@@ -0,0 +1,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/documentation/everest_summer_school/Exercise2/helmholtz.c.interface.xml b/documentation/everest_summer_school/Exercise2/helmholtz.c.interface.xml
new file mode 100644
index 000000000..585cfd5d9
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise2/helmholtz.c.interface.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/documentation/everest_summer_school/Exercise2/helmholtz.mlir b/documentation/everest_summer_school/Exercise2/helmholtz.mlir
new file mode 100644
index 000000000..db90767c0
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise2/helmholtz.mlir
@@ -0,0 +1,107 @@
+#le_10 = affine_set<(i): (10 - i >= 0)>
+#ge_10 = affine_set<(i): (i - 10 >= 0)>
+#eq_0_le_10 = affine_set<(i, j): (i == 0, 10 - j >= 0)>
+#eq_10 = affine_set<(i): (i - 10 == 0)>
+
+module {
+
+ func @kernel(%S: memref<11x11xf64>{ llvm.name = "S" }, %D: memref<11x11x11xf64>{ llvm.name = "D" }, %u: memref<11x11x11xf64>{ llvm.name = "u" }, %v: memref<11x11x11xf64>{ llvm.name = "v" }, %t: memref<11x11x11xf64>{ llvm.name = "t" }, %r: memref<11x11x11xf64>{ llvm.name = "r" }, %t0: memref<11x11x11xf64>{ llvm.name = "t0" }, %t1: memref<11x11x11xf64>{ llvm.name = "t1" }, %t2: memref<11x11x11xf64>{ llvm.name = "t2" }, %t3: memref<11x11x11xf64>{ llvm.name = "t3" }) {
+ %zero = std.constant 0.0 : f64
+
+ affine.for %c1 = 0 to 10 {
+ affine.for %c2 = 0 to 10 {
+ affine.for %c3 = 0 to 10 {
+ affine.store %zero, %t1[%c1,%c2,%c3] : memref<11x11x11xf64>
+ affine.for %c4 = 0 to 20 {
+ affine.if #le_10(%c4) {
+ %1 = affine.load %S[%c1,%c4] : memref<11x11xf64>
+ %2 = affine.load %u[%c2,%c3,%c4] : memref<11x11x11xf64>
+ %3 = mulf %1, %2 : f64
+ %4 = affine.load %t1[%c1,%c2,%c3] : memref<11x11x11xf64>
+ %5 = addf %3, %4 : f64
+ affine.store %5, %t1[%c1,%c2,%c3] : memref<11x11x11xf64>
+ }
+ affine.if #ge_10(%c4) {
+ %1 = affine.load %S[%c3,%c4 - 10] : memref<11x11xf64>
+ %2 = affine.load %t1[%c1,%c2,%c3] : memref<11x11x11xf64>
+ %3 = mulf %1, %2 : f64
+ %4 = affine.load %t0[%c4 - 10,%c1,%c2] : memref<11x11x11xf64>
+ %5 = addf %3, %4 : f64
+ affine.store %5, %t0[%c4 - 10,%c1,%c2] : memref<11x11x11xf64>
+ }
+ affine.if #eq_0_le_10(%c3,%c4) {
+ affine.store %zero, %t0[%c4,%c1,%c2] : memref<11x11x11xf64>
+ }
+ }
+ }
+ }
+ }
+
+ affine.for %c1 = 0 to 10 {
+ affine.for %c2 = 0 to 10 {
+ affine.for %c3 = 0 to 10 {
+ affine.store %zero, %t[%c1,%c2,%c3] : memref<11x11x11xf64>
+ affine.for %c4 = 0 to 20 {
+ affine.if #le_10(%c4) {
+ %1 = affine.load %S[%c1,%c4] : memref<11x11xf64>
+ %2 = affine.load %t0[%c2,%c3,%c4] : memref<11x11x11xf64>
+ %3 = mulf %1, %2 : f64
+ %4 = affine.load %t[%c1,%c2,%c3] : memref<11x11x11xf64>
+ %5 = addf %3, %4 : f64
+ affine.store %5, %t[%c1,%c2,%c3] : memref<11x11x11xf64>
+ affine.if #eq_10(%c4) {
+ %6 = affine.load %D[%c1,%c2,%c3]: memref<11x11x11xf64>
+ %7 = affine.load %t[%c1,%c2,%c3]: memref<11x11x11xf64>
+ %8 = mulf %6, %7 : f64
+ affine.store %8, %r[%c1,%c2,%c3] : memref<11x11x11xf64>
+ }
+ }
+ affine.if #ge_10(%c4) {
+ %1 = affine.load %S[%c3,%c4 - 10] : memref<11x11xf64>
+ %2 = affine.load %t[%c1,%c2,%c3] : memref<11x11x11xf64>
+ %3 = mulf %1, %2 : f64
+ %4 = affine.load %t3[%c4 - 10,%c1,%c2] : memref<11x11x11xf64>
+ %5 = addf %3, %4 : f64
+ affine.store %5, %t3[%c4 - 10,%c1,%c2] : memref<11x11x11xf64>
+ }
+ affine.if #eq_0_le_10(%c3,%c4) {
+ affine.store %zero, %t3[%c4,%c1,%c2] : memref<11x11x11xf64>
+ }
+ }
+ }
+ }
+ }
+
+ affine.for %c1 = 0 to 10 {
+ affine.for %c2 = 0 to 10 {
+ affine.for %c3 = 0 to 10 {
+ affine.for %c4 = 0 to 10 {
+ affine.if #eq_10(%c3) {
+ affine.store %zero, %v[%c4,%c1,%c2] : memref<11x11x11xf64>
+ }
+ affine.if #eq_10(%c4) {
+ affine.store %zero, %t2[%c1,%c2,%c3] : memref<11x11x11xf64>
+ }
+ %1 = affine.load %S[%c4,%c1] : memref<11x11xf64>
+ %2 = affine.load %t3[%c2,%c3,%c4] : memref<11x11x11xf64>
+ %3 = mulf %1, %2 : f64
+ %4 = affine.load %t2[%c1,%c2,%c3] : memref<11x11x11xf64>
+ %5 = addf %3, %4 : f64
+ affine.store %5,%t2[%c1,%c2,%c3] : memref<11x11x11xf64>
+ }
+ affine.for %c4 = 10 to 20 {
+ %1 = affine.load %S[%c3,%c4 - 10] : memref<11x11xf64>
+ %2 = affine.load %t2[%c1,%c2,%c3] : memref<11x11x11xf64>
+ %3 = mulf %1, %2 : f64
+ %4 = affine.load %v[%c4 - 10,%c1,%c2] : memref<11x11x11xf64>
+ %5 = addf %3, %4 : f64
+ affine.store %5, %v[%c4 - 10,%c1,%c2] : memref<11x11x11xf64>
+ }
+ }
+ }
+ }
+
+ return
+ }
+
+}
diff --git a/documentation/everest_summer_school/Exercise2/helmholtz_test.xml b/documentation/everest_summer_school/Exercise2/helmholtz_test.xml
new file mode 100644
index 000000000..5a67478d5
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise2/helmholtz_test.xml
@@ -0,0 +1,14 @@
+
+
+
+
\ No newline at end of file
diff --git a/documentation/everest_summer_school/Exercise3/bambu.sh b/documentation/everest_summer_school/Exercise3/bambu.sh
new file mode 100755
index 000000000..1f3056141
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise3/bambu.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)
+
+bambu $root_dir/trinityq4/lubm_trinityq4.c --top-fname=search \
+ $root_dir/common/atominIncrement.c $root_dir/common/data.c -I$root_dir/common/ \
+ --compiler=I386_GCC49 --experimental-set=BAMBU -O3 --std=c99 -fno-delete-null-pointer-checks \
+ --channels-type=MEM_ACC_11 --memory-allocation-policy=NO_BRAM \
+ --device-name=xc7vx690t-3ffg1930-VVD --clock-period=10 \
+ -DMAX_VERTEX_NUMBER=26455 -DMAX_EDGE_NUMBER=100573 -DN_THREADS=1 \
+ --mem-delay-read=20 --mem-delay-write=20 \
+ --generate-tb=$root_dir/test-1.xml --simulator=VERILATOR --simulate \
+ -v3 "$@" |& tee log.txt
diff --git a/documentation/everest_summer_school/Exercise3/common/atominIncrement.c b/documentation/everest_summer_school/Exercise3/common/atominIncrement.c
new file mode 100644
index 000000000..aba8a801e
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise3/common/atominIncrement.c
@@ -0,0 +1,8 @@
+__attribute__((noinline))
+void atomicIncrement(unsigned * var, unsigned value)
+{
+#pragma omp atomic
+ *var += value;
+}
+
+
diff --git a/documentation/everest_summer_school/Exercise3/common/data.c b/documentation/everest_summer_school/Exercise3/common/data.c
new file mode 100644
index 000000000..6e48ffd72
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise3/common/data.c
@@ -0,0 +1,8 @@
+#include "simple_API.h"
+
+unsigned counter[N_THREADS] = { 0 };
+
+unsigned numAnswers = 0;
+
+Graph TheGraph;
+
diff --git a/documentation/everest_summer_school/Exercise3/common/load_graph.c b/documentation/everest_summer_school/Exercise3/common/load_graph.c
new file mode 100644
index 000000000..4efe16c52
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise3/common/load_graph.c
@@ -0,0 +1,60 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include "simple_API.h"
+
+void
+loadGraph(char * InVertexFileName, char * OutVertexFileName, char * InEdgeFileName, char * OutEdgeFileName)
+{
+ int IVF, OVF, IEF, OEF;
+
+ IVF = open(InVertexFileName, O_RDONLY);
+ assert(IVF != -1);
+ OVF = open(OutVertexFileName, O_RDONLY);
+ assert(OVF != -1);
+ IEF = open(InEdgeFileName, O_RDONLY);
+ assert(IEF != -1);
+ OEF = open(OutEdgeFileName, O_RDONLY);
+ assert(OEF != -1);
+
+ unsigned int vertexNumber, secondvertexNumber;
+ unsigned int inEdgeNumber;
+ unsigned int outEdgeNumber;
+ unsigned bytes_read;
+ bytes_read = read(IVF, &vertexNumber, sizeof(unsigned int));
+ assert(bytes_read == sizeof(unsigned int));
+ bytes_read = read(OVF, &secondvertexNumber, sizeof(unsigned int));
+ assert(secondvertexNumber == vertexNumber);
+ assert(bytes_read == sizeof(unsigned int));
+
+ bytes_read = read(IEF, &inEdgeNumber, sizeof(unsigned int));
+ assert(bytes_read == sizeof(unsigned int));
+ bytes_read = read(OEF, &outEdgeNumber, sizeof(unsigned int));
+ assert(bytes_read == sizeof(unsigned int));
+
+ TheGraph.numVertices = vertexNumber - 1;
+ printf("VertexNumber : %lu\n", TheGraph.numVertices);
+ printf("InEdgeNumber : %d\n", inEdgeNumber);
+ printf("outEdgeNumber : %d\n", outEdgeNumber);
+
+ bytes_read = read(IVF, TheGraph.inEdgesIDs, sizeof(TheGraph.inEdgesIDs[0]) * (TheGraph.numVertices + 1));
+ assert(bytes_read == sizeof(TheGraph.inEdgesIDs[0]) * (TheGraph.numVertices + 1));
+ bytes_read = read(OVF, TheGraph.outEdgesIDs, sizeof(TheGraph.outEdgesIDs[0]) * (TheGraph.numVertices + 1));
+ assert(bytes_read == sizeof(TheGraph.outEdgesIDs[0]) * (TheGraph.numVertices + 1));
+
+ bytes_read = read(IEF, TheGraph.inEdges, sizeof(Edge) * inEdgeNumber);
+ assert(bytes_read == sizeof(Edge) * inEdgeNumber);
+ bytes_read = read(OEF, TheGraph.outEdges, sizeof(Edge) * outEdgeNumber);
+ assert(bytes_read == sizeof(Edge) * outEdgeNumber);
+
+ printf("Graph Loading Completed!\n");
+
+ close(IVF);
+ close(OVF);
+ close(IEF);
+ close(OEF);
+}
+
diff --git a/documentation/everest_summer_school/Exercise3/common/simple_API.h b/documentation/everest_summer_school/Exercise3/common/simple_API.h
new file mode 100644
index 000000000..16cd71b58
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise3/common/simple_API.h
@@ -0,0 +1,79 @@
+#ifndef __GRAPH_H__
+#define __GRAPH_H__
+
+#include
+
+#ifndef N_THREADS
+#define N_THREADS 8
+#endif
+
+
+typedef unsigned int NodeId;
+typedef unsigned int EdgeId;
+typedef unsigned int PropertyId;
+
+
+typedef struct Edge {
+ NodeId node;
+ PropertyId property;
+} Edge;
+
+#ifndef MAX_VERTEX_NUMBER
+#define MAX_VERTEX_NUMBER 1309073
+#endif
+
+#ifndef MAX_EDGE_NUMBER
+#define MAX_EDGE_NUMBER 5309056
+#endif
+
+typedef struct Graph {
+ size_t numVertices;
+// PropertyId * VertexPropertyVector;
+ EdgeId outEdgesIDs[MAX_VERTEX_NUMBER];
+ EdgeId inEdgesIDs[MAX_VERTEX_NUMBER];
+
+ Edge inEdges[MAX_EDGE_NUMBER];
+ Edge outEdges[MAX_EDGE_NUMBER];
+} Graph;
+
+
+//===----------------------------------------------------------------------===//
+// Backward Star Interface
+//===----------------------------------------------------------------------===//
+
+//size_t getInDegree(Graph * graph, NodeId node);
+static inline size_t getInDegree(Graph * graph, NodeId node) {
+ return graph->inEdgesIDs[node+1] - graph->inEdgesIDs[node];
+}
+
+//Edge * getInEdges(Graph * graph, NodeId node);
+static inline Edge * getInEdges(Graph * graph, NodeId node) {
+ EdgeId idx = graph->inEdgesIDs[node];
+ return &graph->inEdges[idx];
+}
+
+//===----------------------------------------------------------------------===//
+// Forward Star Interface
+//===----------------------------------------------------------------------===//
+
+//size_t getOutDegree(Graph * graph, NodeId node);
+static inline size_t getOutDegree(Graph * graph, NodeId node) {
+ return graph->outEdgesIDs[node+1] - graph->outEdgesIDs[node];
+}
+
+//Edge * getOutEdges(Graph * graph, NodeId node);
+static inline Edge * getOutEdges(Graph * graph, NodeId node) {
+ EdgeId idx = graph->outEdgesIDs[node];
+ return &graph->outEdges[idx];
+}
+
+extern void
+loadGraph(char * InVertexFileName, char * OutVertexFileName, char * InEdgeFileName, char * OutEdgeFileName);
+
+extern Graph TheGraph;
+
+extern unsigned numAnswers;
+
+extern unsigned counter[N_THREADS];
+
+#endif /* __GRAPH_H__ */
diff --git a/documentation/everest_summer_school/Exercise3/test-1.xml b/documentation/everest_summer_school/Exercise3/test-1.xml
new file mode 100644
index 000000000..dd25e493a
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise3/test-1.xml
@@ -0,0 +1,25420 @@
+
+
+
+
diff --git a/documentation/everest_summer_school/Exercise3/trinityq4/lubm_trinityq4.c b/documentation/everest_summer_school/Exercise3/trinityq4/lubm_trinityq4.c
new file mode 100644
index 000000000..49b82939f
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise3/trinityq4/lubm_trinityq4.c
@@ -0,0 +1,133 @@
+#include
+#include "simple_API.h"
+
+// var_2 = ""
+// p_var_3 = "ub:worksFor"
+// p_var_4 = "ub:FullProfessor"
+// p_var_5 = "a"
+// p_var_7 = "ub:name"
+// p_var_9 = "ub:emailAddress"
+// p_var_11 = "ub:telephone"
+
+__attribute__((noinline))
+void kernel(size_t i_var_3, Graph * graph, NodeId var_2, PropertyId p_var_3, PropertyId p_var_4, PropertyId p_var_5, PropertyId p_var_7, PropertyId p_var_9, PropertyId p_var_11, size_t in_degree_var_2, Edge * var_2_1_inEdges)
+{
+ unsigned localCounter = 0;
+ PropertyId var_3; //corresponding to element having label "ub:worksFor"
+ var_3 = var_2_1_inEdges[i_var_3].property;
+ NodeId var_1; //corresponding to element having label "?X"
+ var_1 = var_2_1_inEdges[i_var_3].node;
+ int cond_level_2 = (var_3 == p_var_3);
+ if(cond_level_2)
+ {
+ size_t out_degree_var_1 = getOutDegree(graph, var_1);
+ Edge * var_1_3_outEdges = getOutEdges(graph, var_1);
+ size_t i_var_5;
+ for(i_var_5=0; i_var_5 < out_degree_var_1; i_var_5++)
+ {
+ PropertyId var_5; //corresponding to element having label "a"
+ var_5 = var_1_3_outEdges[i_var_5].property;
+ NodeId var_4; //corresponding to element having label "ub:FullProfessor"
+ var_4 = var_1_3_outEdges[i_var_5].node;
+ int cond_level_4 = ((var_5 == p_var_5) & (var_4 == p_var_4));
+ if(cond_level_4)
+ {
+ Edge * var_1_5_outEdges = getOutEdges(graph, var_1);
+ size_t i_var_7;
+ for(i_var_7=0; i_var_7 < out_degree_var_1; i_var_7++)
+ {
+ PropertyId var_7; //corresponding to element having label "ub:name"
+ var_7 = var_1_5_outEdges[i_var_7].property;
+ NodeId var_6; //corresponding to element having label "?Y1"
+ var_6 = var_1_5_outEdges[i_var_7].node;
+ int cond_level_6 = (var_7 == p_var_7);
+ if(cond_level_6)
+ {
+ Edge * var_1_7_outEdges = getOutEdges(graph, var_1);
+ size_t i_var_9;
+ for(i_var_9=0; i_var_9 < out_degree_var_1; i_var_9++)
+ {
+ PropertyId var_9; //corresponding to element having label "ub:emailAddress"
+ var_9 = var_1_7_outEdges[i_var_9].property;
+ NodeId var_8; //corresponding to element having label "?Y2"
+ var_8 = var_1_7_outEdges[i_var_9].node;
+ int cond_level_8 = (var_9 == p_var_9);
+ if(cond_level_8)
+ {
+ Edge * var_1_9_outEdges = getOutEdges(graph, var_1);
+ size_t i_var_11;
+ for(i_var_11=0; i_var_11 < out_degree_var_1; i_var_11++)
+ {
+ PropertyId var_11; //corresponding to element having label "ub:telephone"
+ var_11 = var_1_9_outEdges[i_var_11].property;
+ NodeId var_10; //corresponding to element having label "?Y3"
+ var_10 = var_1_9_outEdges[i_var_11].node;
+ int cond_level_10 = (var_11 == p_var_11);
+ if(cond_level_10)
+ {
+ // here the "required" results are written (if any)
+ localCounter++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ atomicIncrement(&(counter[i_var_3 % N_THREADS]), localCounter);
+ }
+}
+
+__attribute__((noinline))
+void parallel(Graph * graph, NodeId var_2, PropertyId p_var_3, PropertyId p_var_4, PropertyId p_var_5, PropertyId p_var_7, PropertyId p_var_9, PropertyId p_var_11, size_t in_degree_var_2, Edge * var_2_1_inEdges)
+{
+ size_t i_var_3;
+ #pragma omp parallel for
+ for(i_var_3=0; i_var_3 < in_degree_var_2; i_var_3++)
+ {
+ kernel(i_var_3, graph, var_2, p_var_3, p_var_4, p_var_5, p_var_7, p_var_9, p_var_11, in_degree_var_2, var_2_1_inEdges);
+ }
+}
+
+__attribute__((noinline))
+int search(Graph * graph, NodeId var_2, PropertyId p_var_3, PropertyId p_var_4, PropertyId p_var_5, PropertyId p_var_7, PropertyId p_var_9, PropertyId p_var_11)
+{
+ size_t in_degree_var_2 = getInDegree(graph, var_2);
+ Edge * var_2_1_inEdges = getInEdges(graph, var_2);
+ printf("In degree %d\n", in_degree_var_2);
+ parallel(graph, var_2, p_var_3, p_var_4, p_var_5, p_var_7, p_var_9, p_var_11, in_degree_var_2, var_2_1_inEdges);
+ for (int i = 0; i < N_THREADS; ++i)
+ numAnswers += counter[i];
+ return numAnswers;
+}
+
+
+int test(NodeId var_2, PropertyId p_var_3, PropertyId p_var_4, PropertyId p_var_5, PropertyId p_var_7, PropertyId p_var_9, PropertyId p_var_11)
+{
+#if defined(DATASETInVertexFile) && defined(DATASETOutVertexFile) && defined(DATASETInEdgeFile) && defined(DATASETOutEdgeFile)
+ loadGraph(DATASETInVertexFile, DATASETOutVertexFile, DATASETInEdgeFile, DATASETOutEdgeFile);
+#else
+ //loadGraph("dataset/40-InVertexFile.bin", "dataset/40-OutVertexFile.bin", "dataset/40-InEdgeFile.bin", "dataset/40-OutEdgeFile.bin");
+ loadGraph("dataset/1-InVertexFile.bin", "dataset/1-OutVertexFile.bin", "dataset/1-InEdgeFile.bin", "dataset/1-OutEdgeFile.bin");
+#endif
+
+// var_2 = "" 4804
+// p_var_3 = "ub:worksFor" 16
+// p_var_4 = "ub:FullProfessor" 21219
+// p_var_5 = "a" 14
+// p_var_7 = "ub:name" 17
+// p_var_9 = "ub:emailAddress" 10
+// p_var_11 = "ub:telephone" 11
+ int ret_value = search(&TheGraph, var_2, p_var_3, p_var_4, p_var_5, p_var_7, p_var_9, p_var_11);
+ printf("%d\n", ret_value);
+ return ret_value;
+}
+
+
+#ifdef DEBUG
+int main() {
+ return test(8204, 2, 6764, 10, 8, 17, 16) != 10;
+ //return test(4804, 16, 21219, 14, 17, 10, 11);
+}
+#endif
diff --git a/documentation/everest_summer_school/Exercise4/ap_example.cpp b/documentation/everest_summer_school/Exercise4/ap_example.cpp
new file mode 100644
index 000000000..4f254c012
--- /dev/null
+++ b/documentation/everest_summer_school/Exercise4/ap_example.cpp
@@ -0,0 +1,23 @@
+#include
+#include "ap_int.h"
+#define SIMULATION 1
+#pragma HLS_interface x_fifo fifo
+#pragma HLS_interface y_fifo fifo
+#pragma HLS_interface res fifo
+void gcd(ap_int<11>* x_fifo, ap_int<11>* y_fifo, ap_int<11>* res)
+{
+ do
+ {
+ ap_int<11> x = *x_fifo, y = *y_fifo;
+ if( x < y )
+ std::swap( x, y );
+
+ while( y > 0 )
+ {
+ int f = x % y;
+ x = y;
+ y = f;
+ }
+ *res = x;
+ } while(!SIMULATION);
+}
\ No newline at end of file
diff --git a/documentation/everest_summer_school/README.md b/documentation/everest_summer_school/README.md
new file mode 100644
index 000000000..c39847aea
--- /dev/null
+++ b/documentation/everest_summer_school/README.md
@@ -0,0 +1 @@
+[](https://colab.research.google.com/github/ferrandi/PandA-bambu/blob/everest-school/documentation/everest_summer_school/bambu.ipynb)
diff --git a/documentation/everest_summer_school/bambu.ipynb b/documentation/everest_summer_school/bambu.ipynb
new file mode 100644
index 000000000..5be6c933a
--- /dev/null
+++ b/documentation/everest_summer_school/bambu.ipynb
@@ -0,0 +1,319 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "c97blcSRzP24"
+ },
+ "source": [
+ "# Initial setup"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "A_6a_kbExQOY"
+ },
+ "source": [
+ "Install Bambu and required packages:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ZoxqLkfA9zqM",
+ "tags": [
+ "outputPrepend"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "!add-apt-repository -y ppa:git-core/ppa\n",
+ "!apt-get update\n",
+ "!apt-get install -y --no-install-recommends build-essential ca-certificates gcc-multilib git iverilog verilator\n",
+ "!wget https://release.bambuhls.eu/appimage/bambu-fpl22.AppImage\n",
+ "!chmod +x bambu-*.AppImage\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/bambu\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/spider\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/tree-panda-gcc\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/clang-12\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/mlir-opt-12\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/mlir-translate-12\n",
+ "!rm -rf PandA-bambu bambu-tutorial\n",
+ "!git clone --depth 1 --filter=blob:none --branch everest-school --sparse https://github.com/ferrandi/PandA-bambu.git\n",
+ "%cd PandA-bambu\n",
+ "!git sparse-checkout set documentation/everest_summer_school\n",
+ "%cd ..\n",
+ "!mv PandA-bambu/documentation/everest_summer_school/ bambu-tutorial"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ZQTYHMwaSn2_"
+ },
+ "source": [
+ "Check the installation:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "k-PFiPN4S5q9"
+ },
+ "outputs": [],
+ "source": [
+ "!bambu -h"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!mlir-opt-12 --help"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "D1bDtlfzJcTS"
+ },
+ "source": [
+ "# Bambu inputs and outputs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "hjqK9XaZ7ryo"
+ },
+ "source": [
+ "\n",
+ "Example C code in /content/bambu-tutorial/Exercise1/icrc.c"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "pjUguz8lZr_2"
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/Exercise1\n",
+ "!bambu icrc.c --top-fname=icrc1 --simulator=VERILATOR --simulate --generate-tb=test_icrc1.xml -v2 --print-dot --pretty-print=a.c 2>&1 | tee icrc1.log"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "zXTGPFLA1Dmj"
+ },
+ "source": [
+ "Inspect the generated files in the explorer tab on the left:\n",
+ "\n",
+ "* /content/bambu-tutorial/Exercise1/icrc1.v\n",
+ "* /content/bambu-tutorial/Exercise1/simulate_icrc1.sh\n",
+ "* /content/bambu-tutorial/Exercise1/synthesize_Synthesis_icrc1.sh\n",
+ "* /content/bambu-tutorial/Exercise1/a.c\n",
+ "\n",
+ "\n",
+ "\n",
+ "Visualize the FSM:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "IYUayuTqzb2I"
+ },
+ "outputs": [],
+ "source": [
+ "from graphviz import Source\n",
+ "Source.from_file('HLS_output/dot/icrc1/HLS_STGraph.dot')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Try out:\n",
+ "\n",
+ "* different target board\n",
+ "* different clock period\n",
+ "* VHDL instead of Verilog output\n",
+ "* different verbosity level"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "A50OIi5sS_6C"
+ },
+ "source": [
+ "# HLS of an MLIR kernel"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "RrL80EzbavGk"
+ },
+ "source": [
+ "Source code: /content/bambu-tutorial/Exercise2/gemm_32.mlir and /content/bambu-tutorial/Exercise2/helmholtz.mlir"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "RempES6CTcvl"
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/Exercise2/\n",
+ "!mlir-opt-12 /content/bambu-tutorial/Exercise2/gemm_32.mlir -lower-affine -convert-scf-to-std -convert-std-to-llvm='use-bare-ptr-memref-call-conv=1' -o /content/bambu-tutorial/Exercise2/gemm_32.llvm.mlir\n",
+ "!mlir-translate-12 /content/bambu-tutorial/Exercise2/gemm_32.llvm.mlir --mlir-to-llvmir -o /content/bambu-tutorial/Exercise2/gemm_32.ll\n",
+ "!bambu gemm_32.ll --simulate --generate-tb=gemm_32_test.xml --no-clean --compiler=I386_CLANG12 --top-fname=gemm_32 --simulator=VERILATOR -v2 --print-dot |& tee log.txt"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Try out:\n",
+ "* synthesize the Helmholtz kernel\n",
+ "* use the --generate-interface option\n",
+ "* apply mlir-opt optimizations before synthesis\n",
+ "* disable function proxies to allocate floating point units in parallel"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ZZx_VzZhVjPM"
+ },
+ "source": [
+ "# OpenMP parallel for"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "xWz2csytVp8L"
+ },
+ "source": [
+ "Source code: /content/bambu-tutorial/Exercise3/trinityq4/lubm_trinityq4.c\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ialdoCMUWFJb"
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/Exercise3/\n",
+ "!bambu trinityq4/lubm_trinityq4.c --top-fname=search \\\n",
+ " common/atominIncrement.c common/data.c -Icommon/ \\\n",
+ " --compiler=I386_GCC49 --experimental-set=BAMBU -O3 --std=c99 -fno-delete-null-pointer-checks \\\n",
+ " --channels-type=MEM_ACC_11 --memory-allocation-policy=NO_BRAM \\\n",
+ " --device-name=xc7vx690t-3ffg1930-VVD --clock-period=10 \\\n",
+ " -DMAX_VERTEX_NUMBER=26455 -DMAX_EDGE_NUMBER=100573 -DN_THREADS=2 \\\n",
+ " --mem-delay-read=20 --mem-delay-write=20 \\\n",
+ " --generate-tb=test-1.xml --simulator=VERILATOR --simulate \\\n",
+ " --pragma-parse --num-accelerators=2 --memory-banks-number=4 --channels-number=2 --context_switch=4 \\\n",
+ " -v3 |& tee log.txt"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "UQk1Ejx7UOvn"
+ },
+ "source": [
+ "# ap_types and ac_types support"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "bxF6AZ_bopOF"
+ },
+ "source": [
+ "Synthesis of an accelerator with 11-bit data, input and output fifo ports."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "64KpRMlulJ9H"
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/Exercise4\n",
+ "!bambu ap_example.cpp --simulate --no-clean --compiler=I386_CLANG12 --generate-interface=INFER --top-fname=gcd --simulator=VERILATOR"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "fiAhPOCr65BN"
+ },
+ "source": [
+ "## Custom floating point synthesis\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "5TmC9hsp6_oJ"
+ },
+ "outputs": [],
+ "source": [
+ "%cp /content/bambu-tutorial/Exercise2/gemm_32.ll /content/bambu-tutorial/Exercise4\n",
+ "%cp /content/bambu-tutorial/Exercise2/gemm_32_test.xml /content/bambu-tutorial/Exercise4\n",
+ "!bambu gemm_32.ll --simulate --no-clean --compiler=I386_CLANG12 --top-fname=gemm_32 --simulator=VERILATOR --generate-tb=gemm_32_test.xml -v4 --disable-function-proxy --print-dot --fp-format=\"gemm_32*e8m7b-127tih0\" --max-ulp=2000000 |& tee log.bfloat16.txt"
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "collapsed_sections": [],
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 2.7.18 ('.venv_soda': venv)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.18"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "ad6ec13b37167c9322c586dd4a0d547738ae296af85cae52c29a9012bd101b62"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise1/bambu.sh b/documentation/tutorial_pact_2022/01-introduction/Exercise1/bambu.sh
new file mode 100755
index 000000000..34be96f47
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise1/bambu.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)
+
+rm -rf icrc1
+mkdir -p icrc1
+cd icrc1
+echo "#synthesis of icrc1"
+bambu ../icrc.c --top-fname=icrc1 \
+ --generate-tb=../test_icrc1.xml --simulator=VERILATOR --simulate \
+ -v2 --print-dot --pretty-print=a.c "$@" |& tee icrc1.log
\ No newline at end of file
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise1/icrc.c b/documentation/tutorial_pact_2022/01-introduction/Exercise1/icrc.c
new file mode 100644
index 000000000..8852b50a1
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise1/icrc.c
@@ -0,0 +1,14 @@
+unsigned short icrc1(unsigned short crc, unsigned char onech)
+{
+ int i;
+ unsigned short ans=(crc^onech << 8);
+
+ for (i=0;i<8;i++) {
+ if (ans & 0x8000)
+ ans = (ans <<= 1) ^ 4129;
+ else
+ ans <<= 1;
+ }
+ return ans;
+}
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise2/solution/minmax.c b/documentation/tutorial_pact_2022/01-introduction/Exercise2/solution/minmax.c
new file mode 100644
index 000000000..2058b7576
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise2/solution/minmax.c
@@ -0,0 +1,19 @@
+void min_max(int * input, int num_elements, int * max, int * min)
+{
+ int local_max = input[0];
+ int local_min = input[0];
+ int i = 0;
+ for(i = 0; i < num_elements; i++)
+ {
+ if(input[i] > local_max)
+ {
+ local_max = input[i];
+ }
+ else if(input[i] < local_min)
+ {
+ local_min = input[i];
+ }
+ }
+ *min = local_min;
+ *max = local_max;
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise2/solution/synthesize.sh b/documentation/tutorial_pact_2022/01-introduction/Exercise2/solution/synthesize.sh
new file mode 100755
index 000000000..48f30b583
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise2/solution/synthesize.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+bambu minmax.c --generate-tb=testbench.xml --simulate "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise2/solution/testbench.xml b/documentation/tutorial_pact_2022/01-introduction/Exercise2/solution/testbench.xml
new file mode 100644
index 000000000..3781cfbc4
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise2/solution/testbench.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise3/bambu.sh b/documentation/tutorial_pact_2022/01-introduction/Exercise3/bambu.sh
new file mode 100644
index 000000000..d8574c1d5
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise3/bambu.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+bambu matmul.ll --top-fname=main_kernel --generate-tb=test.xml --simulate --simulator=VERILATOR --compiler=I386_CLANG12 "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise3/matmul.ll b/documentation/tutorial_pact_2022/01-introduction/Exercise3/matmul.ll
new file mode 100644
index 000000000..b23ebcf11
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise3/matmul.ll
@@ -0,0 +1,637 @@
+; ModuleID = 'LLVMDialectModule'
+source_filename = "LLVMDialectModule"
+
+declare i8* @malloc(i64)
+
+declare void @free(i8*)
+
+define void @main_kernel(float* noalias %0, float* noalias %1, float* noalias %2) !dbg !3 {
+ %4 = alloca float, i64 ptrtoint (float* getelementptr (float, float* null, i64 16) to i64), align 4, !dbg !7
+ %5 = getelementptr float, float* %0, i64 0, !dbg !9
+ %6 = load float, float* %5, align 4, !dbg !10
+ %7 = getelementptr float, float* %4, i64 0, !dbg !11
+ store float %6, float* %7, align 4, !dbg !12
+ %8 = getelementptr float, float* %0, i64 1, !dbg !13
+ %9 = load float, float* %8, align 4, !dbg !14
+ %10 = getelementptr float, float* %4, i64 1, !dbg !15
+ store float %9, float* %10, align 4, !dbg !16
+ %11 = getelementptr float, float* %0, i64 2, !dbg !17
+ %12 = load float, float* %11, align 4, !dbg !18
+ %13 = getelementptr float, float* %4, i64 2, !dbg !19
+ store float %12, float* %13, align 4, !dbg !20
+ %14 = getelementptr float, float* %0, i64 3, !dbg !21
+ %15 = load float, float* %14, align 4, !dbg !22
+ %16 = getelementptr float, float* %4, i64 3, !dbg !23
+ store float %15, float* %16, align 4, !dbg !24
+ %17 = getelementptr float, float* %0, i64 4, !dbg !25
+ %18 = load float, float* %17, align 4, !dbg !26
+ %19 = getelementptr float, float* %4, i64 4, !dbg !27
+ store float %18, float* %19, align 4, !dbg !28
+ %20 = getelementptr float, float* %0, i64 5, !dbg !29
+ %21 = load float, float* %20, align 4, !dbg !30
+ %22 = getelementptr float, float* %4, i64 5, !dbg !31
+ store float %21, float* %22, align 4, !dbg !32
+ %23 = getelementptr float, float* %0, i64 6, !dbg !33
+ %24 = load float, float* %23, align 4, !dbg !34
+ %25 = getelementptr float, float* %4, i64 6, !dbg !35
+ store float %24, float* %25, align 4, !dbg !36
+ %26 = getelementptr float, float* %0, i64 7, !dbg !37
+ %27 = load float, float* %26, align 4, !dbg !38
+ %28 = getelementptr float, float* %4, i64 7, !dbg !39
+ store float %27, float* %28, align 4, !dbg !40
+ %29 = getelementptr float, float* %0, i64 8, !dbg !41
+ %30 = load float, float* %29, align 4, !dbg !42
+ %31 = getelementptr float, float* %4, i64 8, !dbg !43
+ store float %30, float* %31, align 4, !dbg !44
+ %32 = getelementptr float, float* %0, i64 9, !dbg !45
+ %33 = load float, float* %32, align 4, !dbg !46
+ %34 = getelementptr float, float* %4, i64 9, !dbg !47
+ store float %33, float* %34, align 4, !dbg !48
+ %35 = getelementptr float, float* %0, i64 10, !dbg !49
+ %36 = load float, float* %35, align 4, !dbg !50
+ %37 = getelementptr float, float* %4, i64 10, !dbg !51
+ store float %36, float* %37, align 4, !dbg !52
+ %38 = getelementptr float, float* %0, i64 11, !dbg !53
+ %39 = load float, float* %38, align 4, !dbg !54
+ %40 = getelementptr float, float* %4, i64 11, !dbg !55
+ store float %39, float* %40, align 4, !dbg !56
+ %41 = getelementptr float, float* %0, i64 12, !dbg !57
+ %42 = load float, float* %41, align 4, !dbg !58
+ %43 = getelementptr float, float* %4, i64 12, !dbg !59
+ store float %42, float* %43, align 4, !dbg !60
+ %44 = getelementptr float, float* %0, i64 13, !dbg !61
+ %45 = load float, float* %44, align 4, !dbg !62
+ %46 = getelementptr float, float* %4, i64 13, !dbg !63
+ store float %45, float* %46, align 4, !dbg !64
+ %47 = getelementptr float, float* %0, i64 14, !dbg !65
+ %48 = load float, float* %47, align 4, !dbg !66
+ %49 = getelementptr float, float* %4, i64 14, !dbg !67
+ store float %48, float* %49, align 4, !dbg !68
+ %50 = getelementptr float, float* %0, i64 15, !dbg !69
+ %51 = load float, float* %50, align 4, !dbg !70
+ %52 = getelementptr float, float* %4, i64 15, !dbg !71
+ store float %51, float* %52, align 4, !dbg !72
+ %53 = alloca float, i64 ptrtoint (float* getelementptr (float, float* null, i64 8) to i64), align 4, !dbg !73
+ %54 = getelementptr float, float* %1, i64 0, !dbg !74
+ %55 = load float, float* %54, align 4, !dbg !75
+ %56 = getelementptr float, float* %53, i64 0, !dbg !76
+ store float %55, float* %56, align 4, !dbg !77
+ %57 = getelementptr float, float* %1, i64 1, !dbg !78
+ %58 = load float, float* %57, align 4, !dbg !79
+ %59 = getelementptr float, float* %53, i64 1, !dbg !80
+ store float %58, float* %59, align 4, !dbg !81
+ %60 = getelementptr float, float* %1, i64 2, !dbg !82
+ %61 = load float, float* %60, align 4, !dbg !83
+ %62 = getelementptr float, float* %53, i64 2, !dbg !84
+ store float %61, float* %62, align 4, !dbg !85
+ %63 = getelementptr float, float* %1, i64 3, !dbg !86
+ %64 = load float, float* %63, align 4, !dbg !87
+ %65 = getelementptr float, float* %53, i64 3, !dbg !88
+ store float %64, float* %65, align 4, !dbg !89
+ %66 = getelementptr float, float* %1, i64 4, !dbg !90
+ %67 = load float, float* %66, align 4, !dbg !91
+ %68 = getelementptr float, float* %53, i64 4, !dbg !92
+ store float %67, float* %68, align 4, !dbg !93
+ %69 = getelementptr float, float* %1, i64 5, !dbg !94
+ %70 = load float, float* %69, align 4, !dbg !95
+ %71 = getelementptr float, float* %53, i64 5, !dbg !96
+ store float %70, float* %71, align 4, !dbg !97
+ %72 = getelementptr float, float* %1, i64 6, !dbg !98
+ %73 = load float, float* %72, align 4, !dbg !99
+ %74 = getelementptr float, float* %53, i64 6, !dbg !100
+ store float %73, float* %74, align 4, !dbg !101
+ %75 = getelementptr float, float* %1, i64 7, !dbg !102
+ %76 = load float, float* %75, align 4, !dbg !103
+ %77 = getelementptr float, float* %53, i64 7, !dbg !104
+ store float %76, float* %77, align 4, !dbg !105
+ %78 = alloca float, i64 ptrtoint (float* getelementptr (float, float* null, i64 8) to i64), align 4, !dbg !106
+ %79 = getelementptr float, float* %2, i64 0, !dbg !107
+ %80 = load float, float* %79, align 4, !dbg !108
+ %81 = getelementptr float, float* %78, i64 0, !dbg !109
+ store float %80, float* %81, align 4, !dbg !110
+ %82 = getelementptr float, float* %2, i64 1, !dbg !111
+ %83 = load float, float* %82, align 4, !dbg !112
+ %84 = getelementptr float, float* %78, i64 1, !dbg !113
+ store float %83, float* %84, align 4, !dbg !114
+ %85 = getelementptr float, float* %2, i64 2, !dbg !115
+ %86 = load float, float* %85, align 4, !dbg !116
+ %87 = getelementptr float, float* %78, i64 2, !dbg !117
+ store float %86, float* %87, align 4, !dbg !118
+ %88 = getelementptr float, float* %2, i64 3, !dbg !119
+ %89 = load float, float* %88, align 4, !dbg !120
+ %90 = getelementptr float, float* %78, i64 3, !dbg !121
+ store float %89, float* %90, align 4, !dbg !122
+ %91 = getelementptr float, float* %2, i64 4, !dbg !123
+ %92 = load float, float* %91, align 4, !dbg !124
+ %93 = getelementptr float, float* %78, i64 4, !dbg !125
+ store float %92, float* %93, align 4, !dbg !126
+ %94 = getelementptr float, float* %2, i64 5, !dbg !127
+ %95 = load float, float* %94, align 4, !dbg !128
+ %96 = getelementptr float, float* %78, i64 5, !dbg !129
+ store float %95, float* %96, align 4, !dbg !130
+ %97 = getelementptr float, float* %2, i64 6, !dbg !131
+ %98 = load float, float* %97, align 4, !dbg !132
+ %99 = getelementptr float, float* %78, i64 6, !dbg !133
+ store float %98, float* %99, align 4, !dbg !134
+ %100 = getelementptr float, float* %2, i64 7, !dbg !135
+ %101 = load float, float* %100, align 4, !dbg !136
+ %102 = getelementptr float, float* %78, i64 7, !dbg !137
+ store float %101, float* %102, align 4, !dbg !138
+ %103 = getelementptr float, float* %4, i64 0, !dbg !139
+ %104 = load float, float* %103, align 4, !dbg !140
+ %105 = getelementptr float, float* %53, i64 0, !dbg !141
+ %106 = load float, float* %105, align 4, !dbg !142
+ %107 = getelementptr float, float* %78, i64 0, !dbg !143
+ %108 = load float, float* %107, align 4, !dbg !144
+ %109 = fmul float %104, %106, !dbg !145
+ %110 = fadd float %108, %109, !dbg !146
+ %111 = getelementptr float, float* %4, i64 1, !dbg !147
+ %112 = load float, float* %111, align 4, !dbg !148
+ %113 = getelementptr float, float* %53, i64 2, !dbg !149
+ %114 = load float, float* %113, align 4, !dbg !150
+ %115 = fmul float %112, %114, !dbg !151
+ %116 = fadd float %110, %115, !dbg !152
+ %117 = getelementptr float, float* %4, i64 2, !dbg !153
+ %118 = load float, float* %117, align 4, !dbg !154
+ %119 = getelementptr float, float* %53, i64 4, !dbg !155
+ %120 = load float, float* %119, align 4, !dbg !156
+ %121 = fmul float %118, %120, !dbg !157
+ %122 = fadd float %116, %121, !dbg !158
+ %123 = getelementptr float, float* %4, i64 3, !dbg !159
+ %124 = load float, float* %123, align 4, !dbg !160
+ %125 = getelementptr float, float* %53, i64 6, !dbg !161
+ %126 = load float, float* %125, align 4, !dbg !162
+ %127 = fmul float %124, %126, !dbg !163
+ %128 = fadd float %122, %127, !dbg !164
+ %129 = getelementptr float, float* %78, i64 0, !dbg !165
+ store float %128, float* %129, align 4, !dbg !166
+ %130 = getelementptr float, float* %53, i64 1, !dbg !167
+ %131 = load float, float* %130, align 4, !dbg !168
+ %132 = getelementptr float, float* %78, i64 1, !dbg !169
+ %133 = load float, float* %132, align 4, !dbg !170
+ %134 = fmul float %104, %131, !dbg !171
+ %135 = fadd float %133, %134, !dbg !172
+ %136 = getelementptr float, float* %53, i64 3, !dbg !173
+ %137 = load float, float* %136, align 4, !dbg !174
+ %138 = fmul float %112, %137, !dbg !175
+ %139 = fadd float %135, %138, !dbg !176
+ %140 = getelementptr float, float* %53, i64 5, !dbg !177
+ %141 = load float, float* %140, align 4, !dbg !178
+ %142 = fmul float %118, %141, !dbg !179
+ %143 = fadd float %139, %142, !dbg !180
+ %144 = getelementptr float, float* %53, i64 7, !dbg !181
+ %145 = load float, float* %144, align 4, !dbg !182
+ %146 = fmul float %124, %145, !dbg !183
+ %147 = fadd float %143, %146, !dbg !184
+ %148 = getelementptr float, float* %78, i64 1, !dbg !185
+ store float %147, float* %148, align 4, !dbg !186
+ %149 = getelementptr float, float* %4, i64 4, !dbg !187
+ %150 = load float, float* %149, align 4, !dbg !188
+ %151 = getelementptr float, float* %78, i64 2, !dbg !189
+ %152 = load float, float* %151, align 4, !dbg !190
+ %153 = fmul float %150, %106, !dbg !191
+ %154 = fadd float %152, %153, !dbg !192
+ %155 = getelementptr float, float* %4, i64 5, !dbg !193
+ %156 = load float, float* %155, align 4, !dbg !194
+ %157 = fmul float %156, %114, !dbg !195
+ %158 = fadd float %154, %157, !dbg !196
+ %159 = getelementptr float, float* %4, i64 6, !dbg !197
+ %160 = load float, float* %159, align 4, !dbg !198
+ %161 = fmul float %160, %120, !dbg !199
+ %162 = fadd float %158, %161, !dbg !200
+ %163 = getelementptr float, float* %4, i64 7, !dbg !201
+ %164 = load float, float* %163, align 4, !dbg !202
+ %165 = fmul float %164, %126, !dbg !203
+ %166 = fadd float %162, %165, !dbg !204
+ %167 = getelementptr float, float* %78, i64 2, !dbg !205
+ store float %166, float* %167, align 4, !dbg !206
+ %168 = getelementptr float, float* %78, i64 3, !dbg !207
+ %169 = load float, float* %168, align 4, !dbg !208
+ %170 = fmul float %150, %131, !dbg !209
+ %171 = fadd float %169, %170, !dbg !210
+ %172 = fmul float %156, %137, !dbg !211
+ %173 = fadd float %171, %172, !dbg !212
+ %174 = fmul float %160, %141, !dbg !213
+ %175 = fadd float %173, %174, !dbg !214
+ %176 = fmul float %164, %145, !dbg !215
+ %177 = fadd float %175, %176, !dbg !216
+ %178 = getelementptr float, float* %78, i64 3, !dbg !217
+ store float %177, float* %178, align 4, !dbg !218
+ %179 = getelementptr float, float* %4, i64 8, !dbg !219
+ %180 = load float, float* %179, align 4, !dbg !220
+ %181 = getelementptr float, float* %78, i64 4, !dbg !221
+ %182 = load float, float* %181, align 4, !dbg !222
+ %183 = fmul float %180, %106, !dbg !223
+ %184 = fadd float %182, %183, !dbg !224
+ %185 = getelementptr float, float* %4, i64 9, !dbg !225
+ %186 = load float, float* %185, align 4, !dbg !226
+ %187 = fmul float %186, %114, !dbg !227
+ %188 = fadd float %184, %187, !dbg !228
+ %189 = getelementptr float, float* %4, i64 10, !dbg !229
+ %190 = load float, float* %189, align 4, !dbg !230
+ %191 = fmul float %190, %120, !dbg !231
+ %192 = fadd float %188, %191, !dbg !232
+ %193 = getelementptr float, float* %4, i64 11, !dbg !233
+ %194 = load float, float* %193, align 4, !dbg !234
+ %195 = fmul float %194, %126, !dbg !235
+ %196 = fadd float %192, %195, !dbg !236
+ %197 = getelementptr float, float* %78, i64 4, !dbg !237
+ store float %196, float* %197, align 4, !dbg !238
+ %198 = getelementptr float, float* %78, i64 5, !dbg !239
+ %199 = load float, float* %198, align 4, !dbg !240
+ %200 = fmul float %180, %131, !dbg !241
+ %201 = fadd float %199, %200, !dbg !242
+ %202 = fmul float %186, %137, !dbg !243
+ %203 = fadd float %201, %202, !dbg !244
+ %204 = fmul float %190, %141, !dbg !245
+ %205 = fadd float %203, %204, !dbg !246
+ %206 = fmul float %194, %145, !dbg !247
+ %207 = fadd float %205, %206, !dbg !248
+ %208 = getelementptr float, float* %78, i64 5, !dbg !249
+ store float %207, float* %208, align 4, !dbg !250
+ %209 = getelementptr float, float* %4, i64 12, !dbg !251
+ %210 = load float, float* %209, align 4, !dbg !252
+ %211 = getelementptr float, float* %78, i64 6, !dbg !253
+ %212 = load float, float* %211, align 4, !dbg !254
+ %213 = fmul float %210, %106, !dbg !255
+ %214 = fadd float %212, %213, !dbg !256
+ %215 = getelementptr float, float* %4, i64 13, !dbg !257
+ %216 = load float, float* %215, align 4, !dbg !258
+ %217 = fmul float %216, %114, !dbg !259
+ %218 = fadd float %214, %217, !dbg !260
+ %219 = getelementptr float, float* %4, i64 14, !dbg !261
+ %220 = load float, float* %219, align 4, !dbg !262
+ %221 = fmul float %220, %120, !dbg !263
+ %222 = fadd float %218, %221, !dbg !264
+ %223 = getelementptr float, float* %4, i64 15, !dbg !265
+ %224 = load float, float* %223, align 4, !dbg !266
+ %225 = fmul float %224, %126, !dbg !267
+ %226 = fadd float %222, %225, !dbg !268
+ %227 = getelementptr float, float* %78, i64 6, !dbg !269
+ store float %226, float* %227, align 4, !dbg !270
+ %228 = getelementptr float, float* %78, i64 7, !dbg !271
+ %229 = load float, float* %228, align 4, !dbg !272
+ %230 = fmul float %210, %131, !dbg !273
+ %231 = fadd float %229, %230, !dbg !274
+ %232 = fmul float %216, %137, !dbg !275
+ %233 = fadd float %231, %232, !dbg !276
+ %234 = fmul float %220, %141, !dbg !277
+ %235 = fadd float %233, %234, !dbg !278
+ %236 = fmul float %224, %145, !dbg !279
+ %237 = fadd float %235, %236, !dbg !280
+ %238 = getelementptr float, float* %78, i64 7, !dbg !281
+ store float %237, float* %238, align 4, !dbg !282
+ %239 = getelementptr float, float* %78, i64 0, !dbg !283
+ %240 = load float, float* %239, align 4, !dbg !284
+ %241 = getelementptr float, float* %2, i64 0, !dbg !285
+ store float %240, float* %241, align 4, !dbg !286
+ %242 = getelementptr float, float* %78, i64 1, !dbg !287
+ %243 = load float, float* %242, align 4, !dbg !288
+ %244 = getelementptr float, float* %2, i64 1, !dbg !289
+ store float %243, float* %244, align 4, !dbg !290
+ %245 = getelementptr float, float* %78, i64 2, !dbg !291
+ %246 = load float, float* %245, align 4, !dbg !292
+ %247 = getelementptr float, float* %2, i64 2, !dbg !293
+ store float %246, float* %247, align 4, !dbg !294
+ %248 = getelementptr float, float* %78, i64 3, !dbg !295
+ %249 = load float, float* %248, align 4, !dbg !296
+ %250 = getelementptr float, float* %2, i64 3, !dbg !297
+ store float %249, float* %250, align 4, !dbg !298
+ %251 = getelementptr float, float* %78, i64 4, !dbg !299
+ %252 = load float, float* %251, align 4, !dbg !300
+ %253 = getelementptr float, float* %2, i64 4, !dbg !301
+ store float %252, float* %253, align 4, !dbg !302
+ %254 = getelementptr float, float* %78, i64 5, !dbg !303
+ %255 = load float, float* %254, align 4, !dbg !304
+ %256 = getelementptr float, float* %2, i64 5, !dbg !305
+ store float %255, float* %256, align 4, !dbg !306
+ %257 = getelementptr float, float* %78, i64 6, !dbg !307
+ %258 = load float, float* %257, align 4, !dbg !308
+ %259 = getelementptr float, float* %2, i64 6, !dbg !309
+ store float %258, float* %259, align 4, !dbg !310
+ %260 = getelementptr float, float* %78, i64 7, !dbg !311
+ %261 = load float, float* %260, align 4, !dbg !312
+ %262 = getelementptr float, float* %2, i64 7, !dbg !313
+ store float %261, float* %262, align 4, !dbg !314
+ ret void, !dbg !315
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "mlir", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "LLVMDialectModule", directory: "/")
+!2 = !{i32 2, !"Debug Info Version", i32 3}
+!3 = distinct !DISubprogram(name: "main_kernel", linkageName: "main_kernel", scope: null, file: !4, line: 2, type: !5, scopeLine: 2, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !6)
+!4 = !DIFile(filename: "output/04optimized.mlir", directory: "/files0/extended/bohm747/Development/soda/soda-opt/docs/tutorials/dataflow2022")
+!5 = !DISubroutineType(types: !6)
+!6 = !{}
+!7 = !DILocation(line: 11, column: 10, scope: !8)
+!8 = !DILexicalBlockFile(scope: !3, file: !4, discriminator: 0)
+!9 = !DILocation(line: 18, column: 11, scope: !8)
+!10 = !DILocation(line: 19, column: 11, scope: !8)
+!11 = !DILocation(line: 26, column: 11, scope: !8)
+!12 = !DILocation(line: 27, column: 5, scope: !8)
+!13 = !DILocation(line: 34, column: 11, scope: !8)
+!14 = !DILocation(line: 35, column: 11, scope: !8)
+!15 = !DILocation(line: 42, column: 11, scope: !8)
+!16 = !DILocation(line: 43, column: 5, scope: !8)
+!17 = !DILocation(line: 50, column: 11, scope: !8)
+!18 = !DILocation(line: 51, column: 11, scope: !8)
+!19 = !DILocation(line: 58, column: 11, scope: !8)
+!20 = !DILocation(line: 59, column: 5, scope: !8)
+!21 = !DILocation(line: 66, column: 11, scope: !8)
+!22 = !DILocation(line: 67, column: 11, scope: !8)
+!23 = !DILocation(line: 74, column: 11, scope: !8)
+!24 = !DILocation(line: 75, column: 5, scope: !8)
+!25 = !DILocation(line: 82, column: 11, scope: !8)
+!26 = !DILocation(line: 83, column: 11, scope: !8)
+!27 = !DILocation(line: 90, column: 11, scope: !8)
+!28 = !DILocation(line: 91, column: 5, scope: !8)
+!29 = !DILocation(line: 98, column: 11, scope: !8)
+!30 = !DILocation(line: 99, column: 11, scope: !8)
+!31 = !DILocation(line: 106, column: 11, scope: !8)
+!32 = !DILocation(line: 107, column: 5, scope: !8)
+!33 = !DILocation(line: 114, column: 12, scope: !8)
+!34 = !DILocation(line: 115, column: 12, scope: !8)
+!35 = !DILocation(line: 122, column: 12, scope: !8)
+!36 = !DILocation(line: 123, column: 5, scope: !8)
+!37 = !DILocation(line: 130, column: 12, scope: !8)
+!38 = !DILocation(line: 131, column: 12, scope: !8)
+!39 = !DILocation(line: 138, column: 12, scope: !8)
+!40 = !DILocation(line: 139, column: 5, scope: !8)
+!41 = !DILocation(line: 146, column: 12, scope: !8)
+!42 = !DILocation(line: 147, column: 12, scope: !8)
+!43 = !DILocation(line: 154, column: 12, scope: !8)
+!44 = !DILocation(line: 155, column: 5, scope: !8)
+!45 = !DILocation(line: 162, column: 12, scope: !8)
+!46 = !DILocation(line: 163, column: 12, scope: !8)
+!47 = !DILocation(line: 170, column: 12, scope: !8)
+!48 = !DILocation(line: 171, column: 5, scope: !8)
+!49 = !DILocation(line: 178, column: 12, scope: !8)
+!50 = !DILocation(line: 179, column: 12, scope: !8)
+!51 = !DILocation(line: 186, column: 12, scope: !8)
+!52 = !DILocation(line: 187, column: 5, scope: !8)
+!53 = !DILocation(line: 194, column: 12, scope: !8)
+!54 = !DILocation(line: 195, column: 12, scope: !8)
+!55 = !DILocation(line: 202, column: 12, scope: !8)
+!56 = !DILocation(line: 203, column: 5, scope: !8)
+!57 = !DILocation(line: 210, column: 12, scope: !8)
+!58 = !DILocation(line: 211, column: 12, scope: !8)
+!59 = !DILocation(line: 218, column: 12, scope: !8)
+!60 = !DILocation(line: 219, column: 5, scope: !8)
+!61 = !DILocation(line: 226, column: 12, scope: !8)
+!62 = !DILocation(line: 227, column: 12, scope: !8)
+!63 = !DILocation(line: 234, column: 12, scope: !8)
+!64 = !DILocation(line: 235, column: 5, scope: !8)
+!65 = !DILocation(line: 242, column: 12, scope: !8)
+!66 = !DILocation(line: 243, column: 12, scope: !8)
+!67 = !DILocation(line: 250, column: 12, scope: !8)
+!68 = !DILocation(line: 251, column: 5, scope: !8)
+!69 = !DILocation(line: 258, column: 12, scope: !8)
+!70 = !DILocation(line: 259, column: 12, scope: !8)
+!71 = !DILocation(line: 266, column: 12, scope: !8)
+!72 = !DILocation(line: 267, column: 5, scope: !8)
+!73 = !DILocation(line: 272, column: 12, scope: !8)
+!74 = !DILocation(line: 279, column: 12, scope: !8)
+!75 = !DILocation(line: 280, column: 12, scope: !8)
+!76 = !DILocation(line: 287, column: 12, scope: !8)
+!77 = !DILocation(line: 288, column: 5, scope: !8)
+!78 = !DILocation(line: 295, column: 12, scope: !8)
+!79 = !DILocation(line: 296, column: 12, scope: !8)
+!80 = !DILocation(line: 303, column: 12, scope: !8)
+!81 = !DILocation(line: 304, column: 5, scope: !8)
+!82 = !DILocation(line: 311, column: 12, scope: !8)
+!83 = !DILocation(line: 312, column: 12, scope: !8)
+!84 = !DILocation(line: 319, column: 12, scope: !8)
+!85 = !DILocation(line: 320, column: 5, scope: !8)
+!86 = !DILocation(line: 327, column: 12, scope: !8)
+!87 = !DILocation(line: 328, column: 12, scope: !8)
+!88 = !DILocation(line: 335, column: 12, scope: !8)
+!89 = !DILocation(line: 336, column: 5, scope: !8)
+!90 = !DILocation(line: 343, column: 12, scope: !8)
+!91 = !DILocation(line: 344, column: 12, scope: !8)
+!92 = !DILocation(line: 351, column: 12, scope: !8)
+!93 = !DILocation(line: 352, column: 5, scope: !8)
+!94 = !DILocation(line: 359, column: 12, scope: !8)
+!95 = !DILocation(line: 360, column: 12, scope: !8)
+!96 = !DILocation(line: 367, column: 12, scope: !8)
+!97 = !DILocation(line: 368, column: 5, scope: !8)
+!98 = !DILocation(line: 375, column: 12, scope: !8)
+!99 = !DILocation(line: 376, column: 12, scope: !8)
+!100 = !DILocation(line: 383, column: 12, scope: !8)
+!101 = !DILocation(line: 384, column: 5, scope: !8)
+!102 = !DILocation(line: 391, column: 12, scope: !8)
+!103 = !DILocation(line: 392, column: 12, scope: !8)
+!104 = !DILocation(line: 399, column: 12, scope: !8)
+!105 = !DILocation(line: 400, column: 5, scope: !8)
+!106 = !DILocation(line: 405, column: 12, scope: !8)
+!107 = !DILocation(line: 412, column: 12, scope: !8)
+!108 = !DILocation(line: 413, column: 12, scope: !8)
+!109 = !DILocation(line: 420, column: 12, scope: !8)
+!110 = !DILocation(line: 421, column: 5, scope: !8)
+!111 = !DILocation(line: 428, column: 12, scope: !8)
+!112 = !DILocation(line: 429, column: 12, scope: !8)
+!113 = !DILocation(line: 436, column: 12, scope: !8)
+!114 = !DILocation(line: 437, column: 5, scope: !8)
+!115 = !DILocation(line: 444, column: 12, scope: !8)
+!116 = !DILocation(line: 445, column: 12, scope: !8)
+!117 = !DILocation(line: 452, column: 12, scope: !8)
+!118 = !DILocation(line: 453, column: 5, scope: !8)
+!119 = !DILocation(line: 460, column: 12, scope: !8)
+!120 = !DILocation(line: 461, column: 12, scope: !8)
+!121 = !DILocation(line: 468, column: 12, scope: !8)
+!122 = !DILocation(line: 469, column: 5, scope: !8)
+!123 = !DILocation(line: 476, column: 12, scope: !8)
+!124 = !DILocation(line: 477, column: 12, scope: !8)
+!125 = !DILocation(line: 484, column: 12, scope: !8)
+!126 = !DILocation(line: 485, column: 5, scope: !8)
+!127 = !DILocation(line: 492, column: 12, scope: !8)
+!128 = !DILocation(line: 493, column: 12, scope: !8)
+!129 = !DILocation(line: 500, column: 12, scope: !8)
+!130 = !DILocation(line: 501, column: 5, scope: !8)
+!131 = !DILocation(line: 508, column: 12, scope: !8)
+!132 = !DILocation(line: 509, column: 12, scope: !8)
+!133 = !DILocation(line: 516, column: 12, scope: !8)
+!134 = !DILocation(line: 517, column: 5, scope: !8)
+!135 = !DILocation(line: 524, column: 12, scope: !8)
+!136 = !DILocation(line: 525, column: 12, scope: !8)
+!137 = !DILocation(line: 532, column: 12, scope: !8)
+!138 = !DILocation(line: 533, column: 5, scope: !8)
+!139 = !DILocation(line: 540, column: 12, scope: !8)
+!140 = !DILocation(line: 541, column: 12, scope: !8)
+!141 = !DILocation(line: 548, column: 12, scope: !8)
+!142 = !DILocation(line: 549, column: 12, scope: !8)
+!143 = !DILocation(line: 556, column: 12, scope: !8)
+!144 = !DILocation(line: 557, column: 12, scope: !8)
+!145 = !DILocation(line: 558, column: 12, scope: !8)
+!146 = !DILocation(line: 559, column: 12, scope: !8)
+!147 = !DILocation(line: 566, column: 12, scope: !8)
+!148 = !DILocation(line: 567, column: 12, scope: !8)
+!149 = !DILocation(line: 574, column: 12, scope: !8)
+!150 = !DILocation(line: 575, column: 12, scope: !8)
+!151 = !DILocation(line: 576, column: 12, scope: !8)
+!152 = !DILocation(line: 577, column: 12, scope: !8)
+!153 = !DILocation(line: 584, column: 12, scope: !8)
+!154 = !DILocation(line: 585, column: 12, scope: !8)
+!155 = !DILocation(line: 592, column: 12, scope: !8)
+!156 = !DILocation(line: 593, column: 12, scope: !8)
+!157 = !DILocation(line: 594, column: 12, scope: !8)
+!158 = !DILocation(line: 595, column: 12, scope: !8)
+!159 = !DILocation(line: 602, column: 12, scope: !8)
+!160 = !DILocation(line: 603, column: 12, scope: !8)
+!161 = !DILocation(line: 610, column: 12, scope: !8)
+!162 = !DILocation(line: 611, column: 12, scope: !8)
+!163 = !DILocation(line: 612, column: 12, scope: !8)
+!164 = !DILocation(line: 613, column: 12, scope: !8)
+!165 = !DILocation(line: 620, column: 12, scope: !8)
+!166 = !DILocation(line: 621, column: 5, scope: !8)
+!167 = !DILocation(line: 628, column: 12, scope: !8)
+!168 = !DILocation(line: 629, column: 12, scope: !8)
+!169 = !DILocation(line: 636, column: 12, scope: !8)
+!170 = !DILocation(line: 637, column: 12, scope: !8)
+!171 = !DILocation(line: 638, column: 12, scope: !8)
+!172 = !DILocation(line: 639, column: 12, scope: !8)
+!173 = !DILocation(line: 646, column: 12, scope: !8)
+!174 = !DILocation(line: 647, column: 12, scope: !8)
+!175 = !DILocation(line: 648, column: 12, scope: !8)
+!176 = !DILocation(line: 649, column: 12, scope: !8)
+!177 = !DILocation(line: 656, column: 12, scope: !8)
+!178 = !DILocation(line: 657, column: 12, scope: !8)
+!179 = !DILocation(line: 658, column: 12, scope: !8)
+!180 = !DILocation(line: 659, column: 12, scope: !8)
+!181 = !DILocation(line: 666, column: 12, scope: !8)
+!182 = !DILocation(line: 667, column: 12, scope: !8)
+!183 = !DILocation(line: 668, column: 12, scope: !8)
+!184 = !DILocation(line: 669, column: 12, scope: !8)
+!185 = !DILocation(line: 676, column: 12, scope: !8)
+!186 = !DILocation(line: 677, column: 5, scope: !8)
+!187 = !DILocation(line: 684, column: 12, scope: !8)
+!188 = !DILocation(line: 685, column: 12, scope: !8)
+!189 = !DILocation(line: 692, column: 12, scope: !8)
+!190 = !DILocation(line: 693, column: 12, scope: !8)
+!191 = !DILocation(line: 694, column: 12, scope: !8)
+!192 = !DILocation(line: 695, column: 12, scope: !8)
+!193 = !DILocation(line: 702, column: 12, scope: !8)
+!194 = !DILocation(line: 703, column: 12, scope: !8)
+!195 = !DILocation(line: 704, column: 12, scope: !8)
+!196 = !DILocation(line: 705, column: 12, scope: !8)
+!197 = !DILocation(line: 712, column: 12, scope: !8)
+!198 = !DILocation(line: 713, column: 12, scope: !8)
+!199 = !DILocation(line: 714, column: 12, scope: !8)
+!200 = !DILocation(line: 715, column: 12, scope: !8)
+!201 = !DILocation(line: 722, column: 12, scope: !8)
+!202 = !DILocation(line: 723, column: 12, scope: !8)
+!203 = !DILocation(line: 724, column: 12, scope: !8)
+!204 = !DILocation(line: 725, column: 12, scope: !8)
+!205 = !DILocation(line: 732, column: 12, scope: !8)
+!206 = !DILocation(line: 733, column: 5, scope: !8)
+!207 = !DILocation(line: 740, column: 12, scope: !8)
+!208 = !DILocation(line: 741, column: 12, scope: !8)
+!209 = !DILocation(line: 742, column: 12, scope: !8)
+!210 = !DILocation(line: 743, column: 12, scope: !8)
+!211 = !DILocation(line: 744, column: 12, scope: !8)
+!212 = !DILocation(line: 745, column: 12, scope: !8)
+!213 = !DILocation(line: 746, column: 12, scope: !8)
+!214 = !DILocation(line: 747, column: 12, scope: !8)
+!215 = !DILocation(line: 748, column: 12, scope: !8)
+!216 = !DILocation(line: 749, column: 12, scope: !8)
+!217 = !DILocation(line: 756, column: 12, scope: !8)
+!218 = !DILocation(line: 757, column: 5, scope: !8)
+!219 = !DILocation(line: 764, column: 12, scope: !8)
+!220 = !DILocation(line: 765, column: 12, scope: !8)
+!221 = !DILocation(line: 772, column: 12, scope: !8)
+!222 = !DILocation(line: 773, column: 12, scope: !8)
+!223 = !DILocation(line: 774, column: 12, scope: !8)
+!224 = !DILocation(line: 775, column: 12, scope: !8)
+!225 = !DILocation(line: 782, column: 12, scope: !8)
+!226 = !DILocation(line: 783, column: 12, scope: !8)
+!227 = !DILocation(line: 784, column: 12, scope: !8)
+!228 = !DILocation(line: 785, column: 12, scope: !8)
+!229 = !DILocation(line: 792, column: 12, scope: !8)
+!230 = !DILocation(line: 793, column: 12, scope: !8)
+!231 = !DILocation(line: 794, column: 12, scope: !8)
+!232 = !DILocation(line: 795, column: 12, scope: !8)
+!233 = !DILocation(line: 802, column: 12, scope: !8)
+!234 = !DILocation(line: 803, column: 12, scope: !8)
+!235 = !DILocation(line: 804, column: 12, scope: !8)
+!236 = !DILocation(line: 805, column: 12, scope: !8)
+!237 = !DILocation(line: 812, column: 12, scope: !8)
+!238 = !DILocation(line: 813, column: 5, scope: !8)
+!239 = !DILocation(line: 820, column: 12, scope: !8)
+!240 = !DILocation(line: 821, column: 12, scope: !8)
+!241 = !DILocation(line: 822, column: 12, scope: !8)
+!242 = !DILocation(line: 823, column: 12, scope: !8)
+!243 = !DILocation(line: 824, column: 12, scope: !8)
+!244 = !DILocation(line: 825, column: 12, scope: !8)
+!245 = !DILocation(line: 826, column: 12, scope: !8)
+!246 = !DILocation(line: 827, column: 12, scope: !8)
+!247 = !DILocation(line: 828, column: 12, scope: !8)
+!248 = !DILocation(line: 829, column: 12, scope: !8)
+!249 = !DILocation(line: 836, column: 12, scope: !8)
+!250 = !DILocation(line: 837, column: 5, scope: !8)
+!251 = !DILocation(line: 844, column: 12, scope: !8)
+!252 = !DILocation(line: 845, column: 12, scope: !8)
+!253 = !DILocation(line: 852, column: 12, scope: !8)
+!254 = !DILocation(line: 853, column: 12, scope: !8)
+!255 = !DILocation(line: 854, column: 12, scope: !8)
+!256 = !DILocation(line: 855, column: 12, scope: !8)
+!257 = !DILocation(line: 862, column: 12, scope: !8)
+!258 = !DILocation(line: 863, column: 12, scope: !8)
+!259 = !DILocation(line: 864, column: 12, scope: !8)
+!260 = !DILocation(line: 865, column: 12, scope: !8)
+!261 = !DILocation(line: 872, column: 12, scope: !8)
+!262 = !DILocation(line: 873, column: 12, scope: !8)
+!263 = !DILocation(line: 874, column: 12, scope: !8)
+!264 = !DILocation(line: 875, column: 12, scope: !8)
+!265 = !DILocation(line: 882, column: 12, scope: !8)
+!266 = !DILocation(line: 883, column: 12, scope: !8)
+!267 = !DILocation(line: 884, column: 12, scope: !8)
+!268 = !DILocation(line: 885, column: 12, scope: !8)
+!269 = !DILocation(line: 892, column: 12, scope: !8)
+!270 = !DILocation(line: 893, column: 5, scope: !8)
+!271 = !DILocation(line: 900, column: 12, scope: !8)
+!272 = !DILocation(line: 901, column: 12, scope: !8)
+!273 = !DILocation(line: 902, column: 12, scope: !8)
+!274 = !DILocation(line: 903, column: 12, scope: !8)
+!275 = !DILocation(line: 904, column: 12, scope: !8)
+!276 = !DILocation(line: 905, column: 12, scope: !8)
+!277 = !DILocation(line: 906, column: 12, scope: !8)
+!278 = !DILocation(line: 907, column: 12, scope: !8)
+!279 = !DILocation(line: 908, column: 12, scope: !8)
+!280 = !DILocation(line: 909, column: 12, scope: !8)
+!281 = !DILocation(line: 916, column: 12, scope: !8)
+!282 = !DILocation(line: 917, column: 5, scope: !8)
+!283 = !DILocation(line: 924, column: 12, scope: !8)
+!284 = !DILocation(line: 925, column: 12, scope: !8)
+!285 = !DILocation(line: 932, column: 12, scope: !8)
+!286 = !DILocation(line: 933, column: 5, scope: !8)
+!287 = !DILocation(line: 940, column: 12, scope: !8)
+!288 = !DILocation(line: 941, column: 12, scope: !8)
+!289 = !DILocation(line: 948, column: 12, scope: !8)
+!290 = !DILocation(line: 949, column: 5, scope: !8)
+!291 = !DILocation(line: 956, column: 12, scope: !8)
+!292 = !DILocation(line: 957, column: 12, scope: !8)
+!293 = !DILocation(line: 964, column: 12, scope: !8)
+!294 = !DILocation(line: 965, column: 5, scope: !8)
+!295 = !DILocation(line: 972, column: 12, scope: !8)
+!296 = !DILocation(line: 973, column: 12, scope: !8)
+!297 = !DILocation(line: 980, column: 12, scope: !8)
+!298 = !DILocation(line: 981, column: 5, scope: !8)
+!299 = !DILocation(line: 988, column: 12, scope: !8)
+!300 = !DILocation(line: 989, column: 12, scope: !8)
+!301 = !DILocation(line: 996, column: 12, scope: !8)
+!302 = !DILocation(line: 997, column: 5, scope: !8)
+!303 = !DILocation(line: 1004, column: 12, scope: !8)
+!304 = !DILocation(line: 1005, column: 12, scope: !8)
+!305 = !DILocation(line: 1012, column: 12, scope: !8)
+!306 = !DILocation(line: 1013, column: 5, scope: !8)
+!307 = !DILocation(line: 1020, column: 12, scope: !8)
+!308 = !DILocation(line: 1021, column: 12, scope: !8)
+!309 = !DILocation(line: 1028, column: 12, scope: !8)
+!310 = !DILocation(line: 1029, column: 5, scope: !8)
+!311 = !DILocation(line: 1036, column: 12, scope: !8)
+!312 = !DILocation(line: 1037, column: 12, scope: !8)
+!313 = !DILocation(line: 1044, column: 12, scope: !8)
+!314 = !DILocation(line: 1045, column: 5, scope: !8)
+!315 = !DILocation(line: 1046, column: 5, scope: !8)
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise3/test.xml b/documentation/tutorial_pact_2022/01-introduction/Exercise3/test.xml
new file mode 100644
index 000000000..56aea2e94
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise3/test.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise4/bambu.sh b/documentation/tutorial_pact_2022/01-introduction/Exercise4/bambu.sh
new file mode 100644
index 000000000..a9c45b8a0
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise4/bambu.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+bambu proxies.c --top-fname=funcA "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise4/proxies.c b/documentation/tutorial_pact_2022/01-introduction/Exercise4/proxies.c
new file mode 100644
index 000000000..cc89ba13e
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise4/proxies.c
@@ -0,0 +1,18 @@
+int __attribute__ ((noinline)) funcC(int a[2]){
+ return a[0] * a[0] + a[1] * a[1];
+}
+
+int __attribute__ ((noinline)) funcB(int a[2]){
+ int i;
+ for(i=0; i<2; i++)
+ a[i] = a[i] + 1;
+ return funcC(a);
+}
+
+int funcA(){
+ int temp1, temp2;
+ int a[2] = {0,1};
+ temp1 = funcC(a);
+ temp2 = funcB(a);
+ return temp1 + temp2;
+}
\ No newline at end of file
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise5/LUdecomposition.c b/documentation/tutorial_pact_2022/01-introduction/Exercise5/LUdecomposition.c
new file mode 100644
index 000000000..a20e6b9f7
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise5/LUdecomposition.c
@@ -0,0 +1,270 @@
+////////////////////////////////////////////////////////////////////////////////
+// int Upper_Triangular_Solve(float *U, float *B, float x[], int n) //
+// //
+// Description: //
+// This routine solves the linear equation Ux = B, where U is an n x n //
+// upper triangular matrix. (The subdiagonal part of the matrix is //
+// not addressed.) //
+// The algorithm follows: //
+// x[n-1] = B[n-1]/U[n-1][n-1], and //
+// x[i] = [B[i] - (U[i][i+1] * x[i+1] + ... + U[i][n-1] * x[n-1])] //
+// / U[i][i], //
+// for i = n-2, ..., 0. //
+// //
+// Arguments: //
+// float *U Pointer to the first element of the upper triangular //
+// matrix. //
+// float *B Pointer to the column vector, (n x 1) matrix, B. //
+// float *x Pointer to the column vector, (n x 1) matrix, x. //
+// int n The number of rows or columns of the matrix U. //
+// //
+// Return Values: //
+// 0 Success //
+// -1 Failure - The matrix U is singular. //
+// //
+// Example: //
+// #define N //
+// float A[N][N], B[N], x[N]; //
+// //
+// (your code to create matrix A and column vector B) //
+// err = Upper_Triangular_Solve(&A[0][0], B, x, n); //
+// if (err < 0) printf(" Matrix A is singular\n"); //
+// else printf(" The solution is \n"); //
+// ... //
+////////////////////////////////////////////////////////////////////////////////
+// //
+int Upper_Triangular_Solve(float *U, float B[], float x[], int n)
+{
+ int i, k;
+
+// Solve the linear equation Ux = B for x, where U is an upper
+// triangular matrix.
+
+ for (k = n-1, U += n * (n - 1); k >= 0; U -= n, k--) {
+ if (*(U + k) == 0.0) return -1; // The matrix U is singular
+ x[k] = B[k];
+ for (i = k + 1; i < n; i++) x[k] -= x[i] * *(U + i);
+ x[k] /= *(U + k);
+ }
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// void Unit_Lower_Triangular_Solve(float *L, float *B, float x[], int n) //
+// //
+// Description: //
+// This routine solves the linear equation Lx = B, where L is an n x n //
+// unit lower triangular matrix. (Only the subdiagonal part of the matrix//
+// is addressed.) The diagonal is assumed to consist of 1's and is not //
+// addressed. //
+// The algorithm follows: //
+// x[0] = B[0], and //
+// x[i] = B[i] - (L[i][0] * x[0] + ... + L[i][i-1] * x[i-1]), //
+// for i = 1, ..., n-1. //
+// //
+// Arguments: //
+// float *L Pointer to the first element of the unit lower triangular //
+// matrix. //
+// float *B Pointer to the column vector, (n x 1) matrix, B. //
+// float *x Pointer to the column vector, (n x 1) matrix, x. //
+// int n The number of rows or columns of the matrix L. //
+// //
+// Return Values: //
+// void //
+// //
+// Example: //
+// #define N //
+// float A[N][N], B[N], x[N]; //
+// //
+// (your code to create matrix A and column vector B) //
+// Unit_Lower_Triangular_Solve(&A[0][0], B, x, n); //
+// printf(" The solution is \n"); //
+// ... //
+////////////////////////////////////////////////////////////////////////////////
+// //
+void Unit_Lower_Triangular_Solve(float *L, float B[], float x[], int n)
+{
+ int i, k;
+
+// Solve the linear equation Lx = B for x, where L is a unit lower
+// triangular matrix.
+
+ x[0] = B[0];
+ for (k = 1, L += n; k < n; L += n, k++)
+ for (i = 0, x[k] = B[k]; i < k; i++) x[k] -= x[i] * *(L + i);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// int Doolittle_LU_Decomposition(float *A, int n) //
+// //
+// Description: //
+// This routine uses Doolittle's method to decompose the n x n matrix A //
+// into a unit lower triangular matrix L and an upper triangular matrix U //
+// such that A = LU. //
+// The matrices L and U replace the matrix A so that the original matrix //
+// A is destroyed. //
+// Note! In Doolittle's method the diagonal elements of L are 1 and are //
+// not stored. //
+// Note! The determinant of A is the product of the diagonal elements //
+// of U. (det A = det L * det U = det U). //
+// This routine is suitable for those classes of matrices which when //
+// performing Gaussian elimination do not need to undergo partial //
+// pivoting, e.g. positive definite symmetric matrices, diagonally //
+// dominant band matrices, etc. //
+// For the more general case in which partial pivoting is needed use //
+// Doolittle_LU_Decomposition_with_Pivoting. //
+// The LU decomposition is convenient when one needs to solve the linear //
+// equation Ax = B for the vector x while the matrix A is fixed and the //
+// vector B is varied. The routine for solving the linear system Ax = B //
+// after performing the LU decomposition for A is Doolittle_LU_Solve //
+// (see below). //
+// //
+// The Doolittle method is given by evaluating, in order, the following //
+// pair of expressions for k = 0, ... , n-1: //
+// U[k][j] = A[k][j] - (L[k][0]*U[0][j] + ... + L[k][k-1]*U[k-1][j]) //
+// for j = k, k+1, ... , n-1 //
+// L[i][k] = (A[i][k] - (L[i][0]*U[0][k] + . + L[i][k-1]*U[k-1][k])) //
+// / U[k][k] //
+// for i = k+1, ... , n-1. //
+// The matrix U forms the upper triangular matrix, and the matrix L //
+// forms the lower triangular matrix. //
+// //
+// Arguments: //
+// float *A Pointer to the first element of the matrix A[n][n]. //
+// int n The number of rows or columns of the matrix A. //
+// //
+// Return Values: //
+// 0 Success //
+// -1 Failure - The matrix A is singular. //
+// //
+// Example: //
+// #define N //
+// float A[N][N]; //
+// //
+// (your code to intialize the matrix A) //
+// //
+// err = Doolittle_LU_Decomposition(&A[0][0], N); //
+// if (err < 0) printf(" Matrix A is singular\n"); //
+// else { printf(" The LU decomposition of A is \n"); //
+// ... //
+////////////////////////////////////////////////////////////////////////////////
+// //
+int Doolittle_LU_Decomposition(float *A, int n)
+{
+ int i, j, k, p;
+ float *p_k, *p_row, *p_col;
+
+// For each row and column, k = 0, ..., n-1,
+// find the upper triangular matrix elements for row k
+// and if the matrix is non-singular (nonzero diagonal element).
+// find the lower triangular matrix elements for column k.
+
+ for (k = 0, p_k = A; k < n; p_k += n, k++) {
+ for (j = k; j < n; j++) {
+ for (p = 0, p_col = A; p < k; p_col += n, p++)
+ *(p_k + j) -= *(p_k + p) * *(p_col + j);
+ }
+ if ( *(p_k + k) == 0.0 ) return -1;
+ for (i = k+1, p_row = p_k + n; i < n; p_row += n, i++) {
+ for (p = 0, p_col = A; p < k; p_col += n, p++)
+ *(p_row + k) -= *(p_row + p) * *(p_col + k);
+ *(p_row + k) /= *(p_k + k);
+ }
+ }
+ return 0;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// int Doolittle_LU_Solve(float *LU, float *B, float *x, int n) //
+// //
+// Description: //
+// This routine uses Doolittle's method to solve the linear equation //
+// Ax = B. This routine is called after the matrix A has been decomposed //
+// into a product of a unit lower triangular matrix L and an upper //
+// triangular matrix U without pivoting. The argument LU is a pointer to //
+// the matrix the subdiagonal part of which is L and the superdiagonal //
+// together with the diagonal part is U. (The diagonal part of L is 1 and //
+// is not stored.) The matrix A = LU. //
+// The solution proceeds by solving the linear equation Ly = B for y and //
+// subsequently solving the linear equation Ux = y for x. //
+// //
+// Arguments: //
+// float *LU Pointer to the first element of the matrix whose elements //
+// form the lower and upper triangular matrix factors of A. //
+// float *B Pointer to the column vector, (n x 1) matrix, B //
+// float *x Solution to the equation Ax = B. //
+// int n The number of rows or columns of the matrix LU. //
+// //
+// Return Values: //
+// 0 Success //
+// -1 Failure - The matrix A is singular. //
+// //
+// Example: //
+// #define N //
+// float A[N][N], B[N], x[N]; //
+// //
+// (your code to create matrix A and column vector B) //
+// err = Doolittle_LU_Decomposition(&A[0][0], N); //
+// if (err < 0) printf(" Matrix A is singular\n"); //
+// else { //
+// err = Doolittle_LU_Solve(&A[0][0], B, x, n); //
+// if (err < 0) printf(" Matrix A is singular\n"); //
+// else printf(" The solution is \n"); //
+// ... //
+// } //
+////////////////////////////////////////////////////////////////////////////////
+// //
+int Doolittle_LU_Solve(float *LU, float B[], float x[], int n)
+{
+
+// Solve the linear equation Lx = B for x, where L is a lower
+// triangular matrix with an implied 1 along the diagonal.
+
+ Unit_Lower_Triangular_Solve(LU, B, x, n);
+
+// Solve the linear equation Ux = y, where y is the solution
+// obtained above of Lx = B and U is an upper triangular matrix.
+
+ return Upper_Triangular_Solve(LU, x, x, n);
+}
+
+int invertMatrix(float *LU, float *invA, float *I)
+{
+ int i, j;
+ // float I[4][4] = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}};
+ float resultColumn[4];
+
+ for (i = 0; i < 4; ++i)
+ {
+ int res = Doolittle_LU_Solve(LU, I + i*4, resultColumn, 4);
+
+ if (res != 0) return res;
+ for (j = 0; j < 4; ++j)
+ *(invA + i + j * 4) = resultColumn[j];
+ }
+
+ return 0;
+}
+
+//float A[4][4] = {{1, 1, 1, 1}, {1, 4, 2, 3}, {1, 2, 1, 2}, {1, 1, 1, 0}};
+//float invA[4][4]= {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+
+int fun(float *A, float *invA, float *b, float *x, float *I)
+{
+ int res = Doolittle_LU_Decomposition((float *)A, 4);
+
+ if (res != 0) return res;
+
+ // float b[4] = {63, 105, 48, 186};
+ // float x[4];
+
+ res = Doolittle_LU_Solve((float *)A, b, x, 4);
+
+ if (res != 0) return res;
+
+ res = invertMatrix((float *)A, (float *)invA, I);
+
+ return res;
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise5/bambu.sh b/documentation/tutorial_pact_2022/01-introduction/Exercise5/bambu.sh
new file mode 100755
index 000000000..f37d97ff8
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise5/bambu.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)
+
+rm -rf ludecomp
+mkdir -p ludecomp
+cd ludecomp
+echo "#synthesis of fun"
+bambu $root_dir/LUdecomposition.c --top-fname=fun \
+ -O1 \
+ --generate-tb=$root_dir/test.xml --simulate --simulator=VERILATOR \
+ -v2 --print-dot "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise5/test.xml b/documentation/tutorial_pact_2022/01-introduction/Exercise5/test.xml
new file mode 100644
index 000000000..500454cc7
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise5/test.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise5a/bambu.sh b/documentation/tutorial_pact_2022/01-introduction/Exercise5a/bambu.sh
new file mode 100644
index 000000000..11ecb2ac9
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise5a/bambu.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+!bambu helm.c --top-fname=helm_naive -Icommon.h --simulate --simulator=VERILATOR --generate-tb=test.xml --compiler=I386_CLANG6
\ No newline at end of file
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise5a/common.h b/documentation/tutorial_pact_2022/01-introduction/Exercise5a/common.h
new file mode 100644
index 000000000..1381fda68
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise5a/common.h
@@ -0,0 +1,46 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+
+typedef float real_t;
+
+real_t* make_empty(size_t size)
+{
+ return (real_t*)calloc(size, sizeof(real_t));
+}
+
+real_t* make_random(size_t size)
+{
+ real_t* result = make_empty(size);
+ if (!result) return NULL;
+
+ real_t* end = result + size;
+ for (real_t* ptr = result; ptr != end; ++ptr) {
+ *ptr = ((real_t)random() / RAND_MAX) * (real_t)(2) - (real_t)(1);
+ }
+
+ return result;
+}
+
+real_t* make_copy(const real_t* data, size_t size)
+{
+ real_t* result = make_empty(size);
+ if (!result) return NULL;
+
+ memcpy(result, data, size*sizeof(real_t));
+ return result;
+}
+
+real_t mse(const real_t* a, const real_t* b, size_t size)
+{
+ real_t accu = 0;
+ const real_t* a_end = a + size;
+ for (; a != a_end; ++a,++b) {
+ real_t err = (*a - *b);
+ accu += err * err;
+ }
+ return accu / (real_t)(size);
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise5a/helm.c b/documentation/tutorial_pact_2022/01-introduction/Exercise5a/helm.c
new file mode 100644
index 000000000..4eb45d408
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise5a/helm.c
@@ -0,0 +1,146 @@
+#include "common.h"
+
+#pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
+
+const size_t P = 11;
+
+void helm_naive(
+ real_t w[P],
+ real_t L[P][P],
+ real_t d[4],
+ real_t u[P][P][P],
+ real_t r[P][P][P]
+)
+{
+ for (size_t x = 0; x < P; ++x)
+ for (size_t y = 0; y < P; ++y)
+ for (size_t z = 0; z < P; ++z) {
+ r[x][y][z] = d[0] * w[x] * w[y] * w[z] * u[x][y][z];
+ }
+
+ for (size_t x = 0; x < P; ++x)
+ for (size_t y = 0; y < P; ++y)
+ for (size_t z = 0; z < P; ++z) {
+ real_t accu = 0;
+ for (size_t k = 0; k < P; ++k) {
+ accu += L[x][k] * w[y] * w[z] * u[k][y][z];
+ }
+ r[x][y][z] += d[1] * accu;
+ }
+
+ for (size_t x = 0; x < P; ++x)
+ for (size_t y = 0; y < P; ++y)
+ for (size_t z = 0; z < P; ++z) {
+ real_t accu = 0;
+ for (size_t k = 0; k < P; ++k) {
+ accu += w[x] * L[y][k] * w[z] * u[x][k][z];
+ }
+ r[x][y][z] += d[2] * accu;
+ }
+
+ for (size_t x = 0; x < P; ++x)
+ for (size_t y = 0; y < P; ++y)
+ for (size_t z = 0; z < P; ++z) {
+ real_t accu = 0;
+ for (size_t k = 0; k < P; ++k) {
+ accu += w[x] * w[y] * L[z][k] * u[x][y][k];
+ }
+ r[x][y][z] += d[3] * accu;
+ }
+}
+
+void helm_factor_impl(
+ real_t w[P],
+ real_t L[P][P],
+ real_t d[4],
+ real_t u[P][P][P],
+ real_t L_hat[P][P],
+ real_t M_u[P][P][P],
+ real_t r[P][P][P]
+)
+{
+ for (size_t x = 0; x < P; ++x)
+ for (size_t y = 0; y < P; ++y)
+ for (size_t z = 0; z < P; ++z) {
+ real_t M_u_xyz = w[x] * w[y] * w[z] * u[x][y][z];
+ M_u[x][y][z] = M_u_xyz;
+ r[x][y][z] = M_u_xyz * d[0];
+ }
+
+ for (size_t i = 0; i < P; ++i)
+ for (size_t j = 0; j < P; ++j) {
+ L_hat[i][j] = L[i][j] / w[j];
+ }
+
+ for (size_t x = 0; x < P; ++x)
+ for (size_t y = 0; y < P; ++y)
+ for (size_t z = 0; z < P; ++z) {
+ real_t accu = 0;
+ for (size_t k = 0; k < P; ++k) {
+ accu += L_hat[x][k] * M_u[k][y][z];
+ }
+ r[x][y][z] += d[1] * accu;
+ }
+
+ for (size_t x = 0; x < P; ++x)
+ for (size_t y = 0; y < P; ++y)
+ for (size_t z = 0; z < P; ++z) {
+ real_t accu = 0;
+ for (size_t k = 0; k < P; ++k) {
+ accu += L_hat[y][k] * M_u[x][k][z];
+ }
+ r[x][y][z] += d[2] * accu;
+ }
+
+ for (size_t x = 0; x < P; ++x)
+ for (size_t y = 0; y < P; ++y)
+ for (size_t z = 0; z < P; ++z) {
+ real_t accu = 0;
+ for (size_t k = 0; k < P; ++k) {
+ accu += L_hat[z][k] * M_u[x][y][k];
+ }
+ r[x][y][z] += d[3] * accu;
+ }
+}
+
+void helm_factor(
+ real_t w[P],
+ real_t L[P][P],
+ real_t d[4],
+ real_t u[P][P][P],
+ real_t r[P][P][P]
+)
+{
+ real_t* L_hat = make_empty(P*P);
+ real_t* M_u = make_empty(P*P*P);
+
+ helm_factor_impl(
+ w,
+ L,
+ d,
+ u,
+ L_hat,
+ M_u,
+ r
+ );
+}
+
+int main(int argc, const char* argv[])
+{
+ srandom(0xDEADBEEF);
+
+ real_t* w = make_random(P);
+ real_t* L = make_random(P*P);
+ real_t* d = make_random(4);
+ real_t* u = make_random(P*P*P);
+
+ real_t* r1 = make_empty(P*P*P);
+ helm_naive(w, L, d, u, r1);
+
+ real_t* r2 = make_empty(P*P*P);
+ helm_factor(w, L, d, u, r2);
+ real_t mse2 = mse(r1, r2, P*P*P);
+ printf("mse2 = %G\n", mse2);
+
+ return EXIT_SUCCESS;
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise5a/test.xml b/documentation/tutorial_pact_2022/01-introduction/Exercise5a/test.xml
new file mode 100644
index 000000000..88c970fa1
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise5a/test.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/README.txt b/documentation/tutorial_pact_2022/01-introduction/Exercise6/README.txt
new file mode 100644
index 000000000..bdaccd406
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/README.txt
@@ -0,0 +1,24 @@
+Simple example describing how to integrate and verify existing IP with functions written in C that receives structs passed by pointers.
+
+Hereafter a small description of files
+--------------------------------------
+
+top.c: file to be compiled/synthesized by bambu.
+module_lib.h: header that declares the interfaces to existing Verilog IPs.
+module_lib.xml: XML file that describes interfaces of existing Verilog IPs.
+module1.v: verilog of an existing synthesizable IP.
+module1.c: C stub used to emulate the module1 IP in C.
+module2.v: verilog of an existing synthesizable IP.
+module2.c: C stub used to emulate the module2 IP in C.
+printer1.v: verilog of an existing non-synthesizable IP.
+printer1.c: C stub used to emulate the printer1 IP in C.
+printer2.v: verilog of an existing non-synthesizable IP.
+printer2.c: C stub used to emulate the printer2 IP in C.
+main_test.c: C testbench
+constraints_STD.xml: resource constraint file passed to bambu to generate a Verilog design with just 1 my_ip module.
+test.xml: XML file describing the testbench inputs. It is empty since we use the main_test.c as testbench generator.
+bambu.sh: synthesis and simulation script. It requires Vivado RTL and Verilator to properly work.
+
+All C/H files were validated using the "gcc -c" command.
+A C executable can be created with this command: "gcc -o ip_test main_test.c top.c module1.c module2.c printer1.c printer2.c
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/bambu.sh b/documentation/tutorial_pact_2022/01-introduction/Exercise6/bambu.sh
new file mode 100755
index 000000000..2365638eb
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/bambu.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)
+
+rm -rf hls
+mkdir -p hls
+cd hls
+echo "# integrating IP simulation"
+bambu $root_dir/main_test.c $root_dir/top.c --top-fname=main --top-rtldesign-name=my_ip \
+ --C-no-parse=$root_dir/module1.c,$root_dir/module2.c,$root_dir/printer1.c,$root_dir/printer2.c \
+ --file-input-data=$root_dir/module1.v,$root_dir/module2.v,$root_dir/printer1.v,$root_dir/printer2.v \
+ $root_dir/module_lib.xml $root_dir/constraints_STD.xml \
+ --experimental-setup=BAMBU -O3 \
+ --no-iob --memory-allocation-policy=ALL_BRAM \
+ --generate-tb=$root_dir/test.xml --simulate --simulator=VERILATOR \
+ --print-dot -v4 "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/constraints_STD.xml b/documentation/tutorial_pact_2022/01-introduction/Exercise6/constraints_STD.xml
new file mode 100644
index 000000000..bd4f51938
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/constraints_STD.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/main_test.c b/documentation/tutorial_pact_2022/01-introduction/Exercise6/main_test.c
new file mode 100644
index 000000000..fdc441e97
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/main_test.c
@@ -0,0 +1,22 @@
+#include "module_lib.h"
+#ifdef BAMBU_PROFILING
+extern void __builtin_bambu_time_start();
+extern void __builtin_bambu_time_stop();
+#endif
+
+int main()
+{
+ uint32_t param1=10;
+ uint32_t param2=10<<16;
+#ifdef BAMBU_PROFILING
+ __builtin_bambu_time_start();
+#endif
+ my_ip(0, param1, param2);
+ my_ip(1, param1, param2);
+ my_ip(2, param1, param2);
+ my_ip(3, param1, param2);
+#ifdef BAMBU_PROFILING
+ __builtin_bambu_time_stop();
+#endif
+ return 0;
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/module1.c b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module1.c
new file mode 100644
index 000000000..21ba71f5f
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module1.c
@@ -0,0 +1,8 @@
+#include "module_lib.h"
+void module1(uint32_t input1, uint16_t input2, module1_output_t *outputs)
+{
+ outputs->output1 = input1 * input2;
+ outputs->output2 = input1 + input2;
+ outputs->output3 = (~input2) + 1;
+ outputs->output4 = input2 | (((uint32_t)input2)<<16);
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/module1.v b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module1.v
new file mode 100644
index 000000000..32ffa7810
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module1.v
@@ -0,0 +1,226 @@
+module module1_IP
+ (input wire clock,
+ input wire reset,
+
+ input wire start_port,
+ output reg done_port,
+
+ input wire [31:0] input1,
+ input wire [15:0] input2,
+
+ output reg [63:0] output1,
+ output reg [63:0] output2,
+ output reg [15:0] output3,
+ output reg [31:0] output4);
+
+ reg done_port_reg;
+ reg [63:0] output1_reg;
+ reg [63:0] output2_reg;
+ reg [15:0] output3_reg;
+ reg [31:0] output4_reg;
+
+
+ //----------------------------------------------------------------
+ // Simulate processing on input
+ //----------------------------------------------------------------
+
+ always @(posedge clock) begin
+ if (!reset) begin
+ done_port_reg <= 0;
+ output1_reg <= 0;
+ output2_reg <= 0;
+ output3_reg <= 0;
+ output4_reg <= 0;
+ end
+ else begin
+ done_port_reg <= start_port;
+ output1_reg <= input1 * input2;
+ output2_reg <= {32'd0, input1} + {48'd0, input2};
+ output3_reg <= (~input2) + 1;
+ output4_reg <= {input2, input2};
+ end
+ end
+
+
+ //----------------------------------------------------------------
+ // Outputs, two cycle latency
+ //----------------------------------------------------------------
+
+ always @(posedge clock) begin
+ if (!reset) begin
+ done_port <= 0;
+ output1 <= 0;
+ output2 <= 0;
+ output3 <= 0;
+ output4 <= 0;
+ end
+ else begin
+ done_port <= done_port_reg;
+ output1 <= output1_reg;
+ output2 <= output2_reg;
+ output3 <= output3_reg;
+ output4 <= output4_reg;
+ end
+ end
+
+endmodule
+
+module module1 (clock, reset, start_port, input1, input2, outputs, done_port, Min_oe_ram, Mout_oe_ram, Min_we_ram, Mout_we_ram, Min_addr_ram, Mout_addr_ram, M_Rdata_ram, Min_Wdata_ram, Mout_Wdata_ram, Min_data_ram_size, Mout_data_ram_size, M_DataRdy);
+ parameter BITSIZE_outputs=1, BITSIZE_Min_addr_ram=1, BITSIZE_Mout_addr_ram=1, BITSIZE_M_Rdata_ram=8, BITSIZE_Min_Wdata_ram=8, BITSIZE_Mout_Wdata_ram=8, BITSIZE_Min_data_ram_size=1, BITSIZE_Mout_data_ram_size=1;
+ // IN
+ input clock;
+ input reset;
+ input start_port;
+ input [31:0] input1;
+ input [15:0] input2;
+ input [BITSIZE_outputs-1:0] outputs;
+ input Min_oe_ram;
+ input Min_we_ram;
+ input [BITSIZE_Min_addr_ram-1:0] Min_addr_ram;
+ input [BITSIZE_M_Rdata_ram-1:0] M_Rdata_ram;
+ input [BITSIZE_Min_Wdata_ram-1:0] Min_Wdata_ram;
+ input [BITSIZE_Min_data_ram_size-1:0] Min_data_ram_size;
+ input M_DataRdy;
+ // OUT
+ output done_port;
+ output Mout_oe_ram;
+ output Mout_we_ram;
+ output [BITSIZE_Mout_addr_ram-1:0] Mout_addr_ram;
+ output [BITSIZE_Mout_Wdata_ram-1:0] Mout_Wdata_ram;
+ output [BITSIZE_Mout_data_ram_size-1:0] Mout_data_ram_size;
+
+ wire [63:0] output1_int;
+ wire [63:0] output2_int;
+ wire [15:0] output3_int;
+ wire [31:0] output4_int;
+ reg [63:0] output1_reg;
+ reg [63:0] output2_reg;
+ reg [15:0] output3_reg;
+ reg [31:0] output4_reg;
+
+ reg done_port;
+ wire done_port_my_ip;
+ wire start_port_fsm;
+ reg start_port_memstore;
+ wire done_port_memstore;
+ reg [63:0] data_int;
+ reg [BITSIZE_outputs-1:0] addr_int;
+ reg [6:0] size_int;
+
+ reg Min_oe_ram_int;
+ reg Min_we_ram_int;
+ reg [BITSIZE_Min_addr_ram-1:0] Min_addr_ram_int;
+ reg [BITSIZE_Min_Wdata_ram-1:0] Min_Wdata_ram_int;
+ reg [BITSIZE_Min_data_ram_size-1:0] Min_data_ram_size_int;
+ parameter [2:0] S_0 = 3'd0,
+ S_1 = 3'd1,
+ S_2 = 3'd2,
+ S_3 = 3'd3,
+ S_4 = 3'd4;
+ reg [2:0] _present_state=S_0, _next_state;
+
+ module1_IP my_module1_IP (.done_port(done_port_my_ip), .clock(clock), .reset(reset), .start_port(start_port), .input1(input1), .input2(input2), .output1(output1_int), .output2(output2_int), .output3(output3_int), .output4(output4_int));
+ assign start_port_fsm = done_port_my_ip;
+
+ __builtin_memstore #(.BITSIZE_data(64), .BITSIZE_addr(BITSIZE_outputs), .BITSIZE_size(7), .BITSIZE_Min_addr_ram(BITSIZE_Min_addr_ram), .BITSIZE_Mout_addr_ram(BITSIZE_Mout_addr_ram), .BITSIZE_M_Rdata_ram(BITSIZE_M_Rdata_ram), .BITSIZE_Min_Wdata_ram(BITSIZE_Min_Wdata_ram), .BITSIZE_Mout_Wdata_ram(BITSIZE_Mout_Wdata_ram), .BITSIZE_Min_data_ram_size(BITSIZE_Min_data_ram_size), .BITSIZE_Mout_data_ram_size(BITSIZE_Mout_data_ram_size)) my__builtin_memstore (.clock(clock), .reset(reset), .start_port(start_port_memstore), .data(data_int), .addr(addr_int), .size(size_int), .done_port(done_port_memstore), .Min_oe_ram(Min_oe_ram_int), .Mout_oe_ram(Mout_oe_ram), .Min_we_ram(Min_we_ram_int), .Mout_we_ram(Mout_we_ram), .Min_addr_ram(Min_addr_ram_int), .Mout_addr_ram(Mout_addr_ram), .M_Rdata_ram(M_Rdata_ram), .Min_Wdata_ram(Min_Wdata_ram_int), .Mout_Wdata_ram(Mout_Wdata_ram), .Min_data_ram_size(Min_data_ram_size_int), .Mout_data_ram_size(Mout_data_ram_size), .M_DataRdy(M_DataRdy));
+
+ always @(posedge clock or negedge reset)
+ if (!reset)
+ begin
+ _present_state <= S_0;
+ end
+ else
+ _present_state <= _next_state;
+
+ always @(posedge clock or negedge reset)
+ if (!reset)
+ begin
+ output1_reg <= 0;
+ output2_reg <= 0;
+ output3_reg <= 0;
+ output4_reg <= 0;
+ end
+ else if(done_port_my_ip == 1'b1)
+ begin
+ output1_reg <= output1_int;
+ output2_reg <= output2_int;
+ output3_reg <= output3_int;
+ output4_reg <= output4_int;
+ end
+
+ always @(*)
+ begin
+ _next_state=S_0;
+ done_port=1'b0;
+ start_port_memstore=1'b0;
+ addr_int=0;
+ data_int=0;
+ size_int=0;
+ Min_oe_ram_int=Min_oe_ram;
+ Min_we_ram_int=Min_we_ram;
+ Min_data_ram_size_int=Min_data_ram_size;
+ Min_Wdata_ram_int=Min_Wdata_ram;
+ Min_addr_ram_int=Min_addr_ram;
+ case (_present_state)
+ S_0 :
+ if(start_port_fsm != 1'b1)
+ begin
+ _next_state=S_0;
+ end
+ else
+ begin
+ _next_state=S_1;
+ end
+ S_1 :
+ begin
+ _next_state=S_1;
+ start_port_memstore=1'b1;
+ addr_int=outputs;
+ data_int=output1_reg;
+ size_int=64;
+ if(done_port_memstore)
+ begin
+ _next_state=S_2;
+ end
+ end
+ S_2 :
+ begin
+ _next_state=S_2;
+ start_port_memstore=1'b1;
+ addr_int=outputs+64/8;
+ data_int=output2_reg;
+ size_int=64;
+ if(done_port_memstore)
+ begin
+ _next_state=S_3;
+ end
+ end
+ S_3 :
+ begin
+ _next_state=S_3;
+ start_port_memstore=1'b1;
+ addr_int=outputs+(64+64)/8;
+ data_int=output3_reg;
+ size_int=15;
+ if(done_port_memstore)
+ begin
+ _next_state=S_4;
+ end
+ end
+ S_4 :
+ begin
+ _next_state=S_4;
+ start_port_memstore=1'b1;
+ addr_int=outputs+(64+64+32)/8;
+ data_int=output4_reg;
+ size_int=32;
+ if(done_port_memstore)
+ begin
+ _next_state=S_0;
+ done_port=1'b1;
+ end
+ end
+ endcase
+ end
+endmodule
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/module2.c b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module2.c
new file mode 100644
index 000000000..890e8444a
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module2.c
@@ -0,0 +1,7 @@
+#include "module_lib.h"
+void module2(uint32_t input1, module2_output_t *outputs)
+{
+ outputs->output1 = input1 * input1;
+ outputs->output2 = input1 | (((uint64_t)input1)<<32);
+ outputs->output3 = (uint16_t)input1;
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/module2.v b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module2.v
new file mode 100644
index 000000000..4d42e2395
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module2.v
@@ -0,0 +1,201 @@
+module module2_IP
+ (input wire clock,
+ input wire reset,
+
+ input wire start_port,
+ output reg done_port,
+
+ input wire [31:0] input1,
+
+ output reg [63:0] output1,
+ output reg [63:0] output2,
+ output reg [15:0] output3);
+
+ reg done_port_reg;
+ reg [63:0] output1_reg;
+ reg [63:0] output2_reg;
+ reg [15:0] output3_reg;
+
+
+ //----------------------------------------------------------------
+ // Simulate processing on input
+ //----------------------------------------------------------------
+
+ always @(posedge clock) begin
+ if (!reset) begin
+ done_port_reg <= 0;
+ output1_reg <= 0;
+ output2_reg <= 0;
+ output3_reg <= 0;
+ end
+ else begin
+ done_port_reg <= start_port;
+ output1_reg <= input1 * input1;
+ output2_reg <= {input1, input1};
+ output3_reg <= input1[15:0];
+ end
+ end
+
+
+ //----------------------------------------------------------------
+ // Outputs, two cycle latency
+ //----------------------------------------------------------------
+
+ always @(posedge clock) begin
+ if (!reset) begin
+ done_port <= 0;
+ output1 <= 0;
+ output2 <= 0;
+ output3 <= 0;
+ end
+ else begin
+ done_port <= done_port_reg;
+ output1 <= output1_reg;
+ output2 <= output2_reg;
+ output3 <= output3_reg;
+ end
+ end
+
+endmodule
+
+module module2 (clock, reset, start_port, input1, outputs, done_port, Min_oe_ram, Mout_oe_ram, Min_we_ram, Mout_we_ram, Min_addr_ram, Mout_addr_ram, M_Rdata_ram, Min_Wdata_ram, Mout_Wdata_ram, Min_data_ram_size, Mout_data_ram_size, M_DataRdy);
+ parameter BITSIZE_outputs=1, BITSIZE_Min_addr_ram=1, BITSIZE_Mout_addr_ram=1, BITSIZE_M_Rdata_ram=8, BITSIZE_Min_Wdata_ram=8, BITSIZE_Mout_Wdata_ram=8, BITSIZE_Min_data_ram_size=1, BITSIZE_Mout_data_ram_size=1;
+ // IN
+ input clock;
+ input reset;
+ input start_port;
+ input [31:0] input1;
+ input [BITSIZE_outputs-1:0] outputs;
+ input Min_oe_ram;
+ input Min_we_ram;
+ input [BITSIZE_Min_addr_ram-1:0] Min_addr_ram;
+ input [BITSIZE_M_Rdata_ram-1:0] M_Rdata_ram;
+ input [BITSIZE_Min_Wdata_ram-1:0] Min_Wdata_ram;
+ input [BITSIZE_Min_data_ram_size-1:0] Min_data_ram_size;
+ input M_DataRdy;
+ // OUT
+ output done_port;
+ output Mout_oe_ram;
+ output Mout_we_ram;
+ output [BITSIZE_Mout_addr_ram-1:0] Mout_addr_ram;
+ output [BITSIZE_Mout_Wdata_ram-1:0] Mout_Wdata_ram;
+ output [BITSIZE_Mout_data_ram_size-1:0] Mout_data_ram_size;
+
+ wire [63:0] output1_int;
+ wire [63:0] output2_int;
+ wire [15:0] output3_int;
+ reg [63:0] output1_reg;
+ reg [63:0] output2_reg;
+ reg [15:0] output3_reg;
+
+ reg done_port;
+ wire done_port_my_ip;
+ wire start_port_fsm;
+ reg start_port_memstore;
+ wire done_port_memstore;
+ reg [63:0] data_int;
+ reg [BITSIZE_outputs-1:0] addr_int;
+ reg [6:0] size_int;
+
+ reg Min_oe_ram_int;
+ reg Min_we_ram_int;
+ reg [BITSIZE_Min_addr_ram-1:0] Min_addr_ram_int;
+ reg [BITSIZE_Min_Wdata_ram-1:0] Min_Wdata_ram_int;
+ reg [BITSIZE_Min_data_ram_size-1:0] Min_data_ram_size_int;
+ parameter [1:0] S_0 = 2'd0,
+ S_1 = 2'd1,
+ S_2 = 2'd2,
+ S_3 = 2'd3;
+ reg [1:0] _present_state=S_0, _next_state;
+
+ module2_IP my_module2_IP (.done_port(done_port_my_ip), .clock(clock), .reset(reset), .start_port(start_port), .input1(input1), .output1(output1_int), .output2(output2_int), .output3(output3_int));
+ assign start_port_fsm = done_port_my_ip;
+
+ __builtin_memstore #(.BITSIZE_data(64), .BITSIZE_addr(BITSIZE_outputs), .BITSIZE_size(7), .BITSIZE_Min_addr_ram(BITSIZE_Min_addr_ram), .BITSIZE_Mout_addr_ram(BITSIZE_Mout_addr_ram), .BITSIZE_M_Rdata_ram(BITSIZE_M_Rdata_ram), .BITSIZE_Min_Wdata_ram(BITSIZE_Min_Wdata_ram), .BITSIZE_Mout_Wdata_ram(BITSIZE_Mout_Wdata_ram), .BITSIZE_Min_data_ram_size(BITSIZE_Min_data_ram_size), .BITSIZE_Mout_data_ram_size(BITSIZE_Mout_data_ram_size)) my__builtin_memstore (.clock(clock), .reset(reset), .start_port(start_port_memstore), .data(data_int), .addr(addr_int), .size(size_int), .done_port(done_port_memstore), .Min_oe_ram(Min_oe_ram_int), .Mout_oe_ram(Mout_oe_ram), .Min_we_ram(Min_we_ram_int), .Mout_we_ram(Mout_we_ram), .Min_addr_ram(Min_addr_ram_int), .Mout_addr_ram(Mout_addr_ram), .M_Rdata_ram(M_Rdata_ram), .Min_Wdata_ram(Min_Wdata_ram_int), .Mout_Wdata_ram(Mout_Wdata_ram), .Min_data_ram_size(Min_data_ram_size_int), .Mout_data_ram_size(Mout_data_ram_size), .M_DataRdy(M_DataRdy));
+
+ always @(posedge clock or negedge reset)
+ if (!reset)
+ begin
+ _present_state <= S_0;
+ end
+ else
+ _present_state <= _next_state;
+
+ always @(posedge clock or negedge reset)
+ if (!reset)
+ begin
+ output1_reg <= 0;
+ output2_reg <= 0;
+ output3_reg <= 0;
+ end
+ else if(done_port_my_ip == 1'b1)
+ begin
+ output1_reg <= output1_int;
+ output2_reg <= output2_int;
+ output3_reg <= output3_int;
+ end
+
+ always @(*)
+ begin
+ _next_state=S_0;
+ done_port=1'b0;
+ start_port_memstore=1'b0;
+ addr_int=0;
+ data_int=0;
+ size_int=0;
+ Min_oe_ram_int=Min_oe_ram;
+ Min_we_ram_int=Min_we_ram;
+ Min_data_ram_size_int=Min_data_ram_size;
+ Min_Wdata_ram_int=Min_Wdata_ram;
+ Min_addr_ram_int=Min_addr_ram;
+ case (_present_state)
+ S_0 :
+ if(start_port_fsm != 1'b1)
+ begin
+ _next_state=S_0;
+ end
+ else
+ begin
+ _next_state=S_1;
+ end
+ S_1 :
+ begin
+ _next_state=S_1;
+ start_port_memstore=1'b1;
+ addr_int=outputs;
+ data_int=output1_reg;
+ size_int=64;
+ if(done_port_memstore)
+ begin
+ _next_state=S_2;
+ end
+ end
+ S_2 :
+ begin
+ _next_state=S_2;
+ start_port_memstore=1'b1;
+ addr_int=outputs+64/8;
+ data_int=output2_reg;
+ size_int=64;
+ if(done_port_memstore)
+ begin
+ _next_state=S_3;
+ end
+ end
+ S_3 :
+ begin
+ _next_state=S_3;
+ start_port_memstore=1'b1;
+ addr_int=outputs+(64+64)/8;
+ size_int=16;
+ data_int=output3_reg;
+ if(done_port_memstore)
+ begin
+ _next_state=S_0;
+ done_port=1'b1;
+ end
+ end
+ endcase
+ end
+endmodule
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/module_lib.h b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module_lib.h
new file mode 100644
index 000000000..6bff2ed40
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module_lib.h
@@ -0,0 +1,32 @@
+#ifndef MODULE_LIB_H
+#define MODULE_LIB_H
+
+#include
+
+typedef struct {
+ uint64_t output1;
+ uint64_t output2;
+ uint16_t output3;
+ uint32_t output4;
+} module1_output_t;
+
+extern void module1(uint32_t input1, uint16_t input2, module1_output_t *outputs);
+
+
+
+typedef struct {
+ uint64_t output1;
+ uint64_t output2;
+ uint16_t output3;
+} module2_output_t;
+
+extern void module2(uint32_t input1, module2_output_t *outputs);
+
+
+extern void printer1(uint64_t value1, uint64_t value2, uint16_t value3, uint32_t value4);
+
+extern void printer2(uint64_t value1, uint64_t value2, uint16_t value3);
+
+extern void my_ip(uint8_t command, uint32_t param1, uint32_t param2);
+
+#endif
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/module_lib.xml b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module_lib.xml
new file mode 100644
index 000000000..edd567d75
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/module_lib.xml
@@ -0,0 +1,262 @@
+
+
+
+ module_lib
+
+ module1
+
+ MEM_ACC_11,MEM_ACC_N1
+
+
+ Module 1 IP
+ foo
+ foo
+ foo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ module2
+ MEM_ACC_11,MEM_ACC_N1
+
+
+
+ Module 2 IP
+ foo
+ foo
+ foo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ printer2
+
+
+
+ Printer 2 IP
+ foo
+ foo
+ foo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ printer1
+
+
+
+ Printer 1 IP
+ foo
+ foo
+ foo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer1.c b/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer1.c
new file mode 100644
index 000000000..49fd269f7
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer1.c
@@ -0,0 +1,6 @@
+#include "module_lib.h"
+#include
+void printer1(uint64_t value1, uint64_t value2, uint16_t value3, uint32_t value4)
+{
+ printf("printer1: %llx %llx %x %x\n", value1, value2, value3, value4);
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer1.v b/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer1.v
new file mode 100644
index 000000000..b572577e6
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer1.v
@@ -0,0 +1,45 @@
+module printer1
+ (input wire clock,
+ input wire reset,
+
+ input wire start_port,
+ output reg done_port,
+
+ input wire [63:0] value1,
+ input wire [63:0] value2,
+ input wire [15:0] value3,
+ input wire [31:0] value4);
+
+ reg done_port_reg;
+
+ //----------------------------------------------------------------
+ // Simulate processing on input
+ //----------------------------------------------------------------
+
+ always @(posedge clock) begin
+ if (!reset) begin
+ done_port_reg <= 0;
+ end
+ else begin
+ done_port_reg <= start_port;
+ end
+ end
+
+
+ //----------------------------------------------------------------
+ // Outputs, two cycle latency
+ //----------------------------------------------------------------
+
+ always @(posedge clock) begin
+ if (!reset) begin
+ done_port <= 0;
+ end
+ else begin
+ done_port <= done_port_reg;
+ if (done_port_reg) begin
+ $display("printer1: %h %h %h %h", value1, value2, value3, value4);
+ end
+ end
+ end
+
+endmodule
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer2.c b/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer2.c
new file mode 100644
index 000000000..a73c63f62
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer2.c
@@ -0,0 +1,6 @@
+#include "module_lib.h"
+#include
+void printer2(uint64_t value1, uint64_t value2, uint16_t value3)
+{
+ printf("printer2: %llx %llx %x\n", value1, value2, value3);
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer2.v b/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer2.v
new file mode 100644
index 000000000..15fc5bdd0
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/printer2.v
@@ -0,0 +1,44 @@
+module printer2
+ (input wire clock,
+ input wire reset,
+
+ input wire start_port,
+ output reg done_port,
+
+ input wire [63:0] value1,
+ input wire [63:0] value2,
+ input wire [15:0] value3);
+
+ reg done_port_reg;
+
+ //----------------------------------------------------------------
+ // Simulate processing on input
+ //----------------------------------------------------------------
+
+ always @(posedge clock) begin
+ if (!reset) begin
+ done_port_reg <= 0;
+ end
+ else begin
+ done_port_reg <= start_port;
+ end
+ end
+
+
+ //----------------------------------------------------------------
+ // Outputs, two cycle latency
+ //----------------------------------------------------------------
+
+ always @(posedge clock) begin
+ if (!reset) begin
+ done_port <= 0;
+ end
+ else begin
+ done_port <= done_port_reg;
+ if (done_port_reg) begin
+ $display("printer2: %h %h %h", value1, value2, value3);
+ end
+ end
+ end
+
+endmodule
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/test.xml b/documentation/tutorial_pact_2022/01-introduction/Exercise6/test.xml
new file mode 100644
index 000000000..6a8f8acff
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/test.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise6/top.c b/documentation/tutorial_pact_2022/01-introduction/Exercise6/top.c
new file mode 100644
index 000000000..46fa1c11a
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise6/top.c
@@ -0,0 +1,23 @@
+#include "module_lib.h"
+
+void my_ip(uint8_t command, uint32_t param1, uint32_t param2) {
+ static module1_output_t module1_output;
+ static module2_output_t module2_output;
+
+ switch(command) {
+ case 0:
+ module1(param1, param2 >> 16, &module1_output);
+ break;
+ case 1:
+ module2(param1, &module2_output);
+ break;
+ case 2:
+ printer1(module1_output.output1, module1_output.output2, module1_output.output3, module1_output.output4);
+ break;
+ case 3:
+ printer2(module2_output.output1, module2_output.output2, module2_output.output3);
+ break;
+ default:
+ break;
+ }
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise7/aggregate.h b/documentation/tutorial_pact_2022/01-introduction/Exercise7/aggregate.h
new file mode 100644
index 000000000..2d0e9085f
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise7/aggregate.h
@@ -0,0 +1,16 @@
+#ifndef AGGREGATE_H
+#define AGGREGATE_H
+
+struct aggregate
+{
+ float a0;
+ float a1;
+ float a2;
+ float a3;
+ float a4;
+ float a5;
+ float a6;
+ float a7;
+};
+
+#endif /* AGGREGATE_H */
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise7/bambu.sh b/documentation/tutorial_pact_2022/01-introduction/Exercise7/bambu.sh
new file mode 100755
index 000000000..7219597b6
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise7/bambu.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)
+
+rm -rf hls
+mkdir hls
+cd hls
+echo "#simulation of qsort"
+bambu $root_dir/test.c $root_dir/less.c $root_dir/qsort.c --top-fname=test \
+ -Os --no-iob \
+ --generate-tb=$root_dir/test.xml --simulate \
+ -v2 --print-dot --pretty-print=a.c "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise7/less.c b/documentation/tutorial_pact_2022/01-introduction/Exercise7/less.c
new file mode 100644
index 000000000..6b5a20dfd
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise7/less.c
@@ -0,0 +1,31 @@
+#include "aggregate.h"
+
+
+int less (const void * a, const void * b, void * notUsed)
+{
+ struct aggregate * aPtr = (struct aggregate *)a;
+ struct aggregate * bPtr = (struct aggregate *)b;
+
+ float aSum = aPtr->a0 +
+ aPtr->a1 +
+ aPtr->a2 +
+ aPtr->a3 +
+ aPtr->a4 +
+ aPtr->a5 +
+ aPtr->a6 +
+ aPtr->a7;
+ float bSum = bPtr->a0 +
+ bPtr->a1 +
+ bPtr->a2 +
+ bPtr->a3 +
+ bPtr->a4 +
+ bPtr->a5 +
+ bPtr->a6 +
+ bPtr->a7;
+ int equal = (bSum - aSum) == 0;
+ if (equal) return 0;
+
+ int lt = (aSum - bSum) < 0;
+ return lt ? -1 : 1;
+}
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise7/qsort.c b/documentation/tutorial_pact_2022/01-introduction/Exercise7/qsort.c
new file mode 100644
index 000000000..64e5a1a81
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise7/qsort.c
@@ -0,0 +1,247 @@
+/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Douglas C. Schmidt (schmidt@ics.uci.edu).
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ . */
+
+/* If you consider tuning this algorithm, you should consult first:
+ Engineering a sort function; Jon Bentley and M. Douglas McIlroy;
+ Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993. */
+
+#include
+#include
+
+/* Byte-wise swap two items of size SIZE. */
+#define SWAP(a, b, size) \
+ do \
+ { \
+ size_t __size = (size); \
+ char *__a = (a), *__b = (b); \
+ do \
+ { \
+ char __tmp = *__a; \
+ *__a++ = *__b; \
+ *__b++ = __tmp; \
+ } while (--__size > 0); \
+ } while (0)
+
+/* Discontinue quicksort algorithm when partition gets below this size.
+ This particular magic number was chosen to work best on a Sun 4/260. */
+#define MAX_THRESH 4
+
+/* Stack node declarations used to store unfulfilled partition obligations. */
+typedef struct
+ {
+ char *lo;
+ char *hi;
+ } stack_node;
+
+/* The next 4 #defines implement a very fast in-line stack abstraction. */
+/* The stack needs log (total_elements) entries (we could even subtract
+ log(MAX_THRESH)). Since total_elements has type size_t, we get as
+ upper bound for log (total_elements):
+ bits per byte (CHAR_BIT) * sizeof(size_t). */
+#define STACK_SIZE (CHAR_BIT * sizeof(size_t))
+#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top))
+#define POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi)))
+#define STACK_NOT_EMPTY (stack < top)
+
+
+/* Order size using quicksort. This implementation incorporates
+ four optimizations discussed in Sedgewick:
+
+ 1. Non-recursive, using an explicit stack of pointer that store the
+ next array partition to sort. To save time, this maximum amount
+ of space required to store an array of SIZE_MAX is allocated on the
+ stack. Assuming a 32-bit (64 bit) integer for size_t, this needs
+ only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
+ Pretty cheap, actually.
+
+ 2. Chose the pivot element using a median-of-three decision tree.
+ This reduces the probability of selecting a bad pivot value and
+ eliminates certain extraneous comparisons.
+
+ 3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
+ insertion sort to order the MAX_THRESH items within each partition.
+ This is a big win, since insertion sort is faster for small, mostly
+ sorted array segments.
+
+ 4. The larger of the two sub-partitions is always pushed onto the
+ stack first, with the algorithm then concentrating on the
+ smaller partition. This *guarantees* no more than log (total_elems)
+ stack size is needed (actually O(1) in this case)! */
+
+void
+_quicksort (void *const pbase, size_t total_elems, size_t size,
+ int (*cmp)(const void *, const void *, void *), void *arg)
+{
+ char *base_ptr = (char *) pbase;
+
+ const size_t max_thresh = MAX_THRESH * size;
+
+ if (total_elems == 0)
+ /* Avoid lossage with unsigned arithmetic below. */
+ return;
+
+ if (total_elems > MAX_THRESH)
+ {
+ char *lo = base_ptr;
+ char *hi = &lo[size * (total_elems - 1)];
+ stack_node stack[STACK_SIZE];
+ stack_node *top = stack;
+
+ PUSH (NULL, NULL);
+
+ while (STACK_NOT_EMPTY)
+ {
+ char *left_ptr;
+ char *right_ptr;
+
+ /* Select median value from among LO, MID, and HI. Rearrange
+ LO and HI so the three values are sorted. This lowers the
+ probability of picking a pathological pivot value and
+ skips a comparison for both the LEFT_PTR and RIGHT_PTR in
+ the while loops. */
+
+ char *mid = lo + size * ((hi - lo) / size >> 1);
+
+ if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
+ SWAP (mid, lo, size);
+ if ((*cmp) ((void *) hi, (void *) mid, arg) < 0)
+ SWAP (mid, hi, size);
+ else
+ goto jump_over;
+ if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
+ SWAP (mid, lo, size);
+ jump_over:;
+
+ left_ptr = lo + size;
+ right_ptr = hi - size;
+
+ /* Here's the famous ``collapse the walls'' section of quicksort.
+ Gotta like those tight inner loops! They are the main reason
+ that this algorithm runs much faster than others. */
+ do
+ {
+ while ((*cmp) ((void *) left_ptr, (void *) mid, arg) < 0)
+ left_ptr += size;
+
+ while ((*cmp) ((void *) mid, (void *) right_ptr, arg) < 0)
+ right_ptr -= size;
+
+ if (left_ptr < right_ptr)
+ {
+ SWAP (left_ptr, right_ptr, size);
+ if (mid == left_ptr)
+ mid = right_ptr;
+ else if (mid == right_ptr)
+ mid = left_ptr;
+ left_ptr += size;
+ right_ptr -= size;
+ }
+ else if (left_ptr == right_ptr)
+ {
+ left_ptr += size;
+ right_ptr -= size;
+ break;
+ }
+ }
+ while (left_ptr <= right_ptr);
+
+ /* Set up pointers for next iteration. First determine whether
+ left and right partitions are below the threshold size. If so,
+ ignore one or both. Otherwise, push the larger partition's
+ bounds on the stack and continue sorting the smaller one. */
+
+ if ((size_t) (right_ptr - lo) <= max_thresh)
+ {
+ if ((size_t) (hi - left_ptr) <= max_thresh)
+ /* Ignore both small partitions. */
+ POP (lo, hi);
+ else
+ /* Ignore small left partition. */
+ lo = left_ptr;
+ }
+ else if ((size_t) (hi - left_ptr) <= max_thresh)
+ /* Ignore small right partition. */
+ hi = right_ptr;
+ else if ((right_ptr - lo) > (hi - left_ptr))
+ {
+ /* Push larger left partition indices. */
+ PUSH (lo, right_ptr);
+ lo = left_ptr;
+ }
+ else
+ {
+ /* Push larger right partition indices. */
+ PUSH (left_ptr, hi);
+ hi = right_ptr;
+ }
+ }
+ }
+
+ /* Once the BASE_PTR array is partially sorted by quicksort the rest
+ is completely sorted using insertion sort, since this is efficient
+ for partitions below MAX_THRESH size. BASE_PTR points to the beginning
+ of the array to sort, and END_PTR points at the very last element in
+ the array (*not* one beyond it!). */
+
+#define min(x, y) ((x) < (y) ? (x) : (y))
+
+ {
+ char *const end_ptr = &base_ptr[size * (total_elems - 1)];
+ char *tmp_ptr = base_ptr;
+ char *thresh = min(end_ptr, base_ptr + max_thresh);
+ char *run_ptr;
+
+ /* Find smallest element in first threshold and place it at the
+ array's beginning. This is the smallest array element,
+ and the operation speeds up insertion sort's inner loop. */
+
+ for (run_ptr = tmp_ptr + size; run_ptr <= thresh; run_ptr += size)
+ if ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0)
+ tmp_ptr = run_ptr;
+
+ if (tmp_ptr != base_ptr)
+ SWAP (tmp_ptr, base_ptr, size);
+
+ /* Insertion sort, running from left-hand-side up to right-hand-side. */
+
+ run_ptr = base_ptr + size;
+ while ((run_ptr += size) <= end_ptr)
+ {
+ tmp_ptr = run_ptr - size;
+ while ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0)
+ tmp_ptr -= size;
+
+ tmp_ptr += size;
+ if (tmp_ptr != run_ptr)
+ {
+ char *trav;
+
+ trav = run_ptr + size;
+ while (--trav >= run_ptr)
+ {
+ char c = *trav;
+ char *hi, *lo;
+
+ for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo)
+ *hi = *lo;
+ *hi = c;
+ }
+ }
+ }
+ }
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise7/test.c b/documentation/tutorial_pact_2022/01-introduction/Exercise7/test.c
new file mode 100644
index 000000000..f968a2897
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise7/test.c
@@ -0,0 +1,17 @@
+typedef unsigned int size_t;
+
+typedef int (*__compar_d_fn_t)(void *, void *, void *);
+
+#include "aggregate.h"
+
+//#include "qsort.c"
+void
+_quicksort (void *const pbase, size_t total_elems, size_t size,
+ int (*cmp)(const void *, const void *, void *), void *arg);
+//#include "less.c"
+int less (void * a, void * b, void * notUsed);
+
+void test(float * const pbase, size_t total_elems)
+{
+ _quicksort(pbase, (sizeof(float) * total_elems) / sizeof(struct aggregate), sizeof(struct aggregate), less , (void *)0);
+}
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise7/test.xml b/documentation/tutorial_pact_2022/01-introduction/Exercise7/test.xml
new file mode 100644
index 000000000..a98af4c69
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise7/test.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise8/Keccak.c b/documentation/tutorial_pact_2022/01-introduction/Exercise8/Keccak.c
new file mode 100644
index 000000000..cbc8cc651
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise8/Keccak.c
@@ -0,0 +1,142 @@
+/*
+ * The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+ * Michaël Peeters and Gilles Van Assche. For more information, feedback or
+ * questions, please refer to our website: http://keccak.noekeon.org/
+ * Implementation by the designers,
+ * hereby denoted as "the implementer".
+ * To the extent possible under law, the implementer has waived all copyright
+ * and related or neighboring rights to the source code in this file.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ *
+ */
+typedef unsigned char UINT8;
+typedef unsigned long long int UINT64;
+#define nrRounds 24
+
+#define GET_KRC_VAL(index) (KeccakRoundConstants[index])
+
+static UINT64 KeccakRoundConstants[nrRounds] = {
+ 0x0000000000000001ULL,
+ 0x0000000000008082ULL,
+ 0x800000000000808aULL,
+ 0x8000000080008000ULL,
+ 0x000000000000808bULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008009ULL,
+ 0x000000000000008aULL,
+ 0x0000000000000088ULL,
+ 0x0000000080008009ULL,
+ 0x000000008000000aULL,
+ 0x000000008000808bULL,
+ 0x800000000000008bULL,
+ 0x8000000000008089ULL,
+ 0x8000000000008003ULL,
+ 0x8000000000008002ULL,
+ 0x8000000000000080ULL,
+ 0x000000000000800aULL,
+ 0x800000008000000aULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008080ULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008008ULL
+};
+
+#define nrLanes 25
+static unsigned char KeccakRhoOffsets[nrLanes] = {
+ 0,
+ 1,
+ 62,
+ 28,
+ 27,
+ 36,
+ 44,
+ 6,
+ 55,
+ 20,
+ 3,
+ 10,
+ 43,
+ 25,
+ 39,
+ 41,
+ 45,
+ 15,
+ 21,
+ 8,
+ 18,
+ 2,
+ 61,
+ 56,
+ 14
+};
+
+#define index(x, y) (((x)%5)+5*((y)%5))
+#define ROL64(a, offset) ((offset != 0) ? ((((UINT64)a) << offset) ^ (((UINT64)a) >> (64-offset))) : a)
+
+void theta(UINT64 *A)
+{
+ unsigned int x, y;
+ UINT64 C[5], D[5];
+
+ for(x=0; x<5; x++) {
+ C[x] = 0;
+ for(y=0; y<5; y++)
+ C[x] ^= A[index(x, y)];
+ }
+ for(x=0; x<5; x++)
+ D[x] = ROL64(C[(x+1)%5], 1) ^ C[(x+4)%5];
+ for(x=0; x<5; x++)
+ for(y=0; y<5; y++)
+ A[index(x, y)] ^= D[x];
+}
+
+void rho(UINT64 *A)
+{
+ unsigned int x, y;
+
+ for(x=0; x<5; x++) for(y=0; y<5; y++)
+ A[index(x, y)] = ROL64(A[index(x, y)], KeccakRhoOffsets[index(x, y)]);
+}
+
+void pi(UINT64 *A)
+{
+ unsigned int x, y;
+ UINT64 tempA[25];
+
+ for(x=0; x<5; x++) for(y=0; y<5; y++)
+ tempA[index(x, y)] = A[index(x, y)];
+ for(x=0; x<5; x++) for(y=0; y<5; y++)
+ A[index(0*x+1*y, 2*x+3*y)] = tempA[index(x, y)];
+}
+
+void chi(UINT64 *A)
+{
+ unsigned int x, y;
+ UINT64 C[5];
+
+ for(y=0; y<5; y++) {
+ for(x=0; x<5; x++)
+ C[x] = A[index(x, y)] ^ ((~A[index(x+1, y)]) & A[index(x+2, y)]);
+ for(x=0; x<5; x++)
+ A[index(x, y)] = C[x];
+ }
+}
+
+void iota(UINT64 *A, unsigned int indexRound)
+{
+ A[index(0, 0)] ^= GET_KRC_VAL(indexRound);
+}
+
+
+void kekka_coproc(UINT64 A[25])
+{
+ unsigned int i;
+ for(i=0;i
+
+
+
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise9/bambu.sh b/documentation/tutorial_pact_2022/01-introduction/Exercise9/bambu.sh
new file mode 100755
index 000000000..a67cdc80f
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise9/bambu.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)
+
+rm -rf search
+mkdir -p search
+cd search
+echo "#simulation of search function"
+bambu $root_dir/tree.c --top-fname=main --top-rtldesign-name=search \
+ -DNDEBUG -DBAMBU_PROFILING \
+ -O3 --experimental-setup=BAMBU \
+ --generate-tb=$root_dir/test_search.xml --simulator=ICARUS --simulate \
+ --print-dot -v2 "$@" |& tee log.txt
\ No newline at end of file
diff --git a/documentation/tutorial_pact_2022/01-introduction/Exercise9/tree.c b/documentation/tutorial_pact_2022/01-introduction/Exercise9/tree.c
new file mode 100644
index 000000000..088ea68c2
--- /dev/null
+++ b/documentation/tutorial_pact_2022/01-introduction/Exercise9/tree.c
@@ -0,0 +1,323 @@
+#include
+#include
+#include
+
+#define MAX_NUMBER_OF_NODES 255
+extern void __builtin_bambu_time_start();
+extern void __builtin_bambu_time_stop();
+
+/* stack data structure */
+struct stack
+{
+ void *data;
+ struct stack *next;
+};
+
+typedef struct stack node_stack;
+
+/* Auxiliary memory stack allocation utilities */
+static node_stack StaticPoolStack[MAX_NUMBER_OF_NODES];
+static node_stack* head_stack_free_list;
+
+void push_stack_free_list(node_stack ** head, node_stack * new_node)
+{
+ new_node->data = 0;
+ new_node->next = *head;
+ *head = new_node;
+}
+node_stack* pop_stack_free_list(node_stack ** head)
+{
+ node_stack* retval = 0;
+ node_stack * next_node = NULL;
+
+ if (*head == NULL)
+ return NULL;
+
+ next_node = (*head)->next;
+ retval = *head;
+ *head = next_node;
+
+ return retval;
+}
+void init_stack_free_list()
+{
+ int index;
+ for(index=0; index < MAX_NUMBER_OF_NODES; ++index)
+ push_stack_free_list(&head_stack_free_list, &StaticPoolStack[index]);
+}
+
+/* Stack related functions */
+void push(node_stack** head, void *t)
+{
+ node_stack* temp = pop_stack_free_list(&head_stack_free_list);
+ assert(temp);
+ temp->data = t;
+ temp->next = (*head);
+ *head= temp;
+}
+_Bool isEmpty(node_stack *head)
+{
+ return (head == NULL)? 1 : 0;
+}
+void *pop(node_stack** head)
+{
+ void *res;
+ node_stack *top;
+
+ assert(!isEmpty(*head));
+ top = *head;
+ res = top->data;
+ *head = top->next;
+ push_stack_free_list(&head_stack_free_list, top);
+ return res;
+}
+
+void* top(node_stack* head)
+{
+ return head->data;
+}
+
+/* binary tree data structure */
+struct bin_tree {
+ int data;
+ struct bin_tree * right, * left;
+};
+typedef struct bin_tree node_tree;
+
+/* Auxiliary memory tree allocation utilities */
+static node_tree StaticPoolTree[MAX_NUMBER_OF_NODES];
+static node_tree* head_tree_free_list;
+
+void push_tree_free_list(node_tree ** head, node_tree * new_node)
+{
+ new_node->data = 0;
+ new_node->left = *head;
+ new_node->right = 0;
+ *head = new_node;
+}
+node_tree* pop_tree_free_list(node_tree ** head)
+{
+ node_tree* retval = 0;
+ node_tree * next_node = NULL;
+
+ if (*head == NULL)
+ return NULL;
+
+ next_node = (*head)->left;
+ retval = *head;
+ *head = next_node;
+
+ return retval;
+}
+void init_tree_free_list()
+{
+ int index;
+ for(index=0; index < MAX_NUMBER_OF_NODES; ++index)
+ push_tree_free_list(&head_tree_free_list, &StaticPoolTree[index]);
+}
+
+
+/* binary tree functions */
+void insert(node_tree ** tree, int val)
+{
+ node_tree *temp = NULL;
+ if(!(*tree))
+ {
+ temp = pop_tree_free_list(&head_tree_free_list);
+ assert(temp);
+ temp->left = temp->right = NULL;
+ temp->data = val;
+ *tree = temp;
+ return;
+ }
+ if(val < (*tree)->data)
+ {
+ insert(&(*tree)->left, val);
+ }
+ else if(val > (*tree)->data)
+ {
+ insert(&(*tree)->right, val);
+ }
+}
+
+void print_preorder(node_tree * root)
+{
+ if (root)
+ {
+ node_tree *current;
+ node_stack *s = NULL;
+ push(&s, root);
+
+ while (!isEmpty(s))
+ {
+ current = pop(&s);
+ printf ("%d\n", current->data);
+
+ if (current->right)
+ push(&s, current->right);
+ if (current->left)
+ push(&s, current->left);
+ }
+ }
+}
+
+/* Iterative function for inorder binary tree print */
+void print_inorder(node_tree *root)
+{
+ node_tree *current = root;
+ node_stack *s = NULL;
+ _Bool done = 0;
+
+ while (!done)
+ {
+ if(current != NULL)
+ {
+ push(&s, current);
+ current = current->left;
+ }
+ else
+ {
+ if (!isEmpty(s))
+ {
+ current = pop(&s);
+ printf("%d\n", current->data);
+ current = current->right;
+ }
+ else
+ done = 1;
+ }
+ }
+}
+
+
+void print_postorder(node_tree * root)
+{
+ if (root)
+ {
+ node_tree *prev=NULL;
+ node_stack *s = NULL;
+ push(&s, root);
+
+ while (!isEmpty(s)) {
+ node_tree *curr = top(s);
+ if (!prev || prev->left == curr || prev->right == curr) {
+ if (curr->left)
+ push(&s, curr->left);
+ else if (curr->right)
+ push(&s, curr->right);
+ } else if (curr->left == prev) {
+ if (curr->right)
+ push(&s, curr->right);
+ } else {
+ printf("%d\n", curr->data);
+ pop(&s);
+ }
+ prev = curr;
+ }
+ }
+}
+
+void deltree(node_tree * root)
+{
+ if (root)
+ {
+ node_tree *prev=NULL;
+ node_stack *s = NULL;
+ push(&s, root);
+
+ while (!isEmpty(s)) {
+ node_tree *curr = top(s);
+ if (!prev || prev->left == curr || prev->right == curr) {
+ if (curr->left)
+ push(&s, curr->left);
+ else if (curr->right)
+ push(&s, curr->right);
+ } else if (curr->left == prev) {
+ if (curr->right)
+ push(&s, curr->right);
+ } else {
+ push_tree_free_list(&head_tree_free_list, curr);
+ pop(&s);
+ }
+ prev = curr;
+ }
+ }
+}
+
+node_tree* __attribute__ ((noinline)) search(node_tree * tree, int val)
+{
+ if(tree == NULL|| tree->data == val)
+ return tree;
+
+ if (tree->data < val)
+ return search(tree->right, val);
+ else
+ return search(tree->left, val);
+}
+
+int main()
+{
+ node_tree *root;
+ node_tree *tmp;
+ //int i;
+ init_tree_free_list();
+ init_stack_free_list();
+
+ root = NULL;
+ /* Inserting nodes into tree */
+ insert(&root, 9);
+ insert(&root, 4);
+ insert(&root, 15);
+ insert(&root, 6);
+ insert(&root, 12);
+ insert(&root, 17);
+ insert(&root, 2);
+
+ /* Printing nodes of tree */
+ printf("Pre Order Display\n");
+ print_preorder(root);
+
+ printf("In Order Display\n");
+ print_inorder(root);
+
+ printf("Post Order Display\n");
+ print_postorder(root);
+
+ /* Search node into tree */
+#ifdef BAMBU_PROFILING
+ __builtin_bambu_time_start();
+#endif
+ tmp = search(root, 4);
+#ifdef BAMBU_PROFILING
+ __builtin_bambu_time_stop();
+#endif
+ if (tmp)
+ {
+ printf("Searched node=%d\n", tmp->data);
+ }
+ else
+ {
+ printf("Data Not found in tree.\n");
+ }
+
+ /* Search node into tree */
+#ifdef BAMBU_PROFILING
+ __builtin_bambu_time_start();
+#endif
+ tmp = search(root, 6);
+#ifdef BAMBU_PROFILING
+ __builtin_bambu_time_stop();
+#endif
+ if (tmp)
+ {
+ printf("Second searched node=%d\n", tmp->data);
+ }
+ else
+ {
+ printf("Data Not found in tree.\n");
+ }
+
+ /* Deleting all nodes of tree */
+ deltree(root);
+ return 0;
+}
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise1/README b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/README
new file mode 100644
index 000000000..ebe8c2298
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/README
@@ -0,0 +1,5 @@
+Evaluate the effects of GCC optimizations on the number of cycles of adpcm benchmark:
+- Different level of optimizations
+- Vectorization
+- Different inlining
+
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise1/adpcm.c b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/adpcm.c
new file mode 100755
index 000000000..613b1bdb5
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/adpcm.c
@@ -0,0 +1,882 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*************************************************************************/
+/* */
+/* SNU-RT Benchmark Suite for Worst Case Timing Analysis */
+/* ===================================================== */
+/* Collected and Modified by S.-S. Lim */
+/* sslim@archi.snu.ac.kr */
+/* Real-Time Research Group */
+/* Seoul National University */
+/* */
+/* */
+/* < Features > - restrictions for our experimental environment */
+/* */
+/* 1. Completely structured. */
+/* - There are no unconditional jumps. */
+/* - There are no exit from loop bodies. */
+/* (There are no 'break' or 'return' in loop bodies) */
+/* 2. No 'switch' statements. */
+/* 3. No 'do..while' statements. */
+/* 4. Expressions are restricted. */
+/* - There are no multiple expressions joined by 'or', */
+/* 'and' operations. */
+/* 5. No library calls. */
+/* - All the functions needed are implemented in the */
+/* source file. */
+/* */
+/* */
+/*************************************************************************/
+/* */
+/* FILE: adpcm.c */
+/* SOURCE : C Algorithms for Real-Time DSP by P. M. Embree */
+/* */
+/* DESCRIPTION : */
+/* */
+/* CCITT G.722 ADPCM (Adaptive Differential Pulse Code Modulation) */
+/* algorithm. */
+/* 16khz sample rate data is stored in the array test_data[SIZE]. */
+/* Results are stored in the array compressed[SIZE] and result[SIZE].*/
+/* Execution time is determined by the constant SIZE (default value */
+/* is 2000). */
+/* */
+/* REMARK : */
+/* */
+/* EXECUTION TIME : */
+/* */
+/* */
+/*************************************************************************/
+#include
+
+int encode (int, int);
+void decode (int);
+int filtez (int *bpl, int *dlt);
+void upzero (int dlt, int *dlti, int *bli);
+int filtep (int rlt1, int al1, int rlt2, int al2);
+int quantl (int el, int detl);
+int logscl (int il, int nbl);
+int scalel (int nbl, int shift_constant);
+int uppol2 (int al1, int al2, int plt, int plt1, int plt2);
+int uppol1 (int al1, int apl2, int plt, int plt1);
+int logsch (int ih, int nbh);
+void reset ();
+
+/* G722 C code */
+
+/* variables for transimit quadrature mirror filter here */
+int tqmf[24];
+
+/* QMF filter coefficients:
+scaled by a factor of 4 compared to G722 CCITT recomendation */
+const int h[24] = {
+ 12, -44, -44, 212, 48, -624, 128, 1448,
+ -840, -3220, 3804, 15504, 15504, 3804, -3220, -840,
+ 1448, 128, -624, 48, 212, -44, -44, 12
+};
+
+int xl, xh;
+
+/* variables for receive quadrature mirror filter here */
+int accumc[11], accumd[11];
+
+/* outputs of decode() */
+int xout1, xout2;
+
+int xs, xd;
+
+/* variables for encoder (hi and lo) here */
+
+int il, szl, spl, sl, el;
+
+const int qq4_code4_table[16] = {
+ 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200,
+ 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0
+};
+
+
+const int qq6_code6_table[64] = {
+ -136, -136, -136, -136, -24808, -21904, -19008, -16704,
+ -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856,
+ -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576,
+ -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728,
+ 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192,
+ 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456,
+ 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032,
+ 1688, 1360, 1040, 728, 432, 136, -432, -136
+};
+
+int delay_bpl[6];
+
+int delay_dltx[6];
+
+const int wl_code_table[16] = {
+ -60, 3042, 1198, 538, 334, 172, 58, -30,
+ 3042, 1198, 538, 334, 172, 58, -30, -60
+};
+
+const int ilb_table[32] = {
+ 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383,
+ 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834,
+ 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371,
+ 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008
+};
+
+int nbl; /* delay line */
+int al1, al2;
+int plt, plt1, plt2;
+int dlt;
+int rlt, rlt1, rlt2;
+
+/* decision levels - pre-multiplied by 8, 0 to indicate end */
+const int decis_levl[30] = {
+ 280, 576, 880, 1200, 1520, 1864, 2208, 2584,
+ 2960, 3376, 3784, 4240, 4696, 5200, 5712, 6288,
+ 6864, 7520, 8184, 8968, 9752, 10712, 11664, 12896,
+ 14120, 15840, 17560, 20456, 23352, 32767
+};
+
+int detl;
+
+/* quantization table 31 long to make quantl look-up easier,
+last entry is for mil=30 case when wd is max */
+const int quant26bt_pos[31] = {
+ 61, 60, 59, 58, 57, 56, 55, 54,
+ 53, 52, 51, 50, 49, 48, 47, 46,
+ 45, 44, 43, 42, 41, 40, 39, 38,
+ 37, 36, 35, 34, 33, 32, 32
+};
+
+/* quantization table 31 long to make quantl look-up easier,
+last entry is for mil=30 case when wd is max */
+const int quant26bt_neg[31] = {
+ 63, 62, 31, 30, 29, 28, 27, 26,
+ 25, 24, 23, 22, 21, 20, 19, 18,
+ 17, 16, 15, 14, 13, 12, 11, 10,
+ 9, 8, 7, 6, 5, 4, 4
+};
+
+
+int deth;
+int sh; /* this comes from adaptive predictor */
+int eh;
+
+const int qq2_code2_table[4] = {
+ -7408, -1616, 7408, 1616
+};
+
+const int wh_code_table[4] = {
+ 798, -214, 798, -214
+};
+
+
+int dh, ih;
+int nbh, szh;
+int sph, ph, yh, rh;
+
+int delay_dhx[6];
+
+int delay_bph[6];
+
+int ah1, ah2;
+int ph1, ph2;
+int rh1, rh2;
+
+/* variables for decoder here */
+int ilr, rl;
+int dec_deth, dec_detl, dec_dlt;
+
+int dec_del_bpl[6];
+
+int dec_del_dltx[6];
+
+int dec_plt, dec_plt1, dec_plt2;
+int dec_szl, dec_spl, dec_sl;
+int dec_rlt1, dec_rlt2, dec_rlt;
+int dec_al1, dec_al2;
+int dl;
+int dec_nbl, dec_dh, dec_nbh;
+
+/* variables used in filtez */
+int dec_del_bph[6];
+
+int dec_del_dhx[6];
+
+int dec_szh;
+/* variables used in filtep */
+int dec_rh1, dec_rh2;
+int dec_ah1, dec_ah2;
+int dec_ph, dec_sph;
+
+int dec_sh;
+
+int dec_ph1, dec_ph2;
+
+/* G722 encode function two ints in, one 8 bit output */
+
+/* put input samples in xin1 = first value, xin2 = second value */
+/* returns il and ih stored together */
+
+int
+abs (int n)
+{
+ int m;
+
+ if (n >= 0)
+ m = n;
+ else
+ m = -n;
+ return m;
+}
+
+int
+encode (int xin1, int xin2)
+{
+ int i;
+ const int *h_ptr;
+ int *tqmf_ptr, *tqmf_ptr1;
+ long int xa, xb;
+ int decis;
+
+/* transmit quadrature mirror filters implemented here */
+ h_ptr = h;
+ tqmf_ptr = tqmf;
+ xa = (long) (*tqmf_ptr++) * (*h_ptr++);
+ xb = (long) (*tqmf_ptr++) * (*h_ptr++);
+/* main multiply accumulate loop for samples and coefficients */
+ for (i = 0; i < 10; i++)
+ {
+ xa += (long) (*tqmf_ptr++) * (*h_ptr++);
+ xb += (long) (*tqmf_ptr++) * (*h_ptr++);
+ }
+/* final mult/accumulate */
+ xa += (long) (*tqmf_ptr++) * (*h_ptr++);
+ xb += (long) (*tqmf_ptr) * (*h_ptr++);
+
+/* update delay line tqmf */
+ tqmf_ptr1 = tqmf_ptr - 2;
+ for (i = 0; i < 22; i++)
+ *tqmf_ptr-- = *tqmf_ptr1--;
+ *tqmf_ptr-- = xin1;
+ *tqmf_ptr = xin2;
+
+/* scale outputs */
+ xl = (xa + xb) >> 15;
+ xh = (xa - xb) >> 15;
+
+/* end of quadrature mirror filter code */
+
+/* starting with lower sub band encoder */
+
+/* filtez - compute predictor output section - zero section */
+ szl = filtez (delay_bpl, delay_dltx);
+
+/* filtep - compute predictor output signal (pole section) */
+ spl = filtep (rlt1, al1, rlt2, al2);
+
+/* compute the predictor output value in the lower sub_band encoder */
+ sl = szl + spl;
+ el = xl - sl;
+
+/* quantl: quantize the difference signal */
+ il = quantl (el, detl);
+
+/* computes quantized difference signal */
+/* for invqbl, truncate by 2 lsbs, so mode = 3 */
+ dlt = ((long) detl * qq4_code4_table[il >> 2]) >> 15;
+
+/* logscl: updates logarithmic quant. scale factor in low sub band */
+ nbl = logscl (il, nbl);
+
+/* scalel: compute the quantizer scale factor in the lower sub band */
+/* calling parameters nbl and 8 (constant such that scalel can be scaleh) */
+ detl = scalel (nbl, 8);
+
+/* parrec - simple addition to compute recontructed signal for adaptive pred */
+ plt = dlt + szl;
+
+/* upzero: update zero section predictor coefficients (sixth order)*/
+/* calling parameters: dlt, dlt1, dlt2, ..., dlt6 from dlt */
+/* bpli (linear_buffer in which all six values are delayed */
+/* return params: updated bpli, delayed dltx */
+ upzero (dlt, delay_dltx, delay_bpl);
+
+/* uppol2- update second predictor coefficient apl2 and delay it as al2 */
+/* calling parameters: al1, al2, plt, plt1, plt2 */
+ al2 = uppol2 (al1, al2, plt, plt1, plt2);
+
+/* uppol1 :update first predictor coefficient apl1 and delay it as al1 */
+/* calling parameters: al1, apl2, plt, plt1 */
+ al1 = uppol1 (al1, al2, plt, plt1);
+
+/* recons : compute recontructed signal for adaptive predictor */
+ rlt = sl + dlt;
+
+/* done with lower sub_band encoder; now implement delays for next time*/
+ rlt2 = rlt1;
+ rlt1 = rlt;
+ plt2 = plt1;
+ plt1 = plt;
+
+/* high band encode */
+
+ szh = filtez (delay_bph, delay_dhx);
+
+ sph = filtep (rh1, ah1, rh2, ah2);
+
+/* predic: sh = sph + szh */
+ sh = sph + szh;
+/* subtra: eh = xh - sh */
+ eh = xh - sh;
+
+/* quanth - quantization of difference signal for higher sub-band */
+/* quanth: in-place for speed params: eh, deth (has init. value) */
+ if (eh >= 0)
+ {
+ ih = 3; /* 2,3 are pos codes */
+ }
+ else
+ {
+ ih = 1; /* 0,1 are neg codes */
+ }
+ decis = (564L * (long) deth) >> 12L;
+ if (abs (eh) > decis)
+ ih--; /* mih = 2 case */
+
+/* compute the quantized difference signal, higher sub-band*/
+ dh = ((long) deth * qq2_code2_table[ih]) >> 15L;
+
+/* logsch: update logarithmic quantizer scale factor in hi sub-band*/
+ nbh = logsch (ih, nbh);
+
+/* note : scalel and scaleh use same code, different parameters */
+ deth = scalel (nbh, 10);
+
+/* parrec - add pole predictor output to quantized diff. signal */
+ ph = dh + szh;
+
+/* upzero: update zero section predictor coefficients (sixth order) */
+/* calling parameters: dh, dhi, bphi */
+/* return params: updated bphi, delayed dhx */
+ upzero (dh, delay_dhx, delay_bph);
+
+/* uppol2: update second predictor coef aph2 and delay as ah2 */
+/* calling params: ah1, ah2, ph, ph1, ph2 */
+ ah2 = uppol2 (ah1, ah2, ph, ph1, ph2);
+
+/* uppol1: update first predictor coef. aph2 and delay it as ah1 */
+ ah1 = uppol1 (ah1, ah2, ph, ph1);
+
+/* recons for higher sub-band */
+ yh = sh + dh;
+
+/* done with higher sub-band encoder, now Delay for next time */
+ rh2 = rh1;
+ rh1 = yh;
+ ph2 = ph1;
+ ph1 = ph;
+
+/* multiplex ih and il to get signals together */
+ return (il | (ih << 6));
+}
+
+/* decode function, result in xout1 and xout2 */
+
+void
+decode (int input)
+{
+ int i;
+ long int xa1, xa2; /* qmf accumulators */
+ const int *h_ptr;
+ int *ac_ptr, *ac_ptr1, *ad_ptr, *ad_ptr1;
+
+/* split transmitted word from input into ilr and ih */
+ ilr = input & 0x3f;
+ ih = input >> 6;
+
+/* LOWER SUB_BAND DECODER */
+
+/* filtez: compute predictor output for zero section */
+ dec_szl = filtez (dec_del_bpl, dec_del_dltx);
+
+/* filtep: compute predictor output signal for pole section */
+ dec_spl = filtep (dec_rlt1, dec_al1, dec_rlt2, dec_al2);
+
+ dec_sl = dec_spl + dec_szl;
+
+/* compute quantized difference signal for adaptive predic */
+ dec_dlt = ((long) dec_detl * qq4_code4_table[ilr >> 2]) >> 15;
+
+/* compute quantized difference signal for decoder output */
+ dl = ((long) dec_detl * qq6_code6_table[il]) >> 15;
+
+ rl = dl + dec_sl;
+
+/* logscl: quantizer scale factor adaptation in the lower sub-band */
+ dec_nbl = logscl (ilr, dec_nbl);
+
+/* scalel: computes quantizer scale factor in the lower sub band */
+ dec_detl = scalel (dec_nbl, 8);
+
+/* parrec - add pole predictor output to quantized diff. signal */
+/* for partially reconstructed signal */
+ dec_plt = dec_dlt + dec_szl;
+
+/* upzero: update zero section predictor coefficients */
+ upzero (dec_dlt, dec_del_dltx, dec_del_bpl);
+
+/* uppol2: update second predictor coefficient apl2 and delay it as al2 */
+ dec_al2 = uppol2 (dec_al1, dec_al2, dec_plt, dec_plt1, dec_plt2);
+
+/* uppol1: update first predictor coef. (pole setion) */
+ dec_al1 = uppol1 (dec_al1, dec_al2, dec_plt, dec_plt1);
+
+/* recons : compute recontructed signal for adaptive predictor */
+ dec_rlt = dec_sl + dec_dlt;
+
+/* done with lower sub band decoder, implement delays for next time */
+ dec_rlt2 = dec_rlt1;
+ dec_rlt1 = dec_rlt;
+ dec_plt2 = dec_plt1;
+ dec_plt1 = dec_plt;
+
+/* HIGH SUB-BAND DECODER */
+
+/* filtez: compute predictor output for zero section */
+ dec_szh = filtez (dec_del_bph, dec_del_dhx);
+
+/* filtep: compute predictor output signal for pole section */
+ dec_sph = filtep (dec_rh1, dec_ah1, dec_rh2, dec_ah2);
+
+/* predic:compute the predictor output value in the higher sub_band decoder */
+ dec_sh = dec_sph + dec_szh;
+
+/* in-place compute the quantized difference signal */
+ dec_dh = ((long) dec_deth * qq2_code2_table[ih]) >> 15L;
+
+/* logsch: update logarithmic quantizer scale factor in hi sub band */
+ dec_nbh = logsch (ih, dec_nbh);
+
+/* scalel: compute the quantizer scale factor in the higher sub band */
+ dec_deth = scalel (dec_nbh, 10);
+
+/* parrec: compute partially recontructed signal */
+ dec_ph = dec_dh + dec_szh;
+
+/* upzero: update zero section predictor coefficients */
+ upzero (dec_dh, dec_del_dhx, dec_del_bph);
+
+/* uppol2: update second predictor coefficient aph2 and delay it as ah2 */
+ dec_ah2 = uppol2 (dec_ah1, dec_ah2, dec_ph, dec_ph1, dec_ph2);
+
+/* uppol1: update first predictor coef. (pole setion) */
+ dec_ah1 = uppol1 (dec_ah1, dec_ah2, dec_ph, dec_ph1);
+
+/* recons : compute recontructed signal for adaptive predictor */
+ rh = dec_sh + dec_dh;
+
+/* done with high band decode, implementing delays for next time here */
+ dec_rh2 = dec_rh1;
+ dec_rh1 = rh;
+ dec_ph2 = dec_ph1;
+ dec_ph1 = dec_ph;
+
+/* end of higher sub_band decoder */
+
+/* end with receive quadrature mirror filters */
+ xd = rl - rh;
+ xs = rl + rh;
+
+/* receive quadrature mirror filters implemented here */
+ h_ptr = h;
+ ac_ptr = accumc;
+ ad_ptr = accumd;
+ xa1 = (long) xd *(*h_ptr++);
+ xa2 = (long) xs *(*h_ptr++);
+/* main multiply accumulate loop for samples and coefficients */
+ for (i = 0; i < 10; i++)
+ {
+ xa1 += (long) (*ac_ptr++) * (*h_ptr++);
+ xa2 += (long) (*ad_ptr++) * (*h_ptr++);
+ }
+/* final mult/accumulate */
+ xa1 += (long) (*ac_ptr) * (*h_ptr++);
+ xa2 += (long) (*ad_ptr) * (*h_ptr++);
+
+/* scale by 2^14 */
+ xout1 = xa1 >> 14;
+ xout2 = xa2 >> 14;
+
+/* update delay lines */
+ ac_ptr1 = ac_ptr - 1;
+ ad_ptr1 = ad_ptr - 1;
+ for (i = 0; i < 10; i++)
+ {
+ *ac_ptr-- = *ac_ptr1--;
+ *ad_ptr-- = *ad_ptr1--;
+ }
+ *ac_ptr = xd;
+ *ad_ptr = xs;
+}
+
+/* clear all storage locations */
+
+void
+reset ()
+{
+ int i;
+
+ detl = dec_detl = 32; /* reset to min scale factor */
+ deth = dec_deth = 8;
+ nbl = al1 = al2 = plt1 = plt2 = rlt1 = rlt2 = 0;
+ nbh = ah1 = ah2 = ph1 = ph2 = rh1 = rh2 = 0;
+ dec_nbl = dec_al1 = dec_al2 = dec_plt1 = dec_plt2 = dec_rlt1 = dec_rlt2 = 0;
+ dec_nbh = dec_ah1 = dec_ah2 = dec_ph1 = dec_ph2 = dec_rh1 = dec_rh2 = 0;
+
+ for (i = 0; i < 6; i++)
+ {
+ delay_dltx[i] = 0;
+ delay_dhx[i] = 0;
+ dec_del_dltx[i] = 0;
+ dec_del_dhx[i] = 0;
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ delay_bpl[i] = 0;
+ delay_bph[i] = 0;
+ dec_del_bpl[i] = 0;
+ dec_del_bph[i] = 0;
+ }
+
+ for (i = 0; i < 24; i++)
+ tqmf[i] = 0; // i<23
+
+ for (i = 0; i < 11; i++)
+ {
+ accumc[i] = 0;
+ accumd[i] = 0;
+ }
+}
+
+/* filtez - compute predictor output signal (zero section) */
+/* input: bpl1-6 and dlt1-6, output: szl */
+
+int
+filtez (int *bpl, int *dlt)
+{
+ int i;
+ long int zl;
+ zl = (long) (*bpl++) * (*dlt++);
+ for (i = 1; i < 6; i++)
+ zl += (long) (*bpl++) * (*dlt++);
+
+ return ((int) (zl >> 14)); /* x2 here */
+}
+
+/* filtep - compute predictor output signal (pole section) */
+/* input rlt1-2 and al1-2, output spl */
+
+int
+filtep (int rlt1, int al1, int rlt2, int al2)
+{
+ long int pl, pl2;
+ pl = 2 * rlt1;
+ pl = (long) al1 *pl;
+ pl2 = 2 * rlt2;
+ pl += (long) al2 *pl2;
+ return ((int) (pl >> 15));
+}
+
+/* quantl - quantize the difference signal in the lower sub-band */
+int
+quantl (int el, int detl)
+{
+ int ril, mil;
+ long int wd, decis;
+
+/* abs of difference signal */
+ wd = abs (el);
+/* determine mil based on decision levels and detl gain */
+ for (mil = 0; mil < 30; mil++)
+ {
+ decis = (decis_levl[mil] * (long) detl) >> 15L;
+ if (wd <= decis)
+ break;
+ }
+/* if mil=30 then wd is less than all decision levels */
+ if (el >= 0)
+ ril = quant26bt_pos[mil];
+ else
+ ril = quant26bt_neg[mil];
+ return (ril);
+}
+
+/* logscl - update log quantizer scale factor in lower sub-band */
+/* note that nbl is passed and returned */
+
+int
+logscl (int il, int nbl)
+{
+ long int wd;
+ wd = ((long) nbl * 127L) >> 7L; /* leak factor 127/128 */
+ nbl = (int) wd + wl_code_table[il >> 2];
+ if (nbl < 0)
+ nbl = 0;
+ if (nbl > 18432)
+ nbl = 18432;
+ return (nbl);
+}
+
+/* scalel: compute quantizer scale factor in lower or upper sub-band*/
+
+int
+scalel (int nbl, int shift_constant)
+{
+ int wd1, wd2, wd3;
+ wd1 = (nbl >> 6) & 31;
+ wd2 = nbl >> 11;
+ wd3 = ilb_table[wd1] >> (shift_constant + 1 - wd2);
+ return (wd3 << 3);
+}
+
+/* upzero - inputs: dlt, dlti[0-5], bli[0-5], outputs: updated bli[0-5] */
+/* also implements delay of bli and update of dlti from dlt */
+
+void
+upzero (int dlt, int *dlti, int *bli)
+{
+ int i, wd2, wd3;
+/*if dlt is zero, then no sum into bli */
+ if (dlt == 0)
+ {
+ for (i = 0; i < 6; i++)
+ {
+ bli[i] = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */
+ }
+ }
+ else
+ {
+ for (i = 0; i < 6; i++)
+ {
+ if ((long) dlt * dlti[i] >= 0)
+ wd2 = 128;
+ else
+ wd2 = -128;
+ wd3 = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */
+ bli[i] = wd2 + wd3;
+ }
+ }
+/* implement delay line for dlt */
+ dlti[5] = dlti[4];
+ dlti[4] = dlti[3];
+ dlti[3] = dlti[2];
+ dlti[2] = dlti[1];
+ dlti[1] = dlti[0];
+ dlti[0] = dlt;
+}
+
+/* uppol2 - update second predictor coefficient (pole section) */
+/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */
+
+int
+uppol2 (int al1, int al2, int plt, int plt1, int plt2)
+{
+ long int wd2, wd4;
+ int apl2;
+ wd2 = 4L * (long) al1;
+ if ((long) plt * plt1 >= 0L)
+ wd2 = -wd2; /* check same sign */
+ wd2 = wd2 >> 7; /* gain of 1/128 */
+ if ((long) plt * plt2 >= 0L)
+ {
+ wd4 = wd2 + 128; /* same sign case */
+ }
+ else
+ {
+ wd4 = wd2 - 128;
+ }
+ apl2 = wd4 + (127L * (long) al2 >> 7L); /* leak factor of 127/128 */
+
+/* apl2 is limited to +-.75 */
+ if (apl2 > 12288)
+ apl2 = 12288;
+ if (apl2 < -12288)
+ apl2 = -12288;
+ return (apl2);
+}
+
+/* uppol1 - update first predictor coefficient (pole section) */
+/* inputs: al1, apl2, plt, plt1. outputs: apl1 */
+
+int
+uppol1 (int al1, int apl2, int plt, int plt1)
+{
+ long int wd2;
+ int wd3, apl1;
+ wd2 = ((long) al1 * 255L) >> 8L; /* leak factor of 255/256 */
+ if ((long) plt * plt1 >= 0L)
+ {
+ apl1 = (int) wd2 + 192; /* same sign case */
+ }
+ else
+ {
+ apl1 = (int) wd2 - 192;
+ }
+/* note: wd3= .9375-.75 is always positive */
+ wd3 = 15360 - apl2; /* limit value */
+ if (apl1 > wd3)
+ apl1 = wd3;
+ if (apl1 < -wd3)
+ apl1 = -wd3;
+ return (apl1);
+}
+
+/* logsch - update log quantizer scale factor in higher sub-band */
+/* note that nbh is passed and returned */
+
+int
+logsch (int ih, int nbh)
+{
+ int wd;
+ wd = ((long) nbh * 127L) >> 7L; /* leak factor 127/128 */
+ nbh = wd + wh_code_table[ih];
+ if (nbh < 0)
+ nbh = 0;
+ if (nbh > 22528)
+ nbh = 22528;
+ return (nbh);
+}
+
+/*
++--------------------------------------------------------------------------+
+| * Test Vectors (added for CHStone) |
+| test_data : input data |
+| test_compressed : expected output data for "encode" |
+| test_result : expected output data for "decode" |
++--------------------------------------------------------------------------+
+*/
+
+#define SIZE 100
+#define IN_END 100
+
+const int test_data[SIZE] = {
+ 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x43, 0x43, 0x43,
+ 0x43, 0x43, 0x43, 0x43, 0x42,
+ 0x42, 0x42, 0x42, 0x42, 0x42,
+ 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x40, 0x40, 0x40, 0x40, 0x40,
+ 0x40, 0x40, 0x40, 0x3f, 0x3f,
+ 0x3f, 0x3f, 0x3f, 0x3e, 0x3e,
+ 0x3e, 0x3e, 0x3e, 0x3e, 0x3d,
+ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d,
+ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,
+ 0x3c, 0x3c, 0x3c, 0x3c, 0x3b,
+ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+ 0x3b, 0x3b, 0x3c, 0x3c, 0x3c,
+ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c
+};
+int compressed[SIZE], result[SIZE];
+const int test_compressed[SIZE] = {
+ 0xfd, 0xde, 0x77, 0xba, 0xf2,
+ 0x90, 0x20, 0xa0, 0xec, 0xed,
+ 0xef, 0xf1, 0xf3, 0xf4, 0xf5,
+ 0xf5, 0xf5, 0xf5, 0xf6, 0xf6,
+ 0xf6, 0xf7, 0xf8, 0xf7, 0xf8,
+ 0xf7, 0xf9, 0xf8, 0xf7, 0xf9,
+ 0xf8, 0xf8, 0xf6, 0xf8, 0xf8,
+ 0xf7, 0xf9, 0xf9, 0xf9, 0xf8,
+ 0xf7, 0xfa, 0xf8, 0xf8, 0xf7,
+ 0xfb, 0xfa, 0xf9, 0xf8, 0xf8
+};
+const int test_result[SIZE] = {
+ 0, 0xffffffff, 0xffffffff, 0, 0,
+ 0xffffffff, 0, 0, 0xffffffff, 0xffffffff,
+ 0, 0, 0x1, 0x1, 0,
+ 0xfffffffe, 0xffffffff, 0xfffffffe, 0, 0xfffffffc,
+ 0x1, 0x1, 0x1, 0xfffffffb, 0x2,
+ 0x2, 0x3, 0xb, 0x14, 0x14,
+ 0x16, 0x18, 0x20, 0x21, 0x26,
+ 0x27, 0x2e, 0x2f, 0x33, 0x32,
+ 0x35, 0x33, 0x36, 0x34, 0x37,
+ 0x34, 0x37, 0x35, 0x38, 0x36,
+ 0x39, 0x38, 0x3b, 0x3a, 0x3f,
+ 0x3f, 0x40, 0x3a, 0x3d, 0x3e,
+ 0x41, 0x3c, 0x3e, 0x3f, 0x42,
+ 0x3e, 0x3b, 0x37, 0x3b, 0x3e,
+ 0x41, 0x3b, 0x3b, 0x3a, 0x3b,
+ 0x36, 0x39, 0x3b, 0x3f, 0x3c,
+ 0x3b, 0x37, 0x3b, 0x3d, 0x41,
+ 0x3d, 0x3e, 0x3c, 0x3e, 0x3b,
+ 0x3a, 0x37, 0x3b, 0x3e, 0x41,
+ 0x3c, 0x3b, 0x39, 0x3a, 0x36
+};
+
+void
+adpcm_main ()
+{
+ int i, j;
+
+/* reset, initialize required memory */
+ reset ();
+
+ j = 10;
+
+ for (i = 0; i < IN_END; i += 2)
+ {
+ compressed[i / 2] = encode (test_data[i], test_data[i + 1]);
+ }
+ for (i = 0; i < IN_END; i += 2)
+ {
+ decode (compressed[i / 2]);
+ result[i] = xout1;
+ result[i + 1] = xout2;
+ }
+}
+
+int
+main ()
+{
+ int i;
+ int main_result;
+
+ main_result = 0;
+ adpcm_main ();
+ for (i = 0; i < IN_END / 2; i++)
+ {
+ if (compressed[i] != test_compressed[i])
+ {
+ main_result += 1;
+ }
+ }
+ for (i = 0; i < IN_END; i++)
+ {
+ if (result[i] != test_result[i])
+ {
+ main_result += 1;
+ }
+ }
+ printf ("%d\n", main_result);
+ return main_result;
+ }
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise1/hint.sh b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/hint.sh
new file mode 100755
index 000000000..3bb28d85f
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/hint.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+abs_script=$(readlink -e $0)
+dir_script=$(dirname $abs_script)
+bambu $dir_script/adpcm.c -O0 --simulate "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/adpcm.c b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/adpcm.c
new file mode 100755
index 000000000..613b1bdb5
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/adpcm.c
@@ -0,0 +1,882 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*************************************************************************/
+/* */
+/* SNU-RT Benchmark Suite for Worst Case Timing Analysis */
+/* ===================================================== */
+/* Collected and Modified by S.-S. Lim */
+/* sslim@archi.snu.ac.kr */
+/* Real-Time Research Group */
+/* Seoul National University */
+/* */
+/* */
+/* < Features > - restrictions for our experimental environment */
+/* */
+/* 1. Completely structured. */
+/* - There are no unconditional jumps. */
+/* - There are no exit from loop bodies. */
+/* (There are no 'break' or 'return' in loop bodies) */
+/* 2. No 'switch' statements. */
+/* 3. No 'do..while' statements. */
+/* 4. Expressions are restricted. */
+/* - There are no multiple expressions joined by 'or', */
+/* 'and' operations. */
+/* 5. No library calls. */
+/* - All the functions needed are implemented in the */
+/* source file. */
+/* */
+/* */
+/*************************************************************************/
+/* */
+/* FILE: adpcm.c */
+/* SOURCE : C Algorithms for Real-Time DSP by P. M. Embree */
+/* */
+/* DESCRIPTION : */
+/* */
+/* CCITT G.722 ADPCM (Adaptive Differential Pulse Code Modulation) */
+/* algorithm. */
+/* 16khz sample rate data is stored in the array test_data[SIZE]. */
+/* Results are stored in the array compressed[SIZE] and result[SIZE].*/
+/* Execution time is determined by the constant SIZE (default value */
+/* is 2000). */
+/* */
+/* REMARK : */
+/* */
+/* EXECUTION TIME : */
+/* */
+/* */
+/*************************************************************************/
+#include
+
+int encode (int, int);
+void decode (int);
+int filtez (int *bpl, int *dlt);
+void upzero (int dlt, int *dlti, int *bli);
+int filtep (int rlt1, int al1, int rlt2, int al2);
+int quantl (int el, int detl);
+int logscl (int il, int nbl);
+int scalel (int nbl, int shift_constant);
+int uppol2 (int al1, int al2, int plt, int plt1, int plt2);
+int uppol1 (int al1, int apl2, int plt, int plt1);
+int logsch (int ih, int nbh);
+void reset ();
+
+/* G722 C code */
+
+/* variables for transimit quadrature mirror filter here */
+int tqmf[24];
+
+/* QMF filter coefficients:
+scaled by a factor of 4 compared to G722 CCITT recomendation */
+const int h[24] = {
+ 12, -44, -44, 212, 48, -624, 128, 1448,
+ -840, -3220, 3804, 15504, 15504, 3804, -3220, -840,
+ 1448, 128, -624, 48, 212, -44, -44, 12
+};
+
+int xl, xh;
+
+/* variables for receive quadrature mirror filter here */
+int accumc[11], accumd[11];
+
+/* outputs of decode() */
+int xout1, xout2;
+
+int xs, xd;
+
+/* variables for encoder (hi and lo) here */
+
+int il, szl, spl, sl, el;
+
+const int qq4_code4_table[16] = {
+ 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200,
+ 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0
+};
+
+
+const int qq6_code6_table[64] = {
+ -136, -136, -136, -136, -24808, -21904, -19008, -16704,
+ -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856,
+ -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576,
+ -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728,
+ 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192,
+ 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456,
+ 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032,
+ 1688, 1360, 1040, 728, 432, 136, -432, -136
+};
+
+int delay_bpl[6];
+
+int delay_dltx[6];
+
+const int wl_code_table[16] = {
+ -60, 3042, 1198, 538, 334, 172, 58, -30,
+ 3042, 1198, 538, 334, 172, 58, -30, -60
+};
+
+const int ilb_table[32] = {
+ 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383,
+ 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834,
+ 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371,
+ 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008
+};
+
+int nbl; /* delay line */
+int al1, al2;
+int plt, plt1, plt2;
+int dlt;
+int rlt, rlt1, rlt2;
+
+/* decision levels - pre-multiplied by 8, 0 to indicate end */
+const int decis_levl[30] = {
+ 280, 576, 880, 1200, 1520, 1864, 2208, 2584,
+ 2960, 3376, 3784, 4240, 4696, 5200, 5712, 6288,
+ 6864, 7520, 8184, 8968, 9752, 10712, 11664, 12896,
+ 14120, 15840, 17560, 20456, 23352, 32767
+};
+
+int detl;
+
+/* quantization table 31 long to make quantl look-up easier,
+last entry is for mil=30 case when wd is max */
+const int quant26bt_pos[31] = {
+ 61, 60, 59, 58, 57, 56, 55, 54,
+ 53, 52, 51, 50, 49, 48, 47, 46,
+ 45, 44, 43, 42, 41, 40, 39, 38,
+ 37, 36, 35, 34, 33, 32, 32
+};
+
+/* quantization table 31 long to make quantl look-up easier,
+last entry is for mil=30 case when wd is max */
+const int quant26bt_neg[31] = {
+ 63, 62, 31, 30, 29, 28, 27, 26,
+ 25, 24, 23, 22, 21, 20, 19, 18,
+ 17, 16, 15, 14, 13, 12, 11, 10,
+ 9, 8, 7, 6, 5, 4, 4
+};
+
+
+int deth;
+int sh; /* this comes from adaptive predictor */
+int eh;
+
+const int qq2_code2_table[4] = {
+ -7408, -1616, 7408, 1616
+};
+
+const int wh_code_table[4] = {
+ 798, -214, 798, -214
+};
+
+
+int dh, ih;
+int nbh, szh;
+int sph, ph, yh, rh;
+
+int delay_dhx[6];
+
+int delay_bph[6];
+
+int ah1, ah2;
+int ph1, ph2;
+int rh1, rh2;
+
+/* variables for decoder here */
+int ilr, rl;
+int dec_deth, dec_detl, dec_dlt;
+
+int dec_del_bpl[6];
+
+int dec_del_dltx[6];
+
+int dec_plt, dec_plt1, dec_plt2;
+int dec_szl, dec_spl, dec_sl;
+int dec_rlt1, dec_rlt2, dec_rlt;
+int dec_al1, dec_al2;
+int dl;
+int dec_nbl, dec_dh, dec_nbh;
+
+/* variables used in filtez */
+int dec_del_bph[6];
+
+int dec_del_dhx[6];
+
+int dec_szh;
+/* variables used in filtep */
+int dec_rh1, dec_rh2;
+int dec_ah1, dec_ah2;
+int dec_ph, dec_sph;
+
+int dec_sh;
+
+int dec_ph1, dec_ph2;
+
+/* G722 encode function two ints in, one 8 bit output */
+
+/* put input samples in xin1 = first value, xin2 = second value */
+/* returns il and ih stored together */
+
+int
+abs (int n)
+{
+ int m;
+
+ if (n >= 0)
+ m = n;
+ else
+ m = -n;
+ return m;
+}
+
+int
+encode (int xin1, int xin2)
+{
+ int i;
+ const int *h_ptr;
+ int *tqmf_ptr, *tqmf_ptr1;
+ long int xa, xb;
+ int decis;
+
+/* transmit quadrature mirror filters implemented here */
+ h_ptr = h;
+ tqmf_ptr = tqmf;
+ xa = (long) (*tqmf_ptr++) * (*h_ptr++);
+ xb = (long) (*tqmf_ptr++) * (*h_ptr++);
+/* main multiply accumulate loop for samples and coefficients */
+ for (i = 0; i < 10; i++)
+ {
+ xa += (long) (*tqmf_ptr++) * (*h_ptr++);
+ xb += (long) (*tqmf_ptr++) * (*h_ptr++);
+ }
+/* final mult/accumulate */
+ xa += (long) (*tqmf_ptr++) * (*h_ptr++);
+ xb += (long) (*tqmf_ptr) * (*h_ptr++);
+
+/* update delay line tqmf */
+ tqmf_ptr1 = tqmf_ptr - 2;
+ for (i = 0; i < 22; i++)
+ *tqmf_ptr-- = *tqmf_ptr1--;
+ *tqmf_ptr-- = xin1;
+ *tqmf_ptr = xin2;
+
+/* scale outputs */
+ xl = (xa + xb) >> 15;
+ xh = (xa - xb) >> 15;
+
+/* end of quadrature mirror filter code */
+
+/* starting with lower sub band encoder */
+
+/* filtez - compute predictor output section - zero section */
+ szl = filtez (delay_bpl, delay_dltx);
+
+/* filtep - compute predictor output signal (pole section) */
+ spl = filtep (rlt1, al1, rlt2, al2);
+
+/* compute the predictor output value in the lower sub_band encoder */
+ sl = szl + spl;
+ el = xl - sl;
+
+/* quantl: quantize the difference signal */
+ il = quantl (el, detl);
+
+/* computes quantized difference signal */
+/* for invqbl, truncate by 2 lsbs, so mode = 3 */
+ dlt = ((long) detl * qq4_code4_table[il >> 2]) >> 15;
+
+/* logscl: updates logarithmic quant. scale factor in low sub band */
+ nbl = logscl (il, nbl);
+
+/* scalel: compute the quantizer scale factor in the lower sub band */
+/* calling parameters nbl and 8 (constant such that scalel can be scaleh) */
+ detl = scalel (nbl, 8);
+
+/* parrec - simple addition to compute recontructed signal for adaptive pred */
+ plt = dlt + szl;
+
+/* upzero: update zero section predictor coefficients (sixth order)*/
+/* calling parameters: dlt, dlt1, dlt2, ..., dlt6 from dlt */
+/* bpli (linear_buffer in which all six values are delayed */
+/* return params: updated bpli, delayed dltx */
+ upzero (dlt, delay_dltx, delay_bpl);
+
+/* uppol2- update second predictor coefficient apl2 and delay it as al2 */
+/* calling parameters: al1, al2, plt, plt1, plt2 */
+ al2 = uppol2 (al1, al2, plt, plt1, plt2);
+
+/* uppol1 :update first predictor coefficient apl1 and delay it as al1 */
+/* calling parameters: al1, apl2, plt, plt1 */
+ al1 = uppol1 (al1, al2, plt, plt1);
+
+/* recons : compute recontructed signal for adaptive predictor */
+ rlt = sl + dlt;
+
+/* done with lower sub_band encoder; now implement delays for next time*/
+ rlt2 = rlt1;
+ rlt1 = rlt;
+ plt2 = plt1;
+ plt1 = plt;
+
+/* high band encode */
+
+ szh = filtez (delay_bph, delay_dhx);
+
+ sph = filtep (rh1, ah1, rh2, ah2);
+
+/* predic: sh = sph + szh */
+ sh = sph + szh;
+/* subtra: eh = xh - sh */
+ eh = xh - sh;
+
+/* quanth - quantization of difference signal for higher sub-band */
+/* quanth: in-place for speed params: eh, deth (has init. value) */
+ if (eh >= 0)
+ {
+ ih = 3; /* 2,3 are pos codes */
+ }
+ else
+ {
+ ih = 1; /* 0,1 are neg codes */
+ }
+ decis = (564L * (long) deth) >> 12L;
+ if (abs (eh) > decis)
+ ih--; /* mih = 2 case */
+
+/* compute the quantized difference signal, higher sub-band*/
+ dh = ((long) deth * qq2_code2_table[ih]) >> 15L;
+
+/* logsch: update logarithmic quantizer scale factor in hi sub-band*/
+ nbh = logsch (ih, nbh);
+
+/* note : scalel and scaleh use same code, different parameters */
+ deth = scalel (nbh, 10);
+
+/* parrec - add pole predictor output to quantized diff. signal */
+ ph = dh + szh;
+
+/* upzero: update zero section predictor coefficients (sixth order) */
+/* calling parameters: dh, dhi, bphi */
+/* return params: updated bphi, delayed dhx */
+ upzero (dh, delay_dhx, delay_bph);
+
+/* uppol2: update second predictor coef aph2 and delay as ah2 */
+/* calling params: ah1, ah2, ph, ph1, ph2 */
+ ah2 = uppol2 (ah1, ah2, ph, ph1, ph2);
+
+/* uppol1: update first predictor coef. aph2 and delay it as ah1 */
+ ah1 = uppol1 (ah1, ah2, ph, ph1);
+
+/* recons for higher sub-band */
+ yh = sh + dh;
+
+/* done with higher sub-band encoder, now Delay for next time */
+ rh2 = rh1;
+ rh1 = yh;
+ ph2 = ph1;
+ ph1 = ph;
+
+/* multiplex ih and il to get signals together */
+ return (il | (ih << 6));
+}
+
+/* decode function, result in xout1 and xout2 */
+
+void
+decode (int input)
+{
+ int i;
+ long int xa1, xa2; /* qmf accumulators */
+ const int *h_ptr;
+ int *ac_ptr, *ac_ptr1, *ad_ptr, *ad_ptr1;
+
+/* split transmitted word from input into ilr and ih */
+ ilr = input & 0x3f;
+ ih = input >> 6;
+
+/* LOWER SUB_BAND DECODER */
+
+/* filtez: compute predictor output for zero section */
+ dec_szl = filtez (dec_del_bpl, dec_del_dltx);
+
+/* filtep: compute predictor output signal for pole section */
+ dec_spl = filtep (dec_rlt1, dec_al1, dec_rlt2, dec_al2);
+
+ dec_sl = dec_spl + dec_szl;
+
+/* compute quantized difference signal for adaptive predic */
+ dec_dlt = ((long) dec_detl * qq4_code4_table[ilr >> 2]) >> 15;
+
+/* compute quantized difference signal for decoder output */
+ dl = ((long) dec_detl * qq6_code6_table[il]) >> 15;
+
+ rl = dl + dec_sl;
+
+/* logscl: quantizer scale factor adaptation in the lower sub-band */
+ dec_nbl = logscl (ilr, dec_nbl);
+
+/* scalel: computes quantizer scale factor in the lower sub band */
+ dec_detl = scalel (dec_nbl, 8);
+
+/* parrec - add pole predictor output to quantized diff. signal */
+/* for partially reconstructed signal */
+ dec_plt = dec_dlt + dec_szl;
+
+/* upzero: update zero section predictor coefficients */
+ upzero (dec_dlt, dec_del_dltx, dec_del_bpl);
+
+/* uppol2: update second predictor coefficient apl2 and delay it as al2 */
+ dec_al2 = uppol2 (dec_al1, dec_al2, dec_plt, dec_plt1, dec_plt2);
+
+/* uppol1: update first predictor coef. (pole setion) */
+ dec_al1 = uppol1 (dec_al1, dec_al2, dec_plt, dec_plt1);
+
+/* recons : compute recontructed signal for adaptive predictor */
+ dec_rlt = dec_sl + dec_dlt;
+
+/* done with lower sub band decoder, implement delays for next time */
+ dec_rlt2 = dec_rlt1;
+ dec_rlt1 = dec_rlt;
+ dec_plt2 = dec_plt1;
+ dec_plt1 = dec_plt;
+
+/* HIGH SUB-BAND DECODER */
+
+/* filtez: compute predictor output for zero section */
+ dec_szh = filtez (dec_del_bph, dec_del_dhx);
+
+/* filtep: compute predictor output signal for pole section */
+ dec_sph = filtep (dec_rh1, dec_ah1, dec_rh2, dec_ah2);
+
+/* predic:compute the predictor output value in the higher sub_band decoder */
+ dec_sh = dec_sph + dec_szh;
+
+/* in-place compute the quantized difference signal */
+ dec_dh = ((long) dec_deth * qq2_code2_table[ih]) >> 15L;
+
+/* logsch: update logarithmic quantizer scale factor in hi sub band */
+ dec_nbh = logsch (ih, dec_nbh);
+
+/* scalel: compute the quantizer scale factor in the higher sub band */
+ dec_deth = scalel (dec_nbh, 10);
+
+/* parrec: compute partially recontructed signal */
+ dec_ph = dec_dh + dec_szh;
+
+/* upzero: update zero section predictor coefficients */
+ upzero (dec_dh, dec_del_dhx, dec_del_bph);
+
+/* uppol2: update second predictor coefficient aph2 and delay it as ah2 */
+ dec_ah2 = uppol2 (dec_ah1, dec_ah2, dec_ph, dec_ph1, dec_ph2);
+
+/* uppol1: update first predictor coef. (pole setion) */
+ dec_ah1 = uppol1 (dec_ah1, dec_ah2, dec_ph, dec_ph1);
+
+/* recons : compute recontructed signal for adaptive predictor */
+ rh = dec_sh + dec_dh;
+
+/* done with high band decode, implementing delays for next time here */
+ dec_rh2 = dec_rh1;
+ dec_rh1 = rh;
+ dec_ph2 = dec_ph1;
+ dec_ph1 = dec_ph;
+
+/* end of higher sub_band decoder */
+
+/* end with receive quadrature mirror filters */
+ xd = rl - rh;
+ xs = rl + rh;
+
+/* receive quadrature mirror filters implemented here */
+ h_ptr = h;
+ ac_ptr = accumc;
+ ad_ptr = accumd;
+ xa1 = (long) xd *(*h_ptr++);
+ xa2 = (long) xs *(*h_ptr++);
+/* main multiply accumulate loop for samples and coefficients */
+ for (i = 0; i < 10; i++)
+ {
+ xa1 += (long) (*ac_ptr++) * (*h_ptr++);
+ xa2 += (long) (*ad_ptr++) * (*h_ptr++);
+ }
+/* final mult/accumulate */
+ xa1 += (long) (*ac_ptr) * (*h_ptr++);
+ xa2 += (long) (*ad_ptr) * (*h_ptr++);
+
+/* scale by 2^14 */
+ xout1 = xa1 >> 14;
+ xout2 = xa2 >> 14;
+
+/* update delay lines */
+ ac_ptr1 = ac_ptr - 1;
+ ad_ptr1 = ad_ptr - 1;
+ for (i = 0; i < 10; i++)
+ {
+ *ac_ptr-- = *ac_ptr1--;
+ *ad_ptr-- = *ad_ptr1--;
+ }
+ *ac_ptr = xd;
+ *ad_ptr = xs;
+}
+
+/* clear all storage locations */
+
+void
+reset ()
+{
+ int i;
+
+ detl = dec_detl = 32; /* reset to min scale factor */
+ deth = dec_deth = 8;
+ nbl = al1 = al2 = plt1 = plt2 = rlt1 = rlt2 = 0;
+ nbh = ah1 = ah2 = ph1 = ph2 = rh1 = rh2 = 0;
+ dec_nbl = dec_al1 = dec_al2 = dec_plt1 = dec_plt2 = dec_rlt1 = dec_rlt2 = 0;
+ dec_nbh = dec_ah1 = dec_ah2 = dec_ph1 = dec_ph2 = dec_rh1 = dec_rh2 = 0;
+
+ for (i = 0; i < 6; i++)
+ {
+ delay_dltx[i] = 0;
+ delay_dhx[i] = 0;
+ dec_del_dltx[i] = 0;
+ dec_del_dhx[i] = 0;
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ delay_bpl[i] = 0;
+ delay_bph[i] = 0;
+ dec_del_bpl[i] = 0;
+ dec_del_bph[i] = 0;
+ }
+
+ for (i = 0; i < 24; i++)
+ tqmf[i] = 0; // i<23
+
+ for (i = 0; i < 11; i++)
+ {
+ accumc[i] = 0;
+ accumd[i] = 0;
+ }
+}
+
+/* filtez - compute predictor output signal (zero section) */
+/* input: bpl1-6 and dlt1-6, output: szl */
+
+int
+filtez (int *bpl, int *dlt)
+{
+ int i;
+ long int zl;
+ zl = (long) (*bpl++) * (*dlt++);
+ for (i = 1; i < 6; i++)
+ zl += (long) (*bpl++) * (*dlt++);
+
+ return ((int) (zl >> 14)); /* x2 here */
+}
+
+/* filtep - compute predictor output signal (pole section) */
+/* input rlt1-2 and al1-2, output spl */
+
+int
+filtep (int rlt1, int al1, int rlt2, int al2)
+{
+ long int pl, pl2;
+ pl = 2 * rlt1;
+ pl = (long) al1 *pl;
+ pl2 = 2 * rlt2;
+ pl += (long) al2 *pl2;
+ return ((int) (pl >> 15));
+}
+
+/* quantl - quantize the difference signal in the lower sub-band */
+int
+quantl (int el, int detl)
+{
+ int ril, mil;
+ long int wd, decis;
+
+/* abs of difference signal */
+ wd = abs (el);
+/* determine mil based on decision levels and detl gain */
+ for (mil = 0; mil < 30; mil++)
+ {
+ decis = (decis_levl[mil] * (long) detl) >> 15L;
+ if (wd <= decis)
+ break;
+ }
+/* if mil=30 then wd is less than all decision levels */
+ if (el >= 0)
+ ril = quant26bt_pos[mil];
+ else
+ ril = quant26bt_neg[mil];
+ return (ril);
+}
+
+/* logscl - update log quantizer scale factor in lower sub-band */
+/* note that nbl is passed and returned */
+
+int
+logscl (int il, int nbl)
+{
+ long int wd;
+ wd = ((long) nbl * 127L) >> 7L; /* leak factor 127/128 */
+ nbl = (int) wd + wl_code_table[il >> 2];
+ if (nbl < 0)
+ nbl = 0;
+ if (nbl > 18432)
+ nbl = 18432;
+ return (nbl);
+}
+
+/* scalel: compute quantizer scale factor in lower or upper sub-band*/
+
+int
+scalel (int nbl, int shift_constant)
+{
+ int wd1, wd2, wd3;
+ wd1 = (nbl >> 6) & 31;
+ wd2 = nbl >> 11;
+ wd3 = ilb_table[wd1] >> (shift_constant + 1 - wd2);
+ return (wd3 << 3);
+}
+
+/* upzero - inputs: dlt, dlti[0-5], bli[0-5], outputs: updated bli[0-5] */
+/* also implements delay of bli and update of dlti from dlt */
+
+void
+upzero (int dlt, int *dlti, int *bli)
+{
+ int i, wd2, wd3;
+/*if dlt is zero, then no sum into bli */
+ if (dlt == 0)
+ {
+ for (i = 0; i < 6; i++)
+ {
+ bli[i] = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */
+ }
+ }
+ else
+ {
+ for (i = 0; i < 6; i++)
+ {
+ if ((long) dlt * dlti[i] >= 0)
+ wd2 = 128;
+ else
+ wd2 = -128;
+ wd3 = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */
+ bli[i] = wd2 + wd3;
+ }
+ }
+/* implement delay line for dlt */
+ dlti[5] = dlti[4];
+ dlti[4] = dlti[3];
+ dlti[3] = dlti[2];
+ dlti[2] = dlti[1];
+ dlti[1] = dlti[0];
+ dlti[0] = dlt;
+}
+
+/* uppol2 - update second predictor coefficient (pole section) */
+/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */
+
+int
+uppol2 (int al1, int al2, int plt, int plt1, int plt2)
+{
+ long int wd2, wd4;
+ int apl2;
+ wd2 = 4L * (long) al1;
+ if ((long) plt * plt1 >= 0L)
+ wd2 = -wd2; /* check same sign */
+ wd2 = wd2 >> 7; /* gain of 1/128 */
+ if ((long) plt * plt2 >= 0L)
+ {
+ wd4 = wd2 + 128; /* same sign case */
+ }
+ else
+ {
+ wd4 = wd2 - 128;
+ }
+ apl2 = wd4 + (127L * (long) al2 >> 7L); /* leak factor of 127/128 */
+
+/* apl2 is limited to +-.75 */
+ if (apl2 > 12288)
+ apl2 = 12288;
+ if (apl2 < -12288)
+ apl2 = -12288;
+ return (apl2);
+}
+
+/* uppol1 - update first predictor coefficient (pole section) */
+/* inputs: al1, apl2, plt, plt1. outputs: apl1 */
+
+int
+uppol1 (int al1, int apl2, int plt, int plt1)
+{
+ long int wd2;
+ int wd3, apl1;
+ wd2 = ((long) al1 * 255L) >> 8L; /* leak factor of 255/256 */
+ if ((long) plt * plt1 >= 0L)
+ {
+ apl1 = (int) wd2 + 192; /* same sign case */
+ }
+ else
+ {
+ apl1 = (int) wd2 - 192;
+ }
+/* note: wd3= .9375-.75 is always positive */
+ wd3 = 15360 - apl2; /* limit value */
+ if (apl1 > wd3)
+ apl1 = wd3;
+ if (apl1 < -wd3)
+ apl1 = -wd3;
+ return (apl1);
+}
+
+/* logsch - update log quantizer scale factor in higher sub-band */
+/* note that nbh is passed and returned */
+
+int
+logsch (int ih, int nbh)
+{
+ int wd;
+ wd = ((long) nbh * 127L) >> 7L; /* leak factor 127/128 */
+ nbh = wd + wh_code_table[ih];
+ if (nbh < 0)
+ nbh = 0;
+ if (nbh > 22528)
+ nbh = 22528;
+ return (nbh);
+}
+
+/*
++--------------------------------------------------------------------------+
+| * Test Vectors (added for CHStone) |
+| test_data : input data |
+| test_compressed : expected output data for "encode" |
+| test_result : expected output data for "decode" |
++--------------------------------------------------------------------------+
+*/
+
+#define SIZE 100
+#define IN_END 100
+
+const int test_data[SIZE] = {
+ 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x43, 0x43, 0x43,
+ 0x43, 0x43, 0x43, 0x43, 0x42,
+ 0x42, 0x42, 0x42, 0x42, 0x42,
+ 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x40, 0x40, 0x40, 0x40, 0x40,
+ 0x40, 0x40, 0x40, 0x3f, 0x3f,
+ 0x3f, 0x3f, 0x3f, 0x3e, 0x3e,
+ 0x3e, 0x3e, 0x3e, 0x3e, 0x3d,
+ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d,
+ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,
+ 0x3c, 0x3c, 0x3c, 0x3c, 0x3b,
+ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+ 0x3b, 0x3b, 0x3c, 0x3c, 0x3c,
+ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c
+};
+int compressed[SIZE], result[SIZE];
+const int test_compressed[SIZE] = {
+ 0xfd, 0xde, 0x77, 0xba, 0xf2,
+ 0x90, 0x20, 0xa0, 0xec, 0xed,
+ 0xef, 0xf1, 0xf3, 0xf4, 0xf5,
+ 0xf5, 0xf5, 0xf5, 0xf6, 0xf6,
+ 0xf6, 0xf7, 0xf8, 0xf7, 0xf8,
+ 0xf7, 0xf9, 0xf8, 0xf7, 0xf9,
+ 0xf8, 0xf8, 0xf6, 0xf8, 0xf8,
+ 0xf7, 0xf9, 0xf9, 0xf9, 0xf8,
+ 0xf7, 0xfa, 0xf8, 0xf8, 0xf7,
+ 0xfb, 0xfa, 0xf9, 0xf8, 0xf8
+};
+const int test_result[SIZE] = {
+ 0, 0xffffffff, 0xffffffff, 0, 0,
+ 0xffffffff, 0, 0, 0xffffffff, 0xffffffff,
+ 0, 0, 0x1, 0x1, 0,
+ 0xfffffffe, 0xffffffff, 0xfffffffe, 0, 0xfffffffc,
+ 0x1, 0x1, 0x1, 0xfffffffb, 0x2,
+ 0x2, 0x3, 0xb, 0x14, 0x14,
+ 0x16, 0x18, 0x20, 0x21, 0x26,
+ 0x27, 0x2e, 0x2f, 0x33, 0x32,
+ 0x35, 0x33, 0x36, 0x34, 0x37,
+ 0x34, 0x37, 0x35, 0x38, 0x36,
+ 0x39, 0x38, 0x3b, 0x3a, 0x3f,
+ 0x3f, 0x40, 0x3a, 0x3d, 0x3e,
+ 0x41, 0x3c, 0x3e, 0x3f, 0x42,
+ 0x3e, 0x3b, 0x37, 0x3b, 0x3e,
+ 0x41, 0x3b, 0x3b, 0x3a, 0x3b,
+ 0x36, 0x39, 0x3b, 0x3f, 0x3c,
+ 0x3b, 0x37, 0x3b, 0x3d, 0x41,
+ 0x3d, 0x3e, 0x3c, 0x3e, 0x3b,
+ 0x3a, 0x37, 0x3b, 0x3e, 0x41,
+ 0x3c, 0x3b, 0x39, 0x3a, 0x36
+};
+
+void
+adpcm_main ()
+{
+ int i, j;
+
+/* reset, initialize required memory */
+ reset ();
+
+ j = 10;
+
+ for (i = 0; i < IN_END; i += 2)
+ {
+ compressed[i / 2] = encode (test_data[i], test_data[i + 1]);
+ }
+ for (i = 0; i < IN_END; i += 2)
+ {
+ decode (compressed[i / 2]);
+ result[i] = xout1;
+ result[i + 1] = xout2;
+ }
+}
+
+int
+main ()
+{
+ int i;
+ int main_result;
+
+ main_result = 0;
+ adpcm_main ();
+ for (i = 0; i < IN_END / 2; i++)
+ {
+ if (compressed[i] != test_compressed[i])
+ {
+ main_result += 1;
+ }
+ }
+ for (i = 0; i < IN_END; i++)
+ {
+ if (result[i] != test_result[i])
+ {
+ main_result += 1;
+ }
+ }
+ printf ("%d\n", main_result);
+ return main_result;
+ }
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/adpcm.csv b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/adpcm.csv
new file mode 100644
index 000000000..7139cb2f5
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/adpcm.csv
@@ -0,0 +1,25 @@
+Benchmark, CYCLES, HLS_execution_time,
+CLANG11:adpcm_O0:main_0, 23643,43.0299999999999999989,
+CLANG11:adpcm_O1:main_0, 23643,43.8199999999999999997,
+CLANG11:adpcm_O2:main_0, 9651,61.9900000000000000015,
+CLANG11:adpcm_O3:main_0, 8855,70.1500000000000000014,
+CLANG11:adpcm_Os:main_0, 21593,49.4599999999999999992,
+CLANG6:adpcm_O0:main_0, 23393,44.1500000000000000014,
+CLANG6:adpcm_O1:main_0, 23393,42.9500000000000000007,
+CLANG6:adpcm_O2:main_0, 17392,62.4700000000000000011,
+CLANG6:adpcm_O3:main_0, 17392,62.5200000000000000004,
+CLANG6:adpcm_Os:main_0, 21543,54.5099999999999999985,
+GCC49:adpcm_O0:main_0, 33429,23.0499999999999999993,
+GCC49:adpcm_O1:main_0, 24547,18.7199999999999999994,
+GCC49:adpcm_O2:main_0, 24043,43.2599999999999999985,
+GCC49:adpcm_O3:main_0, 10429,76.4499999999999999972,
+GCC49:adpcm_O3_inline:main_0, 7503,99.5800000000000000017,
+GCC49:adpcm_O3_vectorize:main_0, 6995,49.3100000000000000012,
+GCC49:adpcm_Os:main_0, 24847,25.2099999999999999992,
+GCC7:adpcm_O0:main_0, 34015,15.8599999999999999997,
+GCC7:adpcm_O1:main_0, 24933,16.9500000000000000007,
+GCC7:adpcm_O2:main_0, 22526,40.7200000000000000011,
+GCC7:adpcm_O3:main_0, 8345,51.0699999999999999997,
+GCC7:adpcm_O3_inline:main_0, 5441,59.3400000000000000001,
+GCC7:adpcm_O3_vectorize:main_0, 8765,32.6100000000000000006,
+GCC7:adpcm_Os:main_0, 25033,27.2199999999999999994,
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/adpcm_sdc.csv b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/adpcm_sdc.csv
new file mode 100644
index 000000000..fdf820d8c
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/adpcm_sdc.csv
@@ -0,0 +1,28 @@
+Benchmark, CYCLES, HLS_execution_time,
+CLANG11:adpcm_O0:main_0, 23693,92.9400000000000000022,
+CLANG11:adpcm_O1:main_0, 23693,91.7799999999999999989,
+CLANG11:adpcm_O2:main_0, 10071,147.809999999999999998,
+CLANG11:adpcm_O3:main_0, 8719,183.690000000000000002,
+CLANG11:adpcm_O3_inline:main_0, 8719,183.960000000000000006,
+CLANG11:adpcm_Os:main_0, 22063,97.5100000000000000019,
+CLANG6:adpcm_O0:main_0, 23443,91.2099999999999999992,
+CLANG6:adpcm_O1:main_0, 23443,93.6999999999999999972,
+CLANG6:adpcm_O2:main_0, 17804,124.870000000000000002,
+CLANG6:adpcm_O3:main_0, 17804,129.610000000000000001,
+CLANG6:adpcm_O3_inline:main_0, 17804,127.849999999999999999,
+CLANG6:adpcm_O3_vectorize:main_0, 17804,126.870000000000000002,
+CLANG6:adpcm_Os:main_0, 22013,105.059999999999999998,
+GCC49:adpcm_O0:main_0, 33479,64.3799999999999999975,
+GCC49:adpcm_O1:main_0, 24297,57.0900000000000000001,
+GCC49:adpcm_O2:main_0, 22863,83.5299999999999999989,
+GCC49:adpcm_O3:main_0, 9149,175.929999999999999993,
+GCC49:adpcm_O3_inline:main_0, 5356,210.619999999999999996,
+GCC49:adpcm_O3_vectorize:main_0, 6135,110.809999999999999998,
+GCC49:adpcm_Os:main_0, 24397,68.4499999999999999972,
+GCC7:adpcm_O0:main_0, 32979,46.5,
+GCC7:adpcm_O1:main_0, 24297,47.0299999999999999989,
+GCC7:adpcm_O2:main_0, 21513,80.2399999999999999981,
+GCC7:adpcm_O3:main_0, 7653,152.220000000000000001,
+GCC7:adpcm_O3_inline:main_0, 5003,136.25,
+GCC7:adpcm_O3_vectorize:main_0, 8235,97.4300000000000000003,
+GCC7:adpcm_Os:main_0, 24397,58.2000000000000000007,
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/list b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/list
new file mode 100644
index 000000000..9a26f25da
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/list
@@ -0,0 +1,7 @@
+adpcm.c --benchmark-name=adpcm_O0 -O0
+adpcm.c --benchmark-name=adpcm_O1 -O1
+adpcm.c --benchmark-name=adpcm_O2 -O2
+adpcm.c --benchmark-name=adpcm_O3 -O3
+adpcm.c --benchmark-name=adpcm_O3_inline -O3 -finline-limit=1000000
+adpcm.c --benchmark-name=adpcm_O3_vectorize -O3 -ftree-vectorize
+adpcm.c --benchmark-name=adpcm_Os -Os
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/synthesize.sh b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/synthesize.sh
new file mode 100755
index 000000000..8d9bc09cc
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise1/solution/synthesize.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+abs_script=$(readlink -e $0)
+dir_script=$(dirname $abs_script)
+$dir_script/../../test_panda.py --tool=bambu --bambu=bambu --spider=spider \
+ --args="--configuration-name=GCC49 --compiler=I386_GCC49" \
+ --args="--configuration-name=GCC7 --compiler=I386_GCC7" \
+ --args="--configuration-name=CLANG6 --compiler=I386_CLANG6" \
+ --args="--configuration-name=CLANG11 --compiler=I386_CLANG11" \
+ -c=--simulate -b$dir_script -l$dir_script/list "$@"
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/README b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/README
new file mode 100644
index 000000000..cb138e2fb
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/README
@@ -0,0 +1 @@
+Evaluate the effects on the number of cycles in using different integer division implementations on the dfdiv algorithm targeting Zynq and 66MHz
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/SPARC-GCC.h b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/SPARC-GCC.h
new file mode 100755
index 000000000..523e274f6
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/SPARC-GCC.h
@@ -0,0 +1,88 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
+Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Each of the following `typedef's defines the most convenient type that holds
+| integers of at least as many bits as specified. For example, `uint8' should
+| be the most convenient type that can hold unsigned integers of as many as
+| 8 bits. The `flag' type must be able to hold either a 0 or 1. For most
+| implementations of C, `flag', `uint8', and `int8' should all be `typedef'ed
+| to the same as `int'.
+*----------------------------------------------------------------------------*/
+typedef int flag;
+typedef int int8;
+typedef int int16;
+
+/*----------------------------------------------------------------------------
+| Each of the following `typedef's defines a type that holds integers
+| of _exactly_ the number of bits specified. For instance, for most
+| implementation of C, `bits16' and `sbits16' should be `typedef'ed to
+| `unsigned short int' and `signed short int' (or `short int'), respectively.
+*----------------------------------------------------------------------------*/
+typedef unsigned short int bits16;
+typedef unsigned int bits32;
+typedef unsigned long long int bits64;
+typedef signed long long int sbits64;
+
+/*----------------------------------------------------------------------------
+| The `LIT64' macro takes as its argument a textual integer literal and
+| if necessary ``marks'' the literal as having a 64-bit integer type.
+| For example, the GNU C Compiler (`gcc') requires that 64-bit literals be
+| appended with the letters `LL' standing for `long long', which is `gcc's
+| name for the 64-bit integer type. Some compilers may allow `LIT64' to be
+| defined as the identity macro: `#define LIT64( a ) a'.
+*----------------------------------------------------------------------------*/
+#define LIT64( a ) a##LL
+
+/*----------------------------------------------------------------------------
+| The macro `INLINE' can be used before functions that should be inlined. If
+| a compiler does not support explicit inlining, this macro should be defined
+| to be `static'.
+*----------------------------------------------------------------------------*/
+#define INLINE
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/dfdiv.c b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/dfdiv.c
new file mode 100755
index 000000000..7fd9823bd
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/dfdiv.c
@@ -0,0 +1,159 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*
+ * Copyright (C) 2008
+ * Y. Hara, H. Tomiyama, S. Honda, H. Takada and K. Ishii
+ * Nagoya University, Japan
+ * All rights reserved.
+ *
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The authors disclaims any and all warranties,
+ * whether express, implied, or statuary, including any implied warranties or
+ * merchantability or of fitness for a particular purpose. In no event shall the
+ * copyright-holder be liable for any incidental, punitive, or consequential damages
+ * of any kind whatsoever arising from the use of these programs. This disclaimer
+ * of warranty extends to the user of these programs and user's customers, employees,
+ * agents, transferees, successors, and assigns.
+ *
+ */
+#include
+#include "softfloat.c"
+
+double
+ullong_to_double (unsigned long long x)
+{
+ union
+ {
+ double d;
+ unsigned long long ll;
+ } t;
+
+ t.ll = x;
+ return t.d;
+}
+
+/*
++--------------------------------------------------------------------------+
+| * Test Vectors (added for CHStone) |
+| a_input, b_input : input data |
+| z_output : expected output data |
++--------------------------------------------------------------------------+
+*/
+#define N 22
+
+const float64 a_input[N] = {
+ 0x7FFF000000000000ULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x8000000000000000ULL, /* -0.0 */
+ 0x4008000000000000ULL, /* 3.0 */
+ 0xC008000000000000ULL, /* -3.0 */
+ 0x4008000000000000ULL, /* 3.0 */
+ 0xC008000000000000ULL, /* -3.0 */
+ 0x4000000000000000ULL, /* 2.0 */
+ 0xC000000000000000ULL, /* -2.0 */
+ 0x4000000000000000ULL, /* 2.0 */
+ 0xC000000000000000ULL, /* -2.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0xBFF0000000000000ULL, /* -1.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0xBFF0000000000000ULL /* -1.0 */
+};
+
+const float64 b_input[N] = {
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x7FF8000000000000ULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x7FF8000000000000ULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x4000000000000000ULL, /* 2.0 */
+ 0x4000000000000000ULL, /* 2.0 */
+ 0xC000000000000000ULL, /* 2.0 */
+ 0xC000000000000000ULL, /* -2.0 */
+ 0x4010000000000000ULL, /* 4.0 */
+ 0x4010000000000000ULL, /* 4.0 */
+ 0xC010000000000000ULL, /* -4.0 */
+ 0xC010000000000000ULL, /* -4.0 */
+ 0x3FF8000000000000ULL, /* 1.5 */
+ 0x3FF8000000000000ULL, /* 1.5 */
+ 0xBFF8000000000000ULL, /* -1.5 */
+ 0xBFF8000000000000ULL /* -1.5 */
+};
+
+const float64 z_output[N] = {
+ 0x7FFF000000000000ULL, /* nan */
+ 0x7FF8000000000000ULL, /* nan */
+ 0x7FFFFFFFFFFFFFFFULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x7FF8000000000000ULL, /* nan */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x7FFFFFFFFFFFFFFFULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x8000000000000000ULL, /* -0.0 */
+ 0x3FF8000000000000ULL, /* 1.5 */
+ 0xBFF8000000000000ULL, /* -1.5 */
+ 0xBFF8000000000000ULL, /* 1.5 */
+ 0x3FF8000000000000ULL, /* -1.5 */
+ 0x3FE0000000000000ULL, /* 0.5 */
+ 0xBFE0000000000000ULL, /* 5.0 */
+ 0xBFE0000000000000ULL, /* -5.0 */
+ 0x3FE0000000000000ULL, /* 0.5 */
+ 0x3FE5555555555555ULL, /* 0.666667 */
+ 0xBFE5555555555555ULL, /* -0.666667 */
+ 0xBFE5555555555555ULL, /* -0.666667 */
+ 0x3FE5555555555555ULL /* 0.666667 */
+};
+
+int
+main ()
+{
+ int main_result;
+ int i;
+ float64 x1, x2;
+ main_result = 0;
+ for (i = 0; i < N; i++)
+ {
+ float64 result;
+ x1 = a_input[i];
+ x2 = b_input[i];
+ result = float64_div (x1, x2);
+ main_result += (result != z_output[i]);
+
+ printf
+ ("a_input=%016llx b_input=%016llx expected=%016llx output=%016llx (%lf)\n",
+ a_input[i], b_input[i], z_output[i], result,
+ ullong_to_double (result));
+ }
+ printf ("%d\n", main_result);
+ return main_result;
+ }
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/hint.txt b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/hint.txt
new file mode 100644
index 000000000..c68ac9a75
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/hint.txt
@@ -0,0 +1 @@
+--hls-div=
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/milieu.h b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/milieu.h
new file mode 100755
index 000000000..4d92d5e05
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/milieu.h
@@ -0,0 +1,53 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
+Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Include common integer types and flags.
+*----------------------------------------------------------------------------*/
+#include "SPARC-GCC.h"
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat-macros b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat-macros
new file mode 100755
index 000000000..a735f741e
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat-macros
@@ -0,0 +1,247 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
+Arithmetic Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal notice) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Shifts `a' right by the number of bits given in `count'. If any nonzero
+| bits are shifted off, they are ``jammed'' into the least significant bit of
+| the result by setting the least significant bit to 1. The value of `count'
+| can be arbitrarily large; in particular, if `count' is greater than 64, the
+| result will be either 0 or 1, depending on whether `a' is zero or nonzero.
+| The result is stored in the location pointed to by `zPtr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+shift64RightJamming (bits64 a, int16 count, bits64 * zPtr)
+{
+ bits64 z;
+
+ if (count == 0)
+ {
+ z = a;
+ }
+ else if (count < 64)
+ {
+ z = (a >> count) | ((a << ((-count) & 63)) != 0);
+ }
+ else
+ {
+ z = (a != 0);
+ }
+ *zPtr = z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Adds the 128-bit value formed by concatenating `a0' and `a1' to the 128-bit
+| value formed by concatenating `b0' and `b1'. Addition is modulo 2^128, so
+| any carry out is lost. The result is broken into two 64-bit pieces which
+| are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+add128 (bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
+ bits64 * z1Ptr)
+{
+ bits64 z1;
+
+ z1 = a1 + b1;
+ *z1Ptr = z1;
+ *z0Ptr = a0 + b0 + (z1 < a1);
+
+}
+
+/*----------------------------------------------------------------------------
+| Subtracts the 128-bit value formed by concatenating `b0' and `b1' from the
+| 128-bit value formed by concatenating `a0' and `a1'. Subtraction is modulo
+| 2^128, so any borrow out (carry out) is lost. The result is broken into two
+| 64-bit pieces which are stored at the locations pointed to by `z0Ptr' and
+| `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+sub128 (bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
+ bits64 * z1Ptr)
+{
+
+ *z1Ptr = a1 - b1;
+ *z0Ptr = a0 - b0 - (a1 < b1);
+
+}
+
+/*----------------------------------------------------------------------------
+| Multiplies `a' by `b' to obtain a 128-bit product. The product is broken
+| into two 64-bit pieces which are stored at the locations pointed to by
+| `z0Ptr' and `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+mul64To128 (bits64 a, bits64 b, bits64 * z0Ptr, bits64 * z1Ptr)
+{
+ bits32 aHigh, aLow, bHigh, bLow;
+ bits64 z0, zMiddleA, zMiddleB, z1;
+
+ aLow = a;
+ aHigh = a >> 32;
+ bLow = b;
+ bHigh = b >> 32;
+ z1 = ((bits64) aLow) * bLow;
+ zMiddleA = ((bits64) aLow) * bHigh;
+ zMiddleB = ((bits64) aHigh) * bLow;
+ z0 = ((bits64) aHigh) * bHigh;
+ zMiddleA += zMiddleB;
+ z0 += (((bits64) (zMiddleA < zMiddleB)) << 32) + (zMiddleA >> 32);
+ zMiddleA <<= 32;
+ z1 += zMiddleA;
+ z0 += (z1 < zMiddleA);
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns an approximation to the 64-bit integer quotient obtained by dividing
+| `b' into the 128-bit value formed by concatenating `a0' and `a1'. The
+| divisor `b' must be at least 2^63. If q is the exact quotient truncated
+| toward zero, the approximation returned lies between q and q + 2 inclusive.
+| If the exact quotient q is larger than 64 bits, the maximum positive 64-bit
+| unsigned integer is returned.
+*----------------------------------------------------------------------------*/
+
+static bits64
+estimateDiv128To64 (bits64 a0, bits64 a1, bits64 b)
+{
+ bits64 b0, b1;
+ bits64 rem0, rem1, term0, term1;
+ bits64 z;
+
+ if (b <= a0)
+ return LIT64 (0xFFFFFFFFFFFFFFFF);
+ b0 = b >> 32;
+ z = (b0 << 32 <= a0) ? LIT64 (0xFFFFFFFF00000000) : (a0 / b0) << 32;
+ mul64To128 (b, z, &term0, &term1);
+ sub128 (a0, a1, term0, term1, &rem0, &rem1);
+ while (((sbits64) rem0) < 0)
+ {
+ z -= LIT64 (0x100000000);
+ b1 = b << 32;
+ add128 (rem0, rem1, b0, b1, &rem0, &rem1);
+ }
+ rem0 = (rem0 << 32) | (rem1 >> 32);
+ z |= (b0 << 32 <= rem0) ? 0xFFFFFFFF : rem0 / b0;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the number of leading 0 bits before the most-significant 1 bit of
+| `a'. If `a' is zero, 32 is returned.
+*----------------------------------------------------------------------------*/
+
+static int8
+countLeadingZeros32 (bits32 a)
+{
+ static const int8 countLeadingZerosHigh[256] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+ int8 shiftCount;
+
+ shiftCount = 0;
+ if (a < 0x10000)
+ {
+ shiftCount += 16;
+ a <<= 16;
+ }
+ if (a < 0x1000000)
+ {
+ shiftCount += 8;
+ a <<= 8;
+ }
+ shiftCount += countLeadingZerosHigh[a >> 24];
+ return shiftCount;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the number of leading 0 bits before the most-significant 1 bit of
+| `a'. If `a' is zero, 64 is returned.
+*----------------------------------------------------------------------------*/
+
+static int8
+countLeadingZeros64 (bits64 a)
+{
+ int8 shiftCount;
+
+ shiftCount = 0;
+ if (a < ((bits64) 1) << 32)
+ {
+ shiftCount += 32;
+ }
+ else
+ {
+ a >>= 32;
+ }
+ shiftCount += countLeadingZeros32 (a);
+ return shiftCount;
+
+}
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat-specialize b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat-specialize
new file mode 100755
index 000000000..3c5105928
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat-specialize
@@ -0,0 +1,123 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
+Arithmetic Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Underflow tininess-detection mode, statically initialized to default value.
+| (The declaration in `softfloat.h' must match the `int8' type here.)
+*----------------------------------------------------------------------------*/
+#define float_detect_tininess float_tininess_before_rounding
+
+/*----------------------------------------------------------------------------
+| Raises the exceptions specified by `flags'. Floating-point traps can be
+| defined here if desired. It is currently not possible for such a trap
+| to substitute a result value. If traps are not implemented, this routine
+| should be simply `float_exception_flags |= flags;'.
+*----------------------------------------------------------------------------*/
+
+void
+float_raise (int8 flags)
+{
+ float_exception_flags |= flags;
+
+}
+
+
+/*----------------------------------------------------------------------------
+| The pattern for a default generated double-precision NaN.
+*----------------------------------------------------------------------------*/
+#define float64_default_nan LIT64( 0x7FFFFFFFFFFFFFFF )
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the double-precision floating-point value `a' is a NaN;
+| otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+flag
+float64_is_nan (float64 a)
+{
+
+ return (LIT64 (0xFFE0000000000000) < (bits64) (a << 1));
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the double-precision floating-point value `a' is a signaling
+| NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+flag
+float64_is_signaling_nan (float64 a)
+{
+
+ return (((a >> 51) & 0xFFF) == 0xFFE) && (a & LIT64 (0x0007FFFFFFFFFFFF));
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes two double-precision floating-point values `a' and `b', one of which
+| is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a
+| signaling NaN, the invalid exception is raised.
+*----------------------------------------------------------------------------*/
+
+static float64
+propagateFloat64NaN (float64 a, float64 b)
+{
+ flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
+
+ aIsNaN = float64_is_nan (a);
+ aIsSignalingNaN = float64_is_signaling_nan (a);
+ bIsNaN = float64_is_nan (b);
+ bIsSignalingNaN = float64_is_signaling_nan (b);
+ a |= LIT64 (0x0008000000000000);
+ b |= LIT64 (0x0008000000000000);
+ if (aIsSignalingNaN | bIsSignalingNaN)
+ float_raise (float_flag_invalid);
+ return bIsSignalingNaN ? b : aIsSignalingNaN ? a : bIsNaN ? b : a;
+
+}
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat.c b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat.c
new file mode 100755
index 000000000..8604da331
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat.c
@@ -0,0 +1,316 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C source file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
+Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+#include "milieu.h"
+#include "softfloat.h"
+
+/*----------------------------------------------------------------------------
+| Floating-point rounding mode, extended double-precision rounding precision,
+| and exception flags.
+*----------------------------------------------------------------------------*/
+int8 float_rounding_mode = float_round_nearest_even;
+int8 float_exception_flags = 0;
+
+/*----------------------------------------------------------------------------
+| Primitive arithmetic functions, including multi-word arithmetic, and
+| division and square root approximations. (Can be specialized to target if
+| desired.)
+*----------------------------------------------------------------------------*/
+#include "softfloat-macros"
+
+/*----------------------------------------------------------------------------
+| Functions and definitions to determine: (1) whether tininess for underflow
+| is detected before or after rounding by default, (2) what (if anything)
+| happens when exceptions are raised, (3) how signaling NaNs are distinguished
+| from quiet NaNs, (4) the default generated quiet NaNs, and (5) how NaNs
+| are propagated from function inputs to output. These details are target-
+| specific.
+*----------------------------------------------------------------------------*/
+#include "softfloat-specialize"
+
+/*----------------------------------------------------------------------------
+| Returns the fraction bits of the double-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE bits64
+extractFloat64Frac (float64 a)
+{
+
+ return a & LIT64 (0x000FFFFFFFFFFFFF);
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the exponent bits of the double-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE int16
+extractFloat64Exp (float64 a)
+{
+
+ return (a >> 52) & 0x7FF;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the sign bit of the double-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE flag
+extractFloat64Sign (float64 a)
+{
+
+ return a >> 63;
+
+}
+
+/*----------------------------------------------------------------------------
+| Normalizes the subnormal double-precision floating-point value represented
+| by the denormalized significand `aSig'. The normalized exponent and
+| significand are stored at the locations pointed to by `zExpPtr' and
+| `zSigPtr', respectively.
+*----------------------------------------------------------------------------*/
+
+static void
+normalizeFloat64Subnormal (bits64 aSig, int16 * zExpPtr, bits64 * zSigPtr)
+{
+ int8 shiftCount;
+
+ shiftCount = countLeadingZeros64 (aSig) - 11;
+ *zSigPtr = aSig << shiftCount;
+ *zExpPtr = 1 - shiftCount;
+
+}
+
+/*----------------------------------------------------------------------------
+| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a
+| double-precision floating-point value, returning the result. After being
+| shifted into the proper positions, the three fields are simply added
+| together to form the result. This means that any integer portion of `zSig'
+| will be added into the exponent. Since a properly normalized significand
+| will have an integer portion equal to 1, the `zExp' input should be 1 less
+| than the desired result exponent whenever `zSig' is a complete, normalized
+| significand.
+*----------------------------------------------------------------------------*/
+
+INLINE float64
+packFloat64 (flag zSign, int16 zExp, bits64 zSig)
+{
+
+ return (((bits64) zSign) << 63) + (((bits64) zExp) << 52) + zSig;
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
+| and significand `zSig', and returns the proper double-precision floating-
+| point value corresponding to the abstract input. Ordinarily, the abstract
+| value is simply rounded and packed into the double-precision format, with
+| the inexact exception raised if the abstract input cannot be represented
+| exactly. However, if the abstract value is too large, the overflow and
+| inexact exceptions are raised and an infinity or maximal finite value is
+| returned. If the abstract value is too small, the input value is rounded
+| to a subnormal number, and the underflow and inexact exceptions are raised
+| if the abstract input cannot be represented exactly as a subnormal double-
+| precision floating-point number.
+| The input significand `zSig' has its binary point between bits 62
+| and 61, which is 10 bits to the left of the usual location. This shifted
+| significand must be normalized or smaller. If `zSig' is not normalized,
+| `zExp' must be 0; in that case, the result returned is a subnormal number,
+| and it must not require rounding. In the usual case that `zSig' is
+| normalized, `zExp' must be 1 less than the ``true'' floating-point exponent.
+| The handling of underflow and overflow follows the IEC/IEEE Standard for
+| Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static float64
+roundAndPackFloat64 (flag zSign, int16 zExp, bits64 zSig)
+{
+ int8 roundingMode;
+ flag roundNearestEven, isTiny;
+ int16 roundIncrement, roundBits;
+
+ roundingMode = float_rounding_mode;
+ roundNearestEven = (roundingMode == float_round_nearest_even);
+ roundIncrement = 0x200;
+ if (!roundNearestEven)
+ {
+ if (roundingMode == float_round_to_zero)
+ {
+ roundIncrement = 0;
+ }
+ else
+ {
+ roundIncrement = 0x3FF;
+ if (zSign)
+ {
+ if (roundingMode == float_round_up)
+ roundIncrement = 0;
+ }
+ else
+ {
+ if (roundingMode == float_round_down)
+ roundIncrement = 0;
+ }
+ }
+ }
+ roundBits = zSig & 0x3FF;
+ if (0x7FD <= (bits16) zExp)
+ {
+ if ((0x7FD < zExp)
+ || ((zExp == 0x7FD) && ((sbits64) (zSig + roundIncrement) < 0)))
+ {
+ float_raise (float_flag_overflow | float_flag_inexact);
+ return packFloat64 (zSign, 0x7FF, 0) - (roundIncrement == 0);
+ }
+ if (zExp < 0)
+ {
+ isTiny = (float_detect_tininess == float_tininess_before_rounding)
+ || (zExp < -1)
+ || (zSig + roundIncrement < LIT64 (0x8000000000000000));
+ shift64RightJamming (zSig, -zExp, &zSig);
+ zExp = 0;
+ roundBits = zSig & 0x3FF;
+ if (isTiny && roundBits)
+ float_raise (float_flag_underflow);
+ }
+ }
+ if (roundBits)
+ float_exception_flags |= float_flag_inexact;
+ zSig = (zSig + roundIncrement) >> 10;
+ zSig &= ~(((roundBits ^ 0x200) == 0) & roundNearestEven);
+ if (zSig == 0)
+ zExp = 0;
+ return packFloat64 (zSign, zExp, zSig);
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of dividing the double-precision floating-point value `a'
+| by the corresponding value `b'. The operation is performed according to
+| the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64
+float64_div (float64 a, float64 b)
+{
+ flag aSign, bSign, zSign;
+ int16 aExp, bExp, zExp;
+ bits64 aSig, bSig, zSig;
+ bits64 rem0, rem1, term0, term1;
+
+ aSig = extractFloat64Frac (a);
+ aExp = extractFloat64Exp (a);
+ aSign = extractFloat64Sign (a);
+ bSig = extractFloat64Frac (b);
+ bExp = extractFloat64Exp (b);
+ bSign = extractFloat64Sign (b);
+ zSign = aSign ^ bSign;
+ if (aExp == 0x7FF)
+ {
+ if (aSig)
+ return propagateFloat64NaN (a, b);
+ if (bExp == 0x7FF)
+ {
+ if (bSig)
+ return propagateFloat64NaN (a, b);
+ float_raise (float_flag_invalid);
+ return float64_default_nan;
+ }
+ return packFloat64 (zSign, 0x7FF, 0);
+ }
+ if (bExp == 0x7FF)
+ {
+ if (bSig)
+ return propagateFloat64NaN (a, b);
+ return packFloat64 (zSign, 0, 0);
+ }
+ if (bExp == 0)
+ {
+ if (bSig == 0)
+ {
+ if ((aExp | aSig) == 0)
+ {
+ float_raise (float_flag_invalid);
+ return float64_default_nan;
+ }
+ float_raise (float_flag_divbyzero);
+ return packFloat64 (zSign, 0x7FF, 0);
+ }
+ normalizeFloat64Subnormal (bSig, &bExp, &bSig);
+ }
+ if (aExp == 0)
+ {
+ if (aSig == 0)
+ return packFloat64 (zSign, 0, 0);
+ normalizeFloat64Subnormal (aSig, &aExp, &aSig);
+ }
+ zExp = aExp - bExp + 0x3FD;
+ aSig = (aSig | LIT64 (0x0010000000000000)) << 10;
+ bSig = (bSig | LIT64 (0x0010000000000000)) << 11;
+ if (bSig <= (aSig + aSig))
+ {
+ aSig >>= 1;
+ ++zExp;
+ }
+ zSig = estimateDiv128To64 (aSig, 0, bSig);
+ if ((zSig & 0x1FF) <= 2)
+ {
+ mul64To128 (bSig, zSig, &term0, &term1);
+ sub128 (aSig, 0, term0, term1, &rem0, &rem1);
+ while ((sbits64) rem0 < 0)
+ {
+ --zSig;
+ add128 (rem0, rem1, 0, bSig, &rem0, &rem1);
+ }
+ zSig |= (rem1 != 0);
+ }
+ return roundAndPackFloat64 (zSign, zExp, zSig);
+
+}
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat.h b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat.h
new file mode 100755
index 000000000..6d075ca15
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/softfloat.h
@@ -0,0 +1,77 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
+Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Software IEC/IEEE floating-point types.
+*----------------------------------------------------------------------------*/
+typedef unsigned int float32;
+typedef unsigned long long float64;
+
+/*----------------------------------------------------------------------------
+| Software IEC/IEEE floating-point underflow tininess-detection mode.
+*----------------------------------------------------------------------------*/
+#define float_tininess_after_rounding 0
+#define float_tininess_before_rounding 1
+
+/*----------------------------------------------------------------------------
+| Software IEC/IEEE floating-point rounding mode.
+*----------------------------------------------------------------------------*/
+#define float_round_nearest_even 0
+#define float_round_to_zero 1
+#define float_round_up 2
+#define float_round_down 3
+
+/*----------------------------------------------------------------------------
+| Software IEC/IEEE floating-point exception flags.
+*----------------------------------------------------------------------------*/
+#define float_flag_inexact 1
+#define float_flag_divbyzero 2
+#define float_flag_underflow 4
+#define float_flag_overflow 8
+#define float_flag_invalid 16
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/SPARC-GCC.h b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/SPARC-GCC.h
new file mode 100755
index 000000000..523e274f6
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/SPARC-GCC.h
@@ -0,0 +1,88 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
+Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Each of the following `typedef's defines the most convenient type that holds
+| integers of at least as many bits as specified. For example, `uint8' should
+| be the most convenient type that can hold unsigned integers of as many as
+| 8 bits. The `flag' type must be able to hold either a 0 or 1. For most
+| implementations of C, `flag', `uint8', and `int8' should all be `typedef'ed
+| to the same as `int'.
+*----------------------------------------------------------------------------*/
+typedef int flag;
+typedef int int8;
+typedef int int16;
+
+/*----------------------------------------------------------------------------
+| Each of the following `typedef's defines a type that holds integers
+| of _exactly_ the number of bits specified. For instance, for most
+| implementation of C, `bits16' and `sbits16' should be `typedef'ed to
+| `unsigned short int' and `signed short int' (or `short int'), respectively.
+*----------------------------------------------------------------------------*/
+typedef unsigned short int bits16;
+typedef unsigned int bits32;
+typedef unsigned long long int bits64;
+typedef signed long long int sbits64;
+
+/*----------------------------------------------------------------------------
+| The `LIT64' macro takes as its argument a textual integer literal and
+| if necessary ``marks'' the literal as having a 64-bit integer type.
+| For example, the GNU C Compiler (`gcc') requires that 64-bit literals be
+| appended with the letters `LL' standing for `long long', which is `gcc's
+| name for the 64-bit integer type. Some compilers may allow `LIT64' to be
+| defined as the identity macro: `#define LIT64( a ) a'.
+*----------------------------------------------------------------------------*/
+#define LIT64( a ) a##LL
+
+/*----------------------------------------------------------------------------
+| The macro `INLINE' can be used before functions that should be inlined. If
+| a compiler does not support explicit inlining, this macro should be defined
+| to be `static'.
+*----------------------------------------------------------------------------*/
+#define INLINE
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/dfdiv.c b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/dfdiv.c
new file mode 100755
index 000000000..7fd9823bd
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/dfdiv.c
@@ -0,0 +1,159 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*
+ * Copyright (C) 2008
+ * Y. Hara, H. Tomiyama, S. Honda, H. Takada and K. Ishii
+ * Nagoya University, Japan
+ * All rights reserved.
+ *
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The authors disclaims any and all warranties,
+ * whether express, implied, or statuary, including any implied warranties or
+ * merchantability or of fitness for a particular purpose. In no event shall the
+ * copyright-holder be liable for any incidental, punitive, or consequential damages
+ * of any kind whatsoever arising from the use of these programs. This disclaimer
+ * of warranty extends to the user of these programs and user's customers, employees,
+ * agents, transferees, successors, and assigns.
+ *
+ */
+#include
+#include "softfloat.c"
+
+double
+ullong_to_double (unsigned long long x)
+{
+ union
+ {
+ double d;
+ unsigned long long ll;
+ } t;
+
+ t.ll = x;
+ return t.d;
+}
+
+/*
++--------------------------------------------------------------------------+
+| * Test Vectors (added for CHStone) |
+| a_input, b_input : input data |
+| z_output : expected output data |
++--------------------------------------------------------------------------+
+*/
+#define N 22
+
+const float64 a_input[N] = {
+ 0x7FFF000000000000ULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x8000000000000000ULL, /* -0.0 */
+ 0x4008000000000000ULL, /* 3.0 */
+ 0xC008000000000000ULL, /* -3.0 */
+ 0x4008000000000000ULL, /* 3.0 */
+ 0xC008000000000000ULL, /* -3.0 */
+ 0x4000000000000000ULL, /* 2.0 */
+ 0xC000000000000000ULL, /* -2.0 */
+ 0x4000000000000000ULL, /* 2.0 */
+ 0xC000000000000000ULL, /* -2.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0xBFF0000000000000ULL, /* -1.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0xBFF0000000000000ULL /* -1.0 */
+};
+
+const float64 b_input[N] = {
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x7FF8000000000000ULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x7FF8000000000000ULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x3FF0000000000000ULL, /* 1.0 */
+ 0x4000000000000000ULL, /* 2.0 */
+ 0x4000000000000000ULL, /* 2.0 */
+ 0xC000000000000000ULL, /* 2.0 */
+ 0xC000000000000000ULL, /* -2.0 */
+ 0x4010000000000000ULL, /* 4.0 */
+ 0x4010000000000000ULL, /* 4.0 */
+ 0xC010000000000000ULL, /* -4.0 */
+ 0xC010000000000000ULL, /* -4.0 */
+ 0x3FF8000000000000ULL, /* 1.5 */
+ 0x3FF8000000000000ULL, /* 1.5 */
+ 0xBFF8000000000000ULL, /* -1.5 */
+ 0xBFF8000000000000ULL /* -1.5 */
+};
+
+const float64 z_output[N] = {
+ 0x7FFF000000000000ULL, /* nan */
+ 0x7FF8000000000000ULL, /* nan */
+ 0x7FFFFFFFFFFFFFFFULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x7FF8000000000000ULL, /* nan */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x7FFFFFFFFFFFFFFFULL, /* nan */
+ 0x7FF0000000000000ULL, /* inf */
+ 0x0000000000000000ULL, /* 0.0 */
+ 0x8000000000000000ULL, /* -0.0 */
+ 0x3FF8000000000000ULL, /* 1.5 */
+ 0xBFF8000000000000ULL, /* -1.5 */
+ 0xBFF8000000000000ULL, /* 1.5 */
+ 0x3FF8000000000000ULL, /* -1.5 */
+ 0x3FE0000000000000ULL, /* 0.5 */
+ 0xBFE0000000000000ULL, /* 5.0 */
+ 0xBFE0000000000000ULL, /* -5.0 */
+ 0x3FE0000000000000ULL, /* 0.5 */
+ 0x3FE5555555555555ULL, /* 0.666667 */
+ 0xBFE5555555555555ULL, /* -0.666667 */
+ 0xBFE5555555555555ULL, /* -0.666667 */
+ 0x3FE5555555555555ULL /* 0.666667 */
+};
+
+int
+main ()
+{
+ int main_result;
+ int i;
+ float64 x1, x2;
+ main_result = 0;
+ for (i = 0; i < N; i++)
+ {
+ float64 result;
+ x1 = a_input[i];
+ x2 = b_input[i];
+ result = float64_div (x1, x2);
+ main_result += (result != z_output[i]);
+
+ printf
+ ("a_input=%016llx b_input=%016llx expected=%016llx output=%016llx (%lf)\n",
+ a_input[i], b_input[i], z_output[i], result,
+ ullong_to_double (result));
+ }
+ printf ("%d\n", main_result);
+ return main_result;
+ }
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/dfdiv.csv b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/dfdiv.csv
new file mode 100644
index 000000000..daedfee6a
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/dfdiv.csv
@@ -0,0 +1,6 @@
+Benchmark, CYCLES, HLS_execution_time,
+GCC49:dfdiv_NR:main_0, 825,44.9199999999999999983,
+GCC49:dfdiv_as:main_0, 841,30.1399999999999999994,
+GCC49:dfdiv_none:main_0, 1777,37.5,
+GCC49:dfdiv_nr1:main_0, 1849,41.1800000000000000003,
+GCC49:dfdiv_nr2:main_0, 1105,43.119999999999999999,
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/list b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/list
new file mode 100644
index 000000000..a46f62bf6
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/list
@@ -0,0 +1,5 @@
+dfdiv.c --benchmark-name=dfdiv_none --hls-div=none
+dfdiv.c --benchmark-name=dfdiv_nr1 --hls-div=nr1
+dfdiv.c --benchmark-name=dfdiv_nr2 --hls-div=nr2
+dfdiv.c --benchmark-name=dfdiv_NR --hls-div=NR
+dfdiv.c --benchmark-name=dfdiv_as --hls-div=as
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/milieu.h b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/milieu.h
new file mode 100755
index 000000000..4d92d5e05
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/milieu.h
@@ -0,0 +1,53 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
+Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Include common integer types and flags.
+*----------------------------------------------------------------------------*/
+#include "SPARC-GCC.h"
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat-macros b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat-macros
new file mode 100755
index 000000000..a735f741e
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat-macros
@@ -0,0 +1,247 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
+Arithmetic Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal notice) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Shifts `a' right by the number of bits given in `count'. If any nonzero
+| bits are shifted off, they are ``jammed'' into the least significant bit of
+| the result by setting the least significant bit to 1. The value of `count'
+| can be arbitrarily large; in particular, if `count' is greater than 64, the
+| result will be either 0 or 1, depending on whether `a' is zero or nonzero.
+| The result is stored in the location pointed to by `zPtr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+shift64RightJamming (bits64 a, int16 count, bits64 * zPtr)
+{
+ bits64 z;
+
+ if (count == 0)
+ {
+ z = a;
+ }
+ else if (count < 64)
+ {
+ z = (a >> count) | ((a << ((-count) & 63)) != 0);
+ }
+ else
+ {
+ z = (a != 0);
+ }
+ *zPtr = z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Adds the 128-bit value formed by concatenating `a0' and `a1' to the 128-bit
+| value formed by concatenating `b0' and `b1'. Addition is modulo 2^128, so
+| any carry out is lost. The result is broken into two 64-bit pieces which
+| are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+add128 (bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
+ bits64 * z1Ptr)
+{
+ bits64 z1;
+
+ z1 = a1 + b1;
+ *z1Ptr = z1;
+ *z0Ptr = a0 + b0 + (z1 < a1);
+
+}
+
+/*----------------------------------------------------------------------------
+| Subtracts the 128-bit value formed by concatenating `b0' and `b1' from the
+| 128-bit value formed by concatenating `a0' and `a1'. Subtraction is modulo
+| 2^128, so any borrow out (carry out) is lost. The result is broken into two
+| 64-bit pieces which are stored at the locations pointed to by `z0Ptr' and
+| `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+sub128 (bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
+ bits64 * z1Ptr)
+{
+
+ *z1Ptr = a1 - b1;
+ *z0Ptr = a0 - b0 - (a1 < b1);
+
+}
+
+/*----------------------------------------------------------------------------
+| Multiplies `a' by `b' to obtain a 128-bit product. The product is broken
+| into two 64-bit pieces which are stored at the locations pointed to by
+| `z0Ptr' and `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+mul64To128 (bits64 a, bits64 b, bits64 * z0Ptr, bits64 * z1Ptr)
+{
+ bits32 aHigh, aLow, bHigh, bLow;
+ bits64 z0, zMiddleA, zMiddleB, z1;
+
+ aLow = a;
+ aHigh = a >> 32;
+ bLow = b;
+ bHigh = b >> 32;
+ z1 = ((bits64) aLow) * bLow;
+ zMiddleA = ((bits64) aLow) * bHigh;
+ zMiddleB = ((bits64) aHigh) * bLow;
+ z0 = ((bits64) aHigh) * bHigh;
+ zMiddleA += zMiddleB;
+ z0 += (((bits64) (zMiddleA < zMiddleB)) << 32) + (zMiddleA >> 32);
+ zMiddleA <<= 32;
+ z1 += zMiddleA;
+ z0 += (z1 < zMiddleA);
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns an approximation to the 64-bit integer quotient obtained by dividing
+| `b' into the 128-bit value formed by concatenating `a0' and `a1'. The
+| divisor `b' must be at least 2^63. If q is the exact quotient truncated
+| toward zero, the approximation returned lies between q and q + 2 inclusive.
+| If the exact quotient q is larger than 64 bits, the maximum positive 64-bit
+| unsigned integer is returned.
+*----------------------------------------------------------------------------*/
+
+static bits64
+estimateDiv128To64 (bits64 a0, bits64 a1, bits64 b)
+{
+ bits64 b0, b1;
+ bits64 rem0, rem1, term0, term1;
+ bits64 z;
+
+ if (b <= a0)
+ return LIT64 (0xFFFFFFFFFFFFFFFF);
+ b0 = b >> 32;
+ z = (b0 << 32 <= a0) ? LIT64 (0xFFFFFFFF00000000) : (a0 / b0) << 32;
+ mul64To128 (b, z, &term0, &term1);
+ sub128 (a0, a1, term0, term1, &rem0, &rem1);
+ while (((sbits64) rem0) < 0)
+ {
+ z -= LIT64 (0x100000000);
+ b1 = b << 32;
+ add128 (rem0, rem1, b0, b1, &rem0, &rem1);
+ }
+ rem0 = (rem0 << 32) | (rem1 >> 32);
+ z |= (b0 << 32 <= rem0) ? 0xFFFFFFFF : rem0 / b0;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the number of leading 0 bits before the most-significant 1 bit of
+| `a'. If `a' is zero, 32 is returned.
+*----------------------------------------------------------------------------*/
+
+static int8
+countLeadingZeros32 (bits32 a)
+{
+ static const int8 countLeadingZerosHigh[256] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+ int8 shiftCount;
+
+ shiftCount = 0;
+ if (a < 0x10000)
+ {
+ shiftCount += 16;
+ a <<= 16;
+ }
+ if (a < 0x1000000)
+ {
+ shiftCount += 8;
+ a <<= 8;
+ }
+ shiftCount += countLeadingZerosHigh[a >> 24];
+ return shiftCount;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the number of leading 0 bits before the most-significant 1 bit of
+| `a'. If `a' is zero, 64 is returned.
+*----------------------------------------------------------------------------*/
+
+static int8
+countLeadingZeros64 (bits64 a)
+{
+ int8 shiftCount;
+
+ shiftCount = 0;
+ if (a < ((bits64) 1) << 32)
+ {
+ shiftCount += 32;
+ }
+ else
+ {
+ a >>= 32;
+ }
+ shiftCount += countLeadingZeros32 (a);
+ return shiftCount;
+
+}
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat-specialize b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat-specialize
new file mode 100755
index 000000000..3c5105928
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat-specialize
@@ -0,0 +1,123 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
+Arithmetic Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Underflow tininess-detection mode, statically initialized to default value.
+| (The declaration in `softfloat.h' must match the `int8' type here.)
+*----------------------------------------------------------------------------*/
+#define float_detect_tininess float_tininess_before_rounding
+
+/*----------------------------------------------------------------------------
+| Raises the exceptions specified by `flags'. Floating-point traps can be
+| defined here if desired. It is currently not possible for such a trap
+| to substitute a result value. If traps are not implemented, this routine
+| should be simply `float_exception_flags |= flags;'.
+*----------------------------------------------------------------------------*/
+
+void
+float_raise (int8 flags)
+{
+ float_exception_flags |= flags;
+
+}
+
+
+/*----------------------------------------------------------------------------
+| The pattern for a default generated double-precision NaN.
+*----------------------------------------------------------------------------*/
+#define float64_default_nan LIT64( 0x7FFFFFFFFFFFFFFF )
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the double-precision floating-point value `a' is a NaN;
+| otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+flag
+float64_is_nan (float64 a)
+{
+
+ return (LIT64 (0xFFE0000000000000) < (bits64) (a << 1));
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the double-precision floating-point value `a' is a signaling
+| NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+flag
+float64_is_signaling_nan (float64 a)
+{
+
+ return (((a >> 51) & 0xFFF) == 0xFFE) && (a & LIT64 (0x0007FFFFFFFFFFFF));
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes two double-precision floating-point values `a' and `b', one of which
+| is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a
+| signaling NaN, the invalid exception is raised.
+*----------------------------------------------------------------------------*/
+
+static float64
+propagateFloat64NaN (float64 a, float64 b)
+{
+ flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
+
+ aIsNaN = float64_is_nan (a);
+ aIsSignalingNaN = float64_is_signaling_nan (a);
+ bIsNaN = float64_is_nan (b);
+ bIsSignalingNaN = float64_is_signaling_nan (b);
+ a |= LIT64 (0x0008000000000000);
+ b |= LIT64 (0x0008000000000000);
+ if (aIsSignalingNaN | bIsSignalingNaN)
+ float_raise (float_flag_invalid);
+ return bIsSignalingNaN ? b : aIsSignalingNaN ? a : bIsNaN ? b : a;
+
+}
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat.c b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat.c
new file mode 100755
index 000000000..8604da331
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat.c
@@ -0,0 +1,316 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C source file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
+Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+#include "milieu.h"
+#include "softfloat.h"
+
+/*----------------------------------------------------------------------------
+| Floating-point rounding mode, extended double-precision rounding precision,
+| and exception flags.
+*----------------------------------------------------------------------------*/
+int8 float_rounding_mode = float_round_nearest_even;
+int8 float_exception_flags = 0;
+
+/*----------------------------------------------------------------------------
+| Primitive arithmetic functions, including multi-word arithmetic, and
+| division and square root approximations. (Can be specialized to target if
+| desired.)
+*----------------------------------------------------------------------------*/
+#include "softfloat-macros"
+
+/*----------------------------------------------------------------------------
+| Functions and definitions to determine: (1) whether tininess for underflow
+| is detected before or after rounding by default, (2) what (if anything)
+| happens when exceptions are raised, (3) how signaling NaNs are distinguished
+| from quiet NaNs, (4) the default generated quiet NaNs, and (5) how NaNs
+| are propagated from function inputs to output. These details are target-
+| specific.
+*----------------------------------------------------------------------------*/
+#include "softfloat-specialize"
+
+/*----------------------------------------------------------------------------
+| Returns the fraction bits of the double-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE bits64
+extractFloat64Frac (float64 a)
+{
+
+ return a & LIT64 (0x000FFFFFFFFFFFFF);
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the exponent bits of the double-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE int16
+extractFloat64Exp (float64 a)
+{
+
+ return (a >> 52) & 0x7FF;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the sign bit of the double-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE flag
+extractFloat64Sign (float64 a)
+{
+
+ return a >> 63;
+
+}
+
+/*----------------------------------------------------------------------------
+| Normalizes the subnormal double-precision floating-point value represented
+| by the denormalized significand `aSig'. The normalized exponent and
+| significand are stored at the locations pointed to by `zExpPtr' and
+| `zSigPtr', respectively.
+*----------------------------------------------------------------------------*/
+
+static void
+normalizeFloat64Subnormal (bits64 aSig, int16 * zExpPtr, bits64 * zSigPtr)
+{
+ int8 shiftCount;
+
+ shiftCount = countLeadingZeros64 (aSig) - 11;
+ *zSigPtr = aSig << shiftCount;
+ *zExpPtr = 1 - shiftCount;
+
+}
+
+/*----------------------------------------------------------------------------
+| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a
+| double-precision floating-point value, returning the result. After being
+| shifted into the proper positions, the three fields are simply added
+| together to form the result. This means that any integer portion of `zSig'
+| will be added into the exponent. Since a properly normalized significand
+| will have an integer portion equal to 1, the `zExp' input should be 1 less
+| than the desired result exponent whenever `zSig' is a complete, normalized
+| significand.
+*----------------------------------------------------------------------------*/
+
+INLINE float64
+packFloat64 (flag zSign, int16 zExp, bits64 zSig)
+{
+
+ return (((bits64) zSign) << 63) + (((bits64) zExp) << 52) + zSig;
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
+| and significand `zSig', and returns the proper double-precision floating-
+| point value corresponding to the abstract input. Ordinarily, the abstract
+| value is simply rounded and packed into the double-precision format, with
+| the inexact exception raised if the abstract input cannot be represented
+| exactly. However, if the abstract value is too large, the overflow and
+| inexact exceptions are raised and an infinity or maximal finite value is
+| returned. If the abstract value is too small, the input value is rounded
+| to a subnormal number, and the underflow and inexact exceptions are raised
+| if the abstract input cannot be represented exactly as a subnormal double-
+| precision floating-point number.
+| The input significand `zSig' has its binary point between bits 62
+| and 61, which is 10 bits to the left of the usual location. This shifted
+| significand must be normalized or smaller. If `zSig' is not normalized,
+| `zExp' must be 0; in that case, the result returned is a subnormal number,
+| and it must not require rounding. In the usual case that `zSig' is
+| normalized, `zExp' must be 1 less than the ``true'' floating-point exponent.
+| The handling of underflow and overflow follows the IEC/IEEE Standard for
+| Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static float64
+roundAndPackFloat64 (flag zSign, int16 zExp, bits64 zSig)
+{
+ int8 roundingMode;
+ flag roundNearestEven, isTiny;
+ int16 roundIncrement, roundBits;
+
+ roundingMode = float_rounding_mode;
+ roundNearestEven = (roundingMode == float_round_nearest_even);
+ roundIncrement = 0x200;
+ if (!roundNearestEven)
+ {
+ if (roundingMode == float_round_to_zero)
+ {
+ roundIncrement = 0;
+ }
+ else
+ {
+ roundIncrement = 0x3FF;
+ if (zSign)
+ {
+ if (roundingMode == float_round_up)
+ roundIncrement = 0;
+ }
+ else
+ {
+ if (roundingMode == float_round_down)
+ roundIncrement = 0;
+ }
+ }
+ }
+ roundBits = zSig & 0x3FF;
+ if (0x7FD <= (bits16) zExp)
+ {
+ if ((0x7FD < zExp)
+ || ((zExp == 0x7FD) && ((sbits64) (zSig + roundIncrement) < 0)))
+ {
+ float_raise (float_flag_overflow | float_flag_inexact);
+ return packFloat64 (zSign, 0x7FF, 0) - (roundIncrement == 0);
+ }
+ if (zExp < 0)
+ {
+ isTiny = (float_detect_tininess == float_tininess_before_rounding)
+ || (zExp < -1)
+ || (zSig + roundIncrement < LIT64 (0x8000000000000000));
+ shift64RightJamming (zSig, -zExp, &zSig);
+ zExp = 0;
+ roundBits = zSig & 0x3FF;
+ if (isTiny && roundBits)
+ float_raise (float_flag_underflow);
+ }
+ }
+ if (roundBits)
+ float_exception_flags |= float_flag_inexact;
+ zSig = (zSig + roundIncrement) >> 10;
+ zSig &= ~(((roundBits ^ 0x200) == 0) & roundNearestEven);
+ if (zSig == 0)
+ zExp = 0;
+ return packFloat64 (zSign, zExp, zSig);
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of dividing the double-precision floating-point value `a'
+| by the corresponding value `b'. The operation is performed according to
+| the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64
+float64_div (float64 a, float64 b)
+{
+ flag aSign, bSign, zSign;
+ int16 aExp, bExp, zExp;
+ bits64 aSig, bSig, zSig;
+ bits64 rem0, rem1, term0, term1;
+
+ aSig = extractFloat64Frac (a);
+ aExp = extractFloat64Exp (a);
+ aSign = extractFloat64Sign (a);
+ bSig = extractFloat64Frac (b);
+ bExp = extractFloat64Exp (b);
+ bSign = extractFloat64Sign (b);
+ zSign = aSign ^ bSign;
+ if (aExp == 0x7FF)
+ {
+ if (aSig)
+ return propagateFloat64NaN (a, b);
+ if (bExp == 0x7FF)
+ {
+ if (bSig)
+ return propagateFloat64NaN (a, b);
+ float_raise (float_flag_invalid);
+ return float64_default_nan;
+ }
+ return packFloat64 (zSign, 0x7FF, 0);
+ }
+ if (bExp == 0x7FF)
+ {
+ if (bSig)
+ return propagateFloat64NaN (a, b);
+ return packFloat64 (zSign, 0, 0);
+ }
+ if (bExp == 0)
+ {
+ if (bSig == 0)
+ {
+ if ((aExp | aSig) == 0)
+ {
+ float_raise (float_flag_invalid);
+ return float64_default_nan;
+ }
+ float_raise (float_flag_divbyzero);
+ return packFloat64 (zSign, 0x7FF, 0);
+ }
+ normalizeFloat64Subnormal (bSig, &bExp, &bSig);
+ }
+ if (aExp == 0)
+ {
+ if (aSig == 0)
+ return packFloat64 (zSign, 0, 0);
+ normalizeFloat64Subnormal (aSig, &aExp, &aSig);
+ }
+ zExp = aExp - bExp + 0x3FD;
+ aSig = (aSig | LIT64 (0x0010000000000000)) << 10;
+ bSig = (bSig | LIT64 (0x0010000000000000)) << 11;
+ if (bSig <= (aSig + aSig))
+ {
+ aSig >>= 1;
+ ++zExp;
+ }
+ zSig = estimateDiv128To64 (aSig, 0, bSig);
+ if ((zSig & 0x1FF) <= 2)
+ {
+ mul64To128 (bSig, zSig, &term0, &term1);
+ sub128 (aSig, 0, term0, term1, &rem0, &rem1);
+ while ((sbits64) rem0 < 0)
+ {
+ --zSig;
+ add128 (rem0, rem1, 0, bSig, &rem0, &rem1);
+ }
+ zSig |= (rem1 != 0);
+ }
+ return roundAndPackFloat64 (zSign, zExp, zSig);
+
+}
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat.h b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat.h
new file mode 100755
index 000000000..6d075ca15
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/softfloat.h
@@ -0,0 +1,77 @@
+/*
++--------------------------------------------------------------------------+
+| CHStone : a suite of benchmark programs for C-based High-Level Synthesis |
+| ======================================================================== |
+| |
+| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, |
+| H. Takada and K. Ishii |
+| Nagoya University, Japan |
+| |
+| * Remark : |
+| 1. This source code is modified to unify the formats of the benchmark |
+| programs in CHStone. |
+| 2. Test vectors are added for CHStone. |
+| 3. If "main_result" is 0 at the end of the program, the program is |
+| correctly executed. |
+| 4. Please follow the copyright of each benchmark program. |
++--------------------------------------------------------------------------+
+*/
+/*============================================================================
+
+This C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
+Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Software IEC/IEEE floating-point types.
+*----------------------------------------------------------------------------*/
+typedef unsigned int float32;
+typedef unsigned long long float64;
+
+/*----------------------------------------------------------------------------
+| Software IEC/IEEE floating-point underflow tininess-detection mode.
+*----------------------------------------------------------------------------*/
+#define float_tininess_after_rounding 0
+#define float_tininess_before_rounding 1
+
+/*----------------------------------------------------------------------------
+| Software IEC/IEEE floating-point rounding mode.
+*----------------------------------------------------------------------------*/
+#define float_round_nearest_even 0
+#define float_round_to_zero 1
+#define float_round_up 2
+#define float_round_down 3
+
+/*----------------------------------------------------------------------------
+| Software IEC/IEEE floating-point exception flags.
+*----------------------------------------------------------------------------*/
+#define float_flag_inexact 1
+#define float_flag_divbyzero 2
+#define float_flag_underflow 4
+#define float_flag_overflow 8
+#define float_flag_invalid 16
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/synthesize.sh b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/synthesize.sh
new file mode 100755
index 000000000..5180fef4b
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise3/solution/synthesize.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+abs_script=$(readlink -e $0)
+dir_script=$(dirname $abs_script)
+$dir_script/../../test_panda.py --tool=bambu --bambu=bambu --spider=spider \
+ --args="--configuration-name=GCC49 --compiler=I386_GCC49" \
+ -c=--simulate -b$dir_script -l$dir_script/list "$@"
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise4/README b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/README
new file mode 100644
index 000000000..955068302
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/README
@@ -0,0 +1,5 @@
+1. Generate the module implementing the following formula (single precision and double precision):
+
+gamma = acos((a**2+b**2-c**2)/(2*a*b))
+
+2. Identify the combination of softfloat ops and libm which produces the best performances.
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise4/hint.sh b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/hint.sh
new file mode 100755
index 000000000..244aa73b5
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/hint.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+abs_script=$(readlink -e $0)
+dir_script=$(dirname $abs_script)
+bambu $dir_script/module.c --top-fname=awesome_math \
+ -O3 -lm --speculative-sdc-scheduling --libm-std-rounding --soft-float \
+ --simulate --generate-tb="a=3.0,b=4.0,c=5.0" \
+ "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise4/hint.txt b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/hint.txt
new file mode 100644
index 000000000..783879ebf
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/hint.txt
@@ -0,0 +1,4 @@
+Use the following parameters:
+--libm-std-rounding
+--soft-float
+...
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/list b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/list
new file mode 100644
index 000000000..b2a51a80b
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/list
@@ -0,0 +1,4 @@
+module.c --benchmark-name=std_rounding_softfloat --libm-std-rounding --soft-float
+module.c --benchmark-name=std_rounding_soft-fp --libm-std-rounding --soft-fp
+module.c --benchmark-name=faith_rounding_softfloat --soft-float
+module.c --benchmark-name=faith_rounding_soft-fp --soft-fp
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/module.c b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/module.c
new file mode 100644
index 000000000..266c15765
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/module.c
@@ -0,0 +1,24 @@
+#include
+
+#ifdef FP_SINGLE
+#define FP_TYPE float
+#define ACOS(a) acosf(a)
+#else
+#define FP_TYPE double
+#define ACOS(a) acos(a)
+#endif
+
+#ifdef MULT_SQUARE
+#define SQUARE(a) (a*a)
+#else
+#ifdef FP_SINGLE
+#define SQUARE(a) powf(a,2)
+#else
+#define SQUARE(a) pow(a,2)
+#endif
+#endif
+
+FP_TYPE awesome_math(FP_TYPE a, FP_TYPE b, FP_TYPE c)
+{
+ return ACOS((SQUARE(a) + SQUARE(b) - SQUARE(c))/(2*a*b));
+}
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/synthesize.sh b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/synthesize.sh
new file mode 100755
index 000000000..07ba2bbd5
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/synthesize.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+abs_script=$(readlink -e $0)
+dir_script=$(dirname $abs_script)
+$dir_script/../../test_panda.py --tool=bambu --bambu=bambu --spider=spider \
+ --args="--configuration-name=pow_square " \
+ --args="--configuration-name=mult_square -DMULT_SQUARE" \
+ --args="--configuration-name=single_pow_square -DFP_SINGLE" \
+ --args="--configuration-name=single_mult_square -DFP_SINGLE -DMULT_SQUARE" \
+ -c=--simulate -c=-lm -c=--generate-tb=$dir_script/testbench.xml -c=--speculative-sdc-scheduling \
+ -c=--top-fname=awesome_math \
+ -b$dir_script -l$dir_script/list "$@"
diff --git a/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/testbench.xml b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/testbench.xml
new file mode 100644
index 000000000..63bd95293
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/Exercise4/solution/testbench.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/documentation/tutorial_pact_2022/03-optimizations/test_panda.py b/documentation/tutorial_pact_2022/03-optimizations/test_panda.py
new file mode 100755
index 000000000..d486f8b83
--- /dev/null
+++ b/documentation/tutorial_pact_2022/03-optimizations/test_panda.py
@@ -0,0 +1,961 @@
+#!/usr/bin/python
+
+import argparse
+import datetime
+import distutils.spawn
+import logging
+import os
+import re
+import shlex
+import shutil
+import signal
+import subprocess
+import sys
+import threading
+import xml.dom.minidom
+from collections import deque
+
+line_index = 0
+failure = False
+
+def positive_integer(value):
+ pos_int = int(value)
+ if pos_int <= 0:
+ raise argparse.ArgumentTypeError("%s must be a positive integer" % value)
+ return pos_int
+
+class StoreOrUpdateMin(argparse.Action):
+ first_parsed = True
+ def __call__(self, parser, namespace, values, option_string=None):
+ if self.first_parsed == True :
+ self.first_parsed = False
+ setattr(namespace, self.dest, values)
+ else :
+ setattr(namespace, self.dest, min(namespace.j, values))
+
+
+#Return children of a process
+def GetChildren(parent_pid):
+ ret = set()
+ ps_command = subprocess.Popen("ps -o pid --ppid %d --noheaders" % parent_pid, shell=True, stdout=subprocess.PIPE)
+ ps_output = ps_command.stdout.read()
+ ps_command.wait()
+ for pid_str in ps_output.split("\n")[:-1]:
+ ret.add(int(pid_str))
+ return ret
+
+#Kill a process than kill its children
+def kill_proc_tree(pid):
+ children = GetChildren(pid)
+ os.kill(pid, signal.SIGKILL)
+ for child in children:
+ kill_proc_tree(child)
+#Process benchmark in list
+def execute_tests(named_list,thread_index):
+ global passed_benchmark
+ global total_benchmark
+ global line_index
+ global children
+ global failure
+ lines = open(named_list).readlines()
+ with lock:
+ local_index = line_index
+ line_index += 1
+ while local_index < len(lines) and not (failure and args.stop):
+ cwd = ComputeDirectory(lines[local_index])
+ failed_output_file_name = os.path.join(cwd, args.tool + "_failed_output")
+ if os.path.exists(failed_output_file_name):
+ os.remove(failed_output_file_name)
+ tool_return_value_file_name = os.path.join(cwd, args.tool + "_return_value")
+ if args.restart and os.path.exists(os.path.join(cwd, args.tool + "_return_value")):
+ tool_return_value_file = open(tool_return_value_file_name, "r")
+ return_value = tool_return_value_file.read()
+ tool_return_value_file.close()
+ if return_value == "0":
+ with lock:
+ total_benchmark += 1
+ passed_benchmark += 1
+ logging.info(" SKIPPING --- OVERALL: " + str(passed_benchmark) + " passed, " + str(total_benchmark-passed_benchmark) + " failed, " + str(len(lines)-total_benchmark) + " queued --- " + lines[local_index].replace("\\", ""))
+ local_index = line_index
+ line_index += 1
+ continue
+ HLS_output_directory = os.path.join(cwd, "HLS_output")
+ if os.path.exists(HLS_output_directory):
+ shutil.rmtree(HLS_output_directory)
+ output_file_name = os.path.join(cwd, args.tool + "_execution_output")
+ output_file = open(output_file_name, "w")
+ local_args = lines[local_index]
+ if local_args[0] == "\"":
+ local_args = local_args[1:-1]
+ if args.tool != "bambu" and args.tool != "zebu":
+ tokens = shlex.split(lines[local_index])
+ args_without_benchmark_name = ""
+ for token in tokens:
+ if token.find("--benchmark-name") == -1:
+ args_without_benchmark_name += token + " "
+ local_args = args_without_benchmark_name
+ local_command = "ulimit " + args.ulimit + "; exec timeout " + args.timeout + " " + tool_exe
+ local_command = local_command + " " + local_args
+ output_file.write("#" * 80 + "\n")
+ output_file.write("cd " + cwd + "; ")
+ output_file.write(local_command + "\n")
+ output_file.write("#" * 80 + "\n")
+ output_file.flush()
+ return_value = -1
+ with lock_creation_destruction:
+ if not (failure and args.stop):
+ children[thread_index] = subprocess.Popen(local_command, stderr=output_file, stdout=output_file, cwd=cwd, shell=True, executable="/bin/bash")
+ try:
+ return_value = children[thread_index].wait()
+ except:
+ pass
+ with lock_creation_destruction:
+ if return_value != 0 and (args.stop or args.returnfail):
+ failure = True
+ if failure and args.stop:
+ for local_thread_index in range(n_jobs):
+ if children[local_thread_index] != None:
+ if children[local_thread_index].poll() == None:
+ try:
+ kill_proc_tree(children[local_thread_index].pid)
+ except OSError:
+ pass
+ os.fsync(output_file.fileno())
+ output_file.close()
+ tool_return_value_file = open(tool_return_value_file_name, "w")
+ tool_return_value_file.write(str(return_value))
+ tool_return_value_file.close()
+ args_file = open(os.path.join(cwd, "args"), "w")
+ args_file.write(lines[local_index])
+ args_file.close()
+ if return_value == 0 and os.path.exists(os.path.join(cwd, args.tool + "_results_0.xml")):
+ tool_results_file_name = os.path.join(cwd, args.tool + "_results")
+ tool_results_file = open(tool_results_file_name, "w")
+ tool_results_string = ""
+ xml_document = xml.dom.minidom.parse(os.path.join(cwd, args.tool + "_results_0.xml"))
+ if len(xml_document.getElementsByTagName("CYCLES")) > 0:
+ cycles_tag = xml_document.getElementsByTagName("CYCLES")[0]
+ tool_results_string = tool_results_string + cycles_tag.attributes["value"].value + " CYCLES"
+ if len(xml_document.getElementsByTagName("CLOCK_SLACK")) > 0:
+ slack_tag = xml_document.getElementsByTagName("CLOCK_SLACK")[0]
+ tool_results_string = tool_results_string + " *** " + slack_tag.attributes["value"].value + "ns"
+ tool_results_file.write(tool_results_string)
+ tool_results_file.close()
+ if not (failure and args.stop) or (return_value != -9 and return_value != 0):
+ if return_value != 0:
+ shutil.copy(output_file_name, str(os.path.join(os.path.dirname(output_file_name), args.tool + "_failed_output")))
+ with lock:
+ total_benchmark += 1
+ if return_value == 0:
+ passed_benchmark += 1
+ if not args.no_clean:
+ for sub in os.listdir(cwd):
+ if os.path.isdir(os.path.join(cwd, sub)):
+ shutil.rmtree(os.path.join(cwd, sub))
+ else:
+ if sub != args.tool + "_return_value" and sub != args.tool + "_execution_output" and sub != args.tool + "_results_0.xml" and sub != "args":
+ os.remove(os.path.join(cwd, sub))
+ if os.path.exists(os.path.join(cwd, args.tool + "_results_0.xml")):
+ logging.info(" SUCCESS (" + tool_results_string + ") --- OVERALL: " + str(passed_benchmark) + " passed, " + str(total_benchmark-passed_benchmark) + " failed, " + str(len(lines)-total_benchmark) + " queued --- " + lines[local_index].replace("\\", ""))
+ else:
+ logging.info(" SUCCESS --- OVERALL: " + str(passed_benchmark) + " passed, " + str(total_benchmark-passed_benchmark) + " failed, " + str(len(lines)-total_benchmark) + " queued --- " + lines[local_index].replace("\\", ""))
+ elif return_value == 124:
+ logging.info(" FAILURE (Timeout) --- OVERALL: " + str(passed_benchmark) + " passed, " + str(total_benchmark-passed_benchmark) + " failed, " + str(len(lines)-total_benchmark) + " queued --- " + lines[local_index].replace("\\", ""))
+ elif return_value == 153:
+ logging.info(" FAILURE (File size limit exceeded) --- OVERALL: " + str(passed_benchmark) + " passed, " + str(total_benchmark-passed_benchmark) + " failed, " + str(len(lines)-total_benchmark) + " queued --- " + lines[local_index].replace("\\", ""))
+ else:
+ logging.info(" FAILURE --- OVERALL: " + str(passed_benchmark) + " passed, " + str(total_benchmark-passed_benchmark) + " failed, " + str(len(lines)-total_benchmark) + " queued --- " + lines[local_index].replace("\\", ""))
+ with lock:
+ local_index = line_index
+ line_index += 1
+
+#Computing relative path
+def ComputeDirectory(line):
+ configuration_name = ""
+ benchmark_name = ""
+ tokens = shlex.split(line)
+ for token in tokens:
+ if token.find("--configuration-name") != -1:
+ configuration_name = token[len("--configuration-name="):]
+ if token.find("--benchmark-name") != -1:
+ benchmark_name = token[len("--benchmark-name="):]
+ new_dir = os.path.join(abs_path, configuration_name, benchmark_name)
+ return new_dir
+
+#Search c files
+def SearchCFiles(directory):
+ logging.info(" Looking for file in " + str(directory))
+ files = set()
+ for element in os.listdir(directory):
+ if os.path.isdir(os.path.join(directory, element)):
+ files = files.union(SearchCFiles(os.path.join(directory, element)))
+ elif (element[-2:] == ".c") or (element[-2:] == ".C") or (element[-4:] == ".CPP") or (element[-4:] == ".cpp") or (element[-4:] == ".cxx") or (element[-3:] == ".cc") or (element[-4:] == ".c++"):
+ files.add(os.path.join(directory, element))
+ return files
+
+#Collecting results
+def CollectResults(directory):
+ #Skip if this is a leaf directory
+ if os.path.exists(os.path.join(directory, args.tool + "_return_value")) or os.listdir(directory) == []:
+ return
+ subdirs = [s for s in sorted(os.listdir(directory)) if os.path.isdir(os.path.join(directory,s)) and s != "panda-temp" and s != "HLS_output"]
+ for subdir in subdirs:
+ CollectResults(os.path.join(directory, subdir))
+ tool_failed_output = open(os.path.join(directory, args.tool + "_failed_output"), "w")
+ for subdir in subdirs:
+ if os.path.exists(os.path.join(directory, subdir, args.tool + "_failed_output")):
+ tool_failed_output.write(open(os.path.join(directory, subdir, args.tool + "_failed_output")).read())
+ if os.path.exists(os.path.join(directory, subdir, args.tool + "_execution_output")):
+ tool_failed_output.write("\n")
+ tool_failed_output.write("\n")
+ tool_failed_output.write("\n")
+ tool_failed_output.close()
+ report_file = open(os.path.join(directory, "report"), "w")
+ for subdir in subdirs:
+ if os.path.exists(os.path.join(directory, subdir, args.tool + "_return_value")):
+ return_value_file_name = os.path.join(directory, subdir, args.tool + "_return_value")
+ return_value_file = open(return_value_file_name)
+ return_value = return_value_file.read()
+ return_value_file.close()
+ args_file = open(os.path.join(directory, subdir, "args"))
+ command_args = args_file.readlines()[0]
+ command_args = command_args.replace(abs_benchmarks_root + "/", "")
+ args_file.close()
+ if return_value == "0":
+ tool_results_file_name = os.path.join(directory, subdir, args.tool + "_results")
+ if os.path.exists(tool_results_file_name):
+ report_file.write("SUCCESS (" + open(tool_results_file_name).read() + " cycles) " + command_args.replace("\\", ""))
+ else:
+ report_file.write("SUCCESS: " + command_args.replace("\\", ""))
+ else:
+ if return_value == "124":
+ report_file.write("FAILURE(Timeout): " + command_args.replace("\\", ""))
+ else:
+ report_file.write("FAILURE: " + command_args.replace("\\", ""))
+ report_file.write("\n")
+ elif os.path.exists(os.path.join(directory, subdir, "report")):
+ local_report_file = open(os.path.join(directory, subdir, "report"))
+ report_file.write(local_report_file.read())
+ local_report_file.close()
+ report_file.close()
+ if args.tool == "bambu":
+ local_args = ""
+ named_list_name = os.path.join(abs_path, "named_list")
+ lines = open(named_list_name).readlines()
+ for line in lines:
+ local_dir = ComputeDirectory(line)
+ if os.path.exists(os.path.join(local_dir, args.tool + "_results_0.xml")):
+ local_args = local_args + " " + os.path.join(local_dir, args.tool + "_results_0.xml")
+ if len(local_args) > 0:
+ #Generate experimental setup xml
+ experimental_setup_file_name = os.path.join(abs_path, "experimental_setup.xml")
+ temp_list = open(experimental_setup_file_name, "w")
+ bambu_version_file_name = os.path.join(abs_path, "bambu_version")
+ bambu_version_file = open(bambu_version_file_name, "w")
+ bambu_version_command = [tool_exe]
+ bambu_version_command.extend(shlex.split("--version"))
+ subprocess.call(bambu_version_command, stdout=bambu_version_file)
+ bambu_version_file.close()
+ bambu_version_file = open(bambu_version_file_name, "r")
+ bambu_version = bambu_version_file.readlines()[-2].rstrip()
+ bambu_version_file.close()
+ if args.commonargs != None:
+ bambu_arguments = ' '.join(' '.join(map(str,l)) for l in args.commonargs)
+ else:
+ bambu_arguments = ""
+ temp_list.write("\n")
+ temp_list.write("\n")
+ temp_list.write(" \n")
+ temp_list.write(" \n")
+ temp_list.write(" \n")
+ temp_list.write(" \n")
+ temp_list.write(" \n")
+ reordered_list_name = os.path.join(abs_path, "reordered_list")
+ reordered_list = open(reordered_list_name, "r")
+ for line in reordered_list.readlines():
+ temp_list.write(" \n")
+ temp_list.write(" \n")
+ temp_list.write("\n")
+ temp_list.close();
+ local_args = local_args + " " + experimental_setup_file_name
+ if os.path.exists(args.spider_style) :
+ local_args = local_args + " " + args.spider_style + " " + table
+ else:
+ local_args = local_args + " " + os.path.join(os.path.dirname(spider), args.spider_style) + " " + table
+# logging.info(" Executing " + spider + " " + local_args)
+ logging.info(" Executing " + spider)
+ local_command = [spider]
+ local_command.extend(shlex.split(local_args))
+ return_value = subprocess.call(local_command)
+ logging.info("Collected results of " + directory)
+
+
+#Create Junit Body
+def CreateJunitBody(directory,ju_file):
+ #Skip if this is a leaf directory
+ if os.path.exists(os.path.join(directory, args.tool + "_return_value")) or os.listdir(directory) == []:
+ return
+ subdirs = [s for s in sorted(os.listdir(directory)) if os.path.isdir(os.path.join(directory,s)) and s != "panda-temp" and s != "HLS_output"]
+ print_testsuite = False
+ for subdir in subdirs:
+ if os.path.exists(os.path.join(directory, subdir, args.tool + "_return_value")):
+ print_testsuite = True
+ CreateJunitBody(os.path.join(directory, subdir),ju_file)
+ failed_counter_file_name = os.path.join(abs_path, "failed_counter")
+ failed_counter = "0"
+ if os.path.exists(failed_counter_file_name):
+ failed_counter_file = open(failed_counter_file_name)
+ failed_counter = failed_counter_file.read()
+
+ if print_testsuite and len(subdirs) > 0:
+ ju_file.write(" \n")
+ for subdir in subdirs:
+ if os.path.exists(os.path.join(directory, subdir, args.tool + "_return_value")):
+ return_value_file_name = os.path.join(directory, subdir, args.tool + "_return_value")
+ return_value_file = open(return_value_file_name)
+ return_value = return_value_file.read()
+ return_value_file.close()
+ args_file = open(os.path.join(directory, subdir, "args"))
+ command_args = args_file.readlines()[0]
+ command_args = command_args.replace(abs_benchmarks_root + "/", "")
+ args_file.close()
+ if return_value == "0":
+ ju_file.write(" \n")
+ else:
+ if return_value == "124":
+ ju_file.write(" \n")
+ ju_file.write(" \n")
+ ju_file.write(" \n")
+ ju_file.write("\n")
+ ju_file.write(" \n")
+ ju_file.write(" \n")
+ ju_file.write("\n")
+ ju_file.write(" \n")
+ ju_file.write(" \n")
+ if print_testsuite and len(subdirs) > 0:
+ ju_file.write(" \n")
+
+
+#Create PerfPublisher Body
+def CreatePerfPublisherBody(directory,pp_file):
+ #Skip if this is a leaf directory
+ if os.path.exists(os.path.join(directory, args.tool + "_return_value")) or os.listdir(directory) == []:
+ return
+ subdirs = [s for s in sorted(os.listdir(directory)) if os.path.isdir(os.path.join(directory,s)) and s != "panda-temp" and s != "HLS_output"]
+ print_testsuite = False
+ for subdir in subdirs:
+ if os.path.exists(os.path.join(directory, subdir, args.tool + "_return_value")):
+ print_testsuite = True
+ CreatePerfPublisherBody(os.path.join(directory, subdir),pp_file)
+
+ for subdir in subdirs:
+ if os.path.exists(os.path.join(directory, subdir, args.tool + "_return_value")):
+ pp_file.write(" \n")
+ pp_file.write(" \n")
+ return_value_file_name = os.path.join(directory, subdir, args.tool + "_return_value")
+ return_value_file = open(return_value_file_name)
+ return_value = return_value_file.read()
+ return_value_file.close()
+ args_file = open(os.path.join(directory, subdir, "args"))
+ command_args = args_file.readlines()[0]
+ command_args = command_args.replace(abs_benchmarks_root + "/", "")
+ args_file.close()
+ if return_value == "0":
+ pp_file.write(" \n")
+ cycles_tag = ""
+ areatime_tag = ""
+ slice_tag = ""
+ sliceluts_tag = ""
+ registers_tag = ""
+ dsps_tag = ""
+ brams_tag = ""
+ period_tag = ""
+ dsps_tag = ""
+ slack_tag = ""
+ frequency_tag = ""
+ HLS_execution_time_tag = ""
+ if os.path.exists(os.path.join(directory, subdir, args.tool + "_results_0.xml")):
+ xml_document = xml.dom.minidom.parse(os.path.join(directory, subdir, args.tool + "_results_0.xml"))
+ if len(xml_document.getElementsByTagName("CYCLES")) > 0:
+ cycles_tag = str(xml_document.getElementsByTagName("CYCLES")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("AREAxTIME")) > 0:
+ areatime_tag = str(xml_document.getElementsByTagName("AREAxTIME")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("SLICE")) > 0:
+ slice_tag = str(xml_document.getElementsByTagName("SLICE")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("SLICE_LUTS")) > 0:
+ sliceluts_tag = str(xml_document.getElementsByTagName("SLICE_LUTS")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("REGISTERS")) > 0:
+ registers_tag = str(xml_document.getElementsByTagName("REGISTERS")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("DSPS")) > 0:
+ dsps_tag = str(xml_document.getElementsByTagName("DSPS")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("BRAMS")) > 0:
+ brams_tag = str(xml_document.getElementsByTagName("BRAMS")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("PERIOD")) > 0:
+ period_tag = str(xml_document.getElementsByTagName("PERIOD")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("CLOCK_SLACK")) > 0:
+ slack_tag = str(xml_document.getElementsByTagName("CLOCK_SLACK")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("FREQUENCY")) > 0:
+ frequency_tag = str(xml_document.getElementsByTagName("FREQUENCY")[0].attributes["value"].value)
+ if len(xml_document.getElementsByTagName("HLS_execution_time")) > 0:
+ HLS_execution_time_tag = str(xml_document.getElementsByTagName("HLS_execution_time")[0].attributes["value"].value)
+
+ if cycles_tag != "":
+ pp_file.write(" \n")
+ if HLS_execution_time_tag != "":
+ pp_file.write(" \n")
+
+ if areatime_tag != "" or slice_tag != "" or sliceluts_tag != "" or registers_tag != "" or dsps_tag != "" or brams_tag != "" or period_tag != "" or dsps_tag != "" or slack_tag != "" or frequency_tag != "":
+ pp_file.write(" \n")
+ if areatime_tag != "":
+ pp_file.write(" \n")
+ if slice_tag != "":
+ pp_file.write(" \n")
+ if sliceluts_tag != "":
+ pp_file.write(" \n")
+ if registers_tag != "":
+ pp_file.write(" \n")
+ if dsps_tag != "":
+ pp_file.write(" \n")
+ if brams_tag != "":
+ pp_file.write(" \n")
+ if period_tag != "":
+ pp_file.write(" \n")
+ if slack_tag != "":
+ pp_file.write(" \n")
+ if frequency_tag != "":
+ pp_file.write(" \n")
+ pp_file.write(" \n")
+ else:
+ if return_value == "124":
+ pp_file.write(" \n")
+ else:
+ pp_file.write(" \n")
+ pp_file.write(" \n")
+ pp_file.write(" \n")
+
+parser = argparse.ArgumentParser(description="Performs panda tests", fromfile_prefix_chars='@')
+parser.add_argument("files", help="The files to be tested: they can be configuration files, directories containing benchmarks or source code files.", nargs='*', action="append")
+parser.add_argument('-l', "--benchmarks_list", help="The file containing the list of tests to be performed", nargs='*', action="append")
+parser.add_argument('-b', "--benchmarks_root", help="The directory containing benchmarks")
+parser.add_argument('-o', "--output", help="The directory where output files we be put (default=\"output\")", default="output")
+parser.add_argument('-j', help="The number of jobs which execute the benchmarks (default=\"1\")", default=1, type=positive_integer, action=StoreOrUpdateMin)
+parser.add_argument("--bambu", help="The bambu executable (default=/opt/panda/bin/bambu)", default="/opt/panda/bin/bambu")
+parser.add_argument("--spider", help="The spider executable (default=/opt/panda/bin/spider)", default="/opt/panda/bin/spider")
+parser.add_argument("--spider-style", help="The spider table style relative to the spider executable (default=../lib/latex_format_bambu_results.xml)", default="../lib/latex_format_bambu_results.xml")
+parser.add_argument("--zebu", help="The zebu executable (default=/opt/panda/bin/zebu)", default="/opt/panda/bin/zebu")
+parser.add_argument('-t', "--timeout", help="Timeout for tool execution (default=60m)", default="60m")
+parser.add_argument('-a', "--args", help="A set of arguments to be passed to the tool", nargs='*', action='append')
+parser.add_argument('-c', "--commonargs", help="A set of arguments to be passed to the tool", nargs='*', action='append')
+parser.add_argument("--table", help="Print the results in tex format", default="results.tex")
+parser.add_argument("--tool", help="The tool to be tested", default="bambu")
+parser.add_argument("--ulimit", help="The ulimit options", default="-f 2097152 -v 8388608 -s 16384")
+parser.add_argument("--stop", help="Stop the execution on first error (default=false)", default=False, action="store_true")
+parser.add_argument("--returnfail", help="Return FAILURE in case at least one test fails (default=false)", default=False, action="store_true")
+parser.add_argument("--mail", help="Send a mail with the result")
+parser.add_argument("--name", help="Set the name of this regression (default=Bambu regression)", nargs='*', action='append')
+parser.add_argument("--no-clean", help="Do not clean produced files", default=False, action="store_true")
+parser.add_argument("--restart", help="Restart last execution (default=false)", default=False, action="store_true")
+parser.add_argument("--script", help="Set the bash script in the generated tex", default="")
+parser.add_argument("--junitdir", help="Set the JUnit directory", default="")
+parser.add_argument("--perfpublisherdir", help="Set the PerfPublisher directory", default="")
+
+args = parser.parse_args()
+n_jobs = args.j # set this, because it will be overwritten by the parse of modified_argv
+logging.basicConfig(level=logging.INFO,format='%(levelname)s: %(message)s')
+
+#The absolute path of current script
+abs_script = os.path.abspath(sys.argv[0])
+
+#Expand configuration files
+modified_argv = []
+modified_argv.append(sys.argv[0])
+abs_configuration_dir=""
+for arg in sys.argv[1:]:
+ if arg in args.files[0]:
+ #.c/c++ file
+ if (arg[-2:] == ".c") or (arg[-2:] == ".C") or (arg[-4:] == ".CPP") or (arg[-4:] == ".cpp") or (arg[-4:] == ".cxx") or (arg[-3:] == ".cc") or (arg[-4:] == ".c++"):
+ modified_argv.append(arg)
+ #Check if it is a directory
+ elif os.path.exists(arg) and os.path.isdir(arg):
+ modified_argv.append(arg)
+ elif args.benchmarks_root != None and os.path.exists(os.path.join(os.path.abspath(args.benchmarks_root), arg)) and os.path.isdir(os.path.join(os.path.abspath(args.benchmarks_root), arg)):
+ modified_argv.append(arg)
+ elif os.path.exists(os.path.join(os.path.dirname(abs_script), arg)) and os.path.isdir(os.path.join(os.path.dirname(abs_script), arg)):
+ modified_argv.append(arg)
+ else:
+ modified_argv.append("@" + arg)
+ else:
+ modified_argv.append(arg)
+args = parser.parse_args(modified_argv)
+
+#The absolute path of current script
+abs_script = os.path.abspath(sys.argv[0])
+
+#The table to be produced
+table = os.path.abspath(args.table)
+#Check if output directory exists, if yes abort
+if os.path.exists(args.output) and not args.restart:
+ logging.error("Output directory " + args.output + " already exists. Please remove it or specify a different one with -o")
+ sys.exit(1)
+
+#Check if JUnit dir exist
+if args.junitdir != "" and not os.path.exists(args.junitdir):
+ os.mkdir(args.junitdir)
+#Check if PerfPublisher dir exist
+if args.perfpublisherdir != "" and not os.path.exists(args.perfpublisherdir):
+ os.mkdir(args.perfpublisherdir)
+#compute JUnit file name
+junit_file_name = ""
+if args.junitdir != "":
+ junit_index = 0
+ junit_file_name = os.path.abspath(os.path.join(args.junitdir, "Junit_report"+str(junit_index)+".xml"))
+ while os.path.isfile(junit_file_name) :
+ junit_index = junit_index + 1
+ junit_file_name = os.path.abspath(os.path.join(args.junitdir, "Junit_report"+str(junit_index)+".xml"))
+#compute PerfPublisher file name
+perfpublisher_name = ""
+perfpublisher_file_name = ""
+if args.perfpublisherdir != "":
+ perfpublisher_index = 0
+ perfpublisher_name = "PerfPublisher_report"+str(perfpublisher_index)
+ perfpublisher_file_name = os.path.abspath(os.path.join(args.perfpublisherdir, perfpublisher_name+".xml"))
+ while os.path.isfile(perfpublisher_file_name) :
+ perfpublisher_index = perfpublisher_index + 1
+ perfpublisher_name = "PerfPublisher_report"+str(perfpublisher_index)
+ perfpublisher_file_name = os.path.abspath(os.path.join(args.perfpublisherdir, perfpublisher_name+".xml"))
+
+#Create the folder and enter in it
+abs_path = os.path.abspath(args.output)
+
+if args.restart:
+ if not os.path.exists(abs_path):
+ args.restart = False
+if not args.restart:
+ os.mkdir(abs_path)
+os.chdir(abs_path)
+
+
+#Skipping if all benchmarks already pass
+if args.restart:
+ failed_counter_file_name = os.path.join(abs_path, "failed_counter")
+ if os.path.exists(failed_counter_file_name):
+ failed_counter_file = open(failed_counter_file_name)
+ failed_counter = failed_counter_file.read()
+ if failed_counter == "0" and args.junitdir == "" and args.perfpublisherdir == "":
+ logging.info("Already pass")
+ sys.exit(0)
+
+#Check tool executable
+tool_exe = ""
+if args.tool == "bambu":
+ if os.path.isfile(args.bambu) and os.access(args.bambu, os.X_OK):
+ tool_exe = args.bambu
+ else:
+ #Check bambu in the path
+ for path in os.environ["PATH"].split(os.pathsep):
+ exe_file = os.path.join(path, "bambu")
+ if os.path.isfile(exe_file) and os.access(exe_file, os.X_OK):
+ tool_exe = exe_file
+ if tool_exe == "":
+ if args.bambu != "opt/panda/bin/bambu":
+ if not os.path.isfile(args.bambu):
+ logging.error(args.bambu + " does not exist")
+ else:
+ logging.error(args.bambu + " is not an executable")
+ else:
+ logging.error("bambu not found")
+ sys.exit(1)
+ logging.info("Bambu found: " + tool_exe)
+elif args.tool == "zebu":
+ if os.path.isfile(args.zebu) and os.access(args.zebu, os.X_OK):
+ tool_exe = args.zebu
+ else:
+ #Check zebu in the path
+ for path in os.environ["PATH"].split(os.pathsep):
+ exe_file = os.path.join(path, "zebu")
+ if os.path.isfile(exe_file) and os.access(exe_file, os.X_OK):
+ tool_exe = exe_file
+ if tool_exe == "":
+ if args.zebu != "opt/panda/bin/zebu":
+ if not os.path.isfile(args.zebu):
+ logging.error(args.zebu + " does not exist")
+ else:
+ logging.error(args.zebu + " is not an executable")
+ else:
+ logging.error("zebu not found")
+ sys.exit(1)
+ logging.info("Zebu found: " + tool_exe)
+else:
+ tool_exe = args.tool
+ if distutils.spawn.find_executable(tool_exe) == None:
+ logging.error(tool_exe + " not found")
+ sys.exit(1)
+
+if args.benchmarks_root is None:
+ abs_benchmarks_root = abs_configuration_dir
+else:
+ if os.path.isabs(args.benchmarks_root):
+ abs_benchmarks_root = os.path.abspath(args.benchmarks_root)
+ else:
+ if os.path.exists(os.path.join(os.path.abspath(".."), args.benchmarks_root)):
+ abs_benchmarks_root = os.path.join(os.path.abspath(".."), args.benchmarks_root)
+ else:
+ if os.path.exists(os.path.join(os.path.abspath(os.path.join(os.path.dirname(abs_script), "../../..")), args.benchmarks_root)):
+ abs_benchmarks_root = os.path.join(os.path.abspath(os.path.join(os.path.dirname(abs_script), "../../..")), args.benchmarks_root)
+ else:
+ logging.error(args.benchmarks_root + " not found")
+ sys.exit(1)
+
+#Check spider executable
+spider = ""
+if os.path.isfile(args.spider) and os.access(args.spider, os.X_OK):
+ spider = args.spider
+else:
+ #Check spider in the path
+ for path in os.environ["PATH"].split(os.pathsep):
+ exe_file = os.path.join(path, "spider")
+ if os.path.isfile(exe_file) and os.access(exe_file, os.X_OK):
+ spider = exe_file
+if spider == "":
+ if args.spider != "opt/panda/bin/spider":
+ if not os.path.isfile(args.spider):
+ logging.error(args.spider + " does not exist")
+ else:
+ logging.error(args.spider + " is not an executable")
+ else:
+ logging.error("spider not found")
+ sys.exit(1)
+
+if args.benchmarks_root is None:
+ abs_benchmarks_root = abs_configuration_dir
+else:
+ if os.path.isabs(args.benchmarks_root):
+ abs_benchmarks_root = os.path.abspath(args.benchmarks_root)
+ else:
+ if os.path.exists(os.path.join(os.path.abspath(".."), args.benchmarks_root)):
+ abs_benchmarks_root = os.path.join(os.path.abspath(".."), args.benchmarks_root)
+ else:
+ if os.path.exists(os.path.join(os.path.abspath(os.path.join(os.path.dirname(abs_script), "../../..")), args.benchmarks_root)):
+ abs_benchmarks_root = os.path.join(os.path.abspath(os.path.join(os.path.dirname(abs_script), "../../..")), args.benchmarks_root)
+ else:
+ logging.error(args.benchmarks_root + " not found")
+ sys.exit(1)
+mutt = None
+logging.info("Spider found: " + spider)
+
+#Check mutt executable
+if args.mail != None:
+ #Check mutt in the path
+ for path in os.environ["PATH"].split(os.pathsep):
+ exe_file = os.path.join(path, "mutt")
+ if os.path.isfile(exe_file) and os.access(exe_file, os.X_OK):
+ mutt = exe_file
+ if mutt == None:
+ logging.error("mutt not found")
+ sys.exit(1)
+
+
+if not args.restart:
+ #Check if file lists exist
+ abs_lists = []
+ if args.benchmarks_list != None:
+ for relative_list in args.benchmarks_list:
+ #First look in the current directory
+ if os.path.exists(os.path.abspath("../" + relative_list[0])):
+ abs_lists.append(os.path.abspath("../" + relative_list[0]))
+ #Then look in script directory
+ elif os.path.exists(os.path.join(os.path.dirname(abs_script), relative_list[0])):
+ abs_lists.append(os.path.join(os.path.dirname(abs_script), relative_list[0]))
+ #Then look in configuration directory
+ elif os.path.exists(os.path.join(abs_configuration_dir, relative_list[0])):
+ abs_lists.append(os.path.join(abs_configuration_dir, relative_list[0]))
+ #Then look in benchmarks root
+ elif os.path.exists(os.path.join(abs_benchmarks_root, relative_list[0])):
+ abs_lists.append(os.path.join(abs_benchmarks_root, relative_list[0]))
+ else:
+ logging.error(relative_list[0] + " does not exist")
+ sys.exit(1)
+ files_list = []
+ #Create temp list with arg
+ for arg in args.files[0]:
+ #.c/.c++ file
+ if (arg[-2:] == ".c") or (arg[-2:] == ".C") or (arg[-4:] == ".CPP") or (arg[-4:] == ".cpp") or (arg[-4:] == ".cxx") or (arg[-3:] == ".cc") or (arg[-4:] == ".c++"):
+ files_list.append(arg)
+ #Check if it is a directory
+ elif os.path.exists(arg) and os.path.isdir(arg):
+ files_list.append(arg)
+ elif os.path.exists(os.path.join(os.path.dirname(abs_script), arg)) and os.path.isdir(os.path.join(os.path.dirname(abs_script), arg)):
+ files_list.append(arg)
+ elif os.path.exists(os.path.join(abs_benchmarks_root, arg)) and os.path.isdir(os.path.join(abs_benchmarks_root, arg)):
+ files_list.append(os.path.join(abs_benchmarks_root, arg))
+
+ if args.benchmarks_list == None and len(files_list) == 0 and (args.tool == "bambu" or args.tool == "zebu"):
+ logging.error("Benchmarks not found")
+ sys.exit(2)
+
+ if len(files_list) > 0:
+ temp_list = open(os.path.join(abs_path, "temp_list"), "w")
+ for element in files_list:
+ temp_list.write(element)
+ temp_list.close()
+ abs_lists.append(os.path.join(abs_path, "temp_list"))
+
+ #Reordering elements in each row
+ reordered_list_name = os.path.join(abs_path, "reordered_list")
+ reordered_list = open(reordered_list_name, "w")
+
+ logging.info("Preparing benchmark list")
+ logging.info(" Reordering arguments")
+ for abs_list in abs_lists:
+ list_file = open(abs_list)
+ lines = list_file.readlines()
+ list_file.close()
+ for line in lines:
+ if line.strip() == "":
+ continue
+ if line[0] =='#':
+ continue
+ if args.tool != "bambu" and args.tool != "zebu":
+ reordered_list.write(line)
+ continue
+ tokens = shlex.split(line)
+ parameters = list()
+ #Flag used to ad-hoc manage --param arg
+ follow_param = False
+ for token in tokens:
+ if token[0] == '-':
+ parameters.append(re.escape(token))
+ if token.find("--param") != -1:
+ follow_param = True;
+ else:
+ follow_param = False;
+ else:
+ if follow_param == True:
+ parameters.append(re.escape(token))
+ else:
+ reordered_list.write(token + " ")
+ follow_param = False;
+ for parameter in parameters:
+ reordered_list.write(re.escape(parameter) + " ")
+ reordered_list.write("\n")
+ reordered_list.close()
+
+ #Expanding directory
+ expanded_list_name = os.path.join(abs_path, "expanded_list")
+ expanded_list = open(expanded_list_name, "w")
+
+ logging.info(" Expanding directory")
+ lines = open(reordered_list_name).readlines()
+ for line in lines:
+ if line.strip() == "":
+ continue
+ tokens = shlex.split(line)
+ if args.tool == "bambu" or args.tool == "zebu":
+ if(tokens[0][0] != '/'):
+ first_parameter = os.path.join(abs_benchmarks_root, tokens[0])
+ else:
+ first_parameter = tokens[0]
+ else:
+ first_parameter = tokens[0].replace("BENCHMARKS\_ROOT", abs_benchmarks_root)
+ other_parameters = tokens[1:len(tokens)]
+ if not os.path.exists(first_parameter) and (args.tool == "bambu" or args.tool == "zebu"):
+ logging.error(first_parameter + " does not exist")
+ sys.exit(1)
+ #Check if it is a directory or a file
+ if os.path.isdir(first_parameter):
+ logging.info(" " + tokens[0])
+ c_files = SearchCFiles(first_parameter)
+ c_files = sorted(c_files)
+ for c_file in c_files:
+ expanded_list.write(c_file)
+ for other_parameter in other_parameters:
+ expanded_list.write(" " + other_parameter.replace("BENCHMARKS\_ROOT", abs_benchmarks_root))
+ expanded_list.write("\n")
+ else:
+ expanded_list.write(first_parameter)
+ for other_parameter in other_parameters:
+ if ((other_parameter[-2:] == ".c") or (other_parameter[-2:] == ".C") or (other_parameter[-4:] == ".CPP") or (other_parameter[-4:] == ".cpp") or (other_parameter[-4:] == ".cxx") or (other_parameter[-3:] == ".cc") or (other_parameter[-4:] == ".c++") or other_parameter[-4:] == ".xml") and other_parameter[0] != '\\':
+ if other_parameter[0] == '/':
+ expanded_list.write(" " + other_parameter)
+ else:
+ expanded_list.write(" " + os.path.join(abs_benchmarks_root, other_parameter))
+ else:
+ expanded_list.write(" " + other_parameter.replace("BENCHMARKS\_ROOT", abs_benchmarks_root).replace("BENCHMARKS_ROOT", abs_benchmarks_root))
+ expanded_list.write("\n")
+ expanded_list.close()
+
+ #Adding parameters
+ logging.info(" Considering all tool arguments")
+ arg_lists = args.args
+ if not arg_lists:
+ arg_lists = [("")]
+ arged_list_name = os.path.join(abs_path, "arged_list")
+ arged_list = open(arged_list_name, "w")
+ lines = open(expanded_list_name).readlines()
+ for arg_list in arg_lists:
+ for line in lines:
+ arged_list.write(line.rstrip())
+ if len(arg_list) > 0:
+ arg = arg_list[0]
+ if arg[0] == "\"":
+ arg = arg[1:-1]
+ arged_list.write(" " + arg)
+ if args.commonargs != None and len(args.commonargs) > 0:
+ for commonarg in args.commonargs:
+ arged_list.write(" " + commonarg[0].replace("#", " "))
+ arged_list.write("\n")
+ arged_list.close()
+
+ #Name of benchmarks
+ full_names = set()
+
+
+ #Adding benchmark name
+ logging.info(" Adding benchmark name")
+ named_list_name = os.path.join(abs_path, "named_list")
+ named_list = open(named_list_name, "w")
+ lines = open(arged_list_name).readlines()
+ for line in lines:
+ named_list.write(line.rstrip())
+ #Retrieve configuration name and benchmark name
+ configuration_name = ""
+ benchmark_name = ""
+ tokens = shlex.split(line)
+ for token in tokens:
+ if token.find("--configuration-name") != -1:
+ configuration_name = token[len("--configuration-name="):]
+ if token.find("--benchmark-name") != -1:
+ benchmark_name = token[len("--benchmark-name="):]
+ if benchmark_name == "":
+ if args.tool != "bambu" and args.tool != "zebu":
+ logging.error("Missing benchmark name")
+ sys.exit(1)
+ benchmark_name = os.path.basename(line.split()[0])[:-2]
+ named_list.write(" --benchmark-name=" + benchmark_name)
+ full_name = configuration_name + ":" + benchmark_name
+ logging.info(" " + full_name)
+ if full_name in full_names:
+ logging.error("Duplicated configuration name - benchmark name: " + full_name)
+ sys.exit(1)
+ full_names.add(full_name)
+ named_list.write("\n")
+ named_list.close()
+
+
+ #Generating folder
+ logging.info(" Generating output directories")
+ lines = open(named_list_name).readlines()
+ for line in lines:
+ new_dir = ComputeDirectory(line)
+ logging.info(" Creating directory " + new_dir)
+ os.makedirs(new_dir)
+else:
+ logging.info(" Skipping generation of lists and directories")
+ named_list_name = os.path.join(abs_path, "named_list")
+ if not os.path.exists(named_list_name):
+ logging.error("List of previous run not found")
+ sys.exit(1)
+
+#Create threads
+logging.info(" Launching tool")
+lock = threading.RLock()
+lock_creation_destruction = threading.RLock()
+passed_benchmark = 0
+total_benchmark = 0
+threads = []
+children = [None] * n_jobs
+for thread_index in range(n_jobs):
+ threads.insert(thread_index, threading.Thread(target=execute_tests, args=(named_list_name, thread_index)))
+ threads[thread_index].daemon=True
+ threads[thread_index].start()
+
+try:
+ #Wait threads
+ for thread_index in range(n_jobs):
+ while threads[thread_index].isAlive():
+ threads[thread_index].join(100)
+except KeyboardInterrupt:
+ logging.error("SIGINT received")
+ failure = True
+ for local_thread_index in range(n_jobs):
+ if children[local_thread_index] != None:
+ if children[local_thread_index].poll() == None:
+ try:
+ kill_proc_tree(children[local_thread_index].pid)
+ except OSError:
+ pass
+ sys.exit(1)
+
+#Collect results
+CollectResults(abs_path)
+
+#In case, it create the JUnit file
+if args.junitdir != "":
+ junit_file = open(junit_file_name, "w")
+ junit_file.write("\n")
+ junit_file.write("\n")
+ CreateJunitBody(abs_path,junit_file)
+ junit_file.write("\n")
+
+#In case, it create the PerfPublisher file
+if args.perfpublisherdir != "":
+ perfpublisher_file = open(perfpublisher_file_name, "w")
+ perfpublisher_file.write("\n")
+ perfpublisher_file.write("\n")
+ CreatePerfPublisherBody(abs_path,perfpublisher_file)
+ perfpublisher_file.write("\n")
+
+#Prepare final report
+if args.tool == "bambu" or args.tool == "zebu":
+ report_file_name = os.path.join(abs_path, "report")
+ report_file = open(report_file_name)
+ lines = report_file.readlines()
+ report_file.close()
+ report_file = open(report_file_name, "w")
+ command = [tool_exe, "--version"]
+ subprocess.call(command, stderr=report_file, stdout=report_file)
+ report_file.write("SYSTEM INFORMATION:\n")
+ report_file.flush()
+ command = ["lsb_release", "-a"]
+ subprocess.call(command, stderr=report_file, stdout=report_file)
+ report_file.write("\n")
+ report_file.write("CURRENT TIME:\n")
+ report_file.write(str(datetime.datetime.now())+ "\n\n")
+ report_file.write("PASSED TESTS:\n")
+ report_file.write(str(passed_benchmark) + "/" + str(total_benchmark) + "\n\n")
+
+ failed_counter_file_name = os.path.join(abs_path, "failed_counter")
+ failed_counter_file = open(failed_counter_file_name, "w")
+ failed_counter_file.write(str(total_benchmark - passed_benchmark))
+ failed_counter_file.close()
+
+ for line in lines:
+ report_file.write(line)
+ report_file.close()
+
+if args.mail != None:
+ outcome = ""
+ if args.stop:
+ if failure:
+ outcome = "FAILURE"
+ else:
+ outcome = "SUCCESS"
+ else:
+ outcome = str(passed_benchmark) + "/" + str(total_benchmark)
+ full_name = ""
+ if len(args.name):
+ for name in args.name:
+ full_name = full_name + name[0]
+ else:
+ full_name = "Bambu"
+ local_command = "cat " + report_file_name + " | mutt -s \"" + full_name + ": " + outcome + "\" " + args.mail
+ subprocess.call(local_command, shell=True)
+if failure:
+ sys.exit(1)
+sys.exit(0)
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise1/bambu.sh b/documentation/tutorial_pact_2022/04-simd/Exercise1/bambu.sh
new file mode 100755
index 000000000..d78d048a4
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise1/bambu.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)
+bambu ${root_dir}/histogram.c \
+ --compiler=I386_GCC49 --experimental-setup=BAMBU-BALANCED-MP \
+ --device-name=5SGXEA7N2F45C1 --clock-period=10 \
+ -fwhole-program -fno-delete-null-pointer-checks -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 \
+ --simulate \
+ "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise1/histogram.c b/documentation/tutorial_pact_2022/04-simd/Exercise1/histogram.c
new file mode 100644
index 000000000..0f4e651c9
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise1/histogram.c
@@ -0,0 +1,88 @@
+#define NUM_ACCELS 8
+#define MAX_NUM 100
+#define NUM_BINS 5
+#define BIN_MAX_NUM MAX_NUM/NUM_BINS
+#define ARRAY_SIZE 36000
+#define OPS_PER_ACCEL ARRAY_SIZE/NUM_ACCELS
+
+#include
+#include "histogram.h"
+
+void histogram (int * input, int * output, int max_idx)
+{
+ int i, num;
+ int temp0 = 0, temp1 = 0, temp2 = 0, temp3 = 0, temp4 = 0, temp5 = 0;
+ //make local variables here instead of reading and writing to global memory each time
+ for (i = 0; i < max_idx; i++)
+ {
+ num = input[i];
+ if (num > 0 && num <= BIN_MAX_NUM)
+ {
+ temp0 += 1;
+ }
+ else if (num > BIN_MAX_NUM && num <= (BIN_MAX_NUM * 2))
+ {
+ temp1 += 1;
+ }
+ else if (num > (BIN_MAX_NUM * 2) && num <= (BIN_MAX_NUM * 3))
+ {
+ temp2 += 1;
+ }
+ else if (num > (BIN_MAX_NUM * 3) && num <= (BIN_MAX_NUM * 4))
+ {
+ temp3 += 1;
+ }
+ else
+ {
+ temp4 += 1;
+ }
+ }
+ printf("%d\n", temp0);
+ output[0] += temp0;
+ output[1] += temp1;
+ output[2] += temp2;
+ output[3] += temp3;
+ output[4] += temp4;
+
+}
+
+int main ()
+{
+
+ int i, j;
+ int main_result = 0;
+
+ #pragma omp simd
+ for (i = 0; i < NUM_ACCELS; i++)
+ {
+ histogram(input_array + OPS_PER_ACCEL * i, output_array_accel + i * NUM_BINS, OPS_PER_ACCEL);
+ }
+
+ //combine the results
+ for (i = 0; i < NUM_BINS; i++)
+ {
+ for (j = 0; j < NUM_ACCELS; j++)
+ {
+ output_array[i] += output_array_accel[i + j * NUM_BINS];
+ }
+ }
+
+ //check the results
+ for (i = 0; i < NUM_BINS; i++)
+ {
+ main_result += (output_array[i] == expected_array[i]);
+ }
+
+ //check final result
+ printf ("Result: %d\n", main_result);
+ if (main_result == NUM_BINS)
+ {
+ printf("RESULT: PASS\n");
+ return 0;
+ }
+ else
+ {
+ printf("RESULT: FAIL\n");
+ return 1;
+ }
+}
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise1/histogram.h b/documentation/tutorial_pact_2022/04-simd/Exercise1/histogram.h
new file mode 100644
index 000000000..ff015af91
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise1/histogram.h
@@ -0,0 +1,6 @@
+int input_array[ARRAY_SIZE] = {84, 87, 78, 16, 94, 36, 87, 93, 50, 22, 63, 28, 91, 60, 64, 27, 41, 27, 73, 37, 12, 69, 68, 30, 83, 31, 63, 24, 68, 36, 30, 3, 23, 59, 70, 68, 94, 57, 12, 43, 30, 74, 22, 20, 85, 38, 99, 25, 16, 71, 14, 27, 92, 81, 57, 74, 63, 71, 97, 82, 6, 26, 85, 28, 37, 6, 47, 30, 14, 58, 25, 96, 83, 46, 15, 68, 35, 65, 44, 51, 88, 9, 77, 79, 89, 85, 4, 52, 55, 100, 33, 61, 77, 69, 40, 13, 27, 87, 95, 40, 96, 71, 35, 79, 68, 2, 98, 3, 18, 93, 53, 57, 2, 81, 87, 42, 66, 90, 45, 20, 41, 30, 32, 18, 98, 72, 82, 76, 10, 28, 68, 57, 98, 54, 87, 66, 7, 84, 20, 25, 29, 72, 33, 30, 4, 20, 71, 69, 9, 16, 41, 50, 97, 24, 19, 46, 47, 52, 22, 56, 80, 89, 65, 29, 42, 51, 94, 1, 35, 65, 25, 15, 88, 57, 44, 92, 28, 66, 60, 37, 33, 52, 38, 29, 76, 8, 75, 22, 59, 96, 30, 38, 36, 94, 19, 29, 44, 12, 29, 30, 77, 5, 44, 64, 14, 39, 7, 41, 5, 19, 29, 89, 70, 18, 18, 97, 25, 44, 71, 84, 91, 100, 73, 26, 45, 91, 6, 40, 55, 87, 70, 83, 43, 65, 98, 8, 56, 5, 49, 12, 23, 29, 100, 44, 47, 69, 41, 23, 12, 11, 6, 2, 62, 31, 79, 6, 21, 37, 45, 27, 23, 66, 9, 17, 83, 59, 25, 38, 63, 25, 1, 37, 53, 100, 80, 51, 69, 72, 74, 32, 82, 31, 34, 95, 61, 64, 100, 82, 100, 97, 60, 74, 14, 69, 91, 96, 27, 67, 85, 41, 91, 85, 77, 43, 37, 8, 46, 57, 80, 19, 88, 13, 49, 73, 60, 10, 37, 11, 43, 88, 7, 2, 14, 73, 22, 56, 20, 100, 22, 5, 40, 12, 41, 68, 6, 29, 28, 51, 85, 59, 21, 25, 23, 70, 97, 82, 31, 85, 93, 73, 73, 51, 26, 86, 23, 100, 41, 43, 99, 14, 99, 91, 25, 91, 10, 82, 20, 37, 33, 56, 95, 5, 80, 70, 74, 77, 51, 56, 61, 43, 80, 85, 94, 6, 22, 68, 5, 14, 62, 55, 27, 60, 45, 3, 3, 7, 85, 22, 43, 69, 29, 90, 73, 9, 59, 99, 37, 9, 54, 49, 4, 34, 34, 49, 91, 55, 68, 47, 69, 30, 1, 47, 89, 98, 50, 91, 4, 34, 64, 98, 54, 93, 87, 26, 53, 97, 76, 89, 58, 30, 37, 61, 15, 22, 61, 5, 29, 28, 51, 49, 57, 3, 95, 98, 100, 44, 40, 3, 29, 4, 1, 82, 48, 39, 60, 52, 36, 35, 40, 93, 16, 28, 5, 30, 50, 65, 86, 30, 44, 36, 78, 1, 39, 72, 50, 90, 68, 89, 93, 96, 44, 45, 30, 91, 83, 41, 42, 70, 27, 33, 62, 43, 61, 18, 24, 62, 82, 10, 91, 26, 97, 68, 78, 35, 91, 27, 25, 58, 15, 69, 6, 59, 13, 87, 1, 47, 27, 95, 17, 53, 79, 30, 47, 91, 48, 71, 52, 81, 32, 94, 58, 28, 13, 87, 15, 56, 13, 91, 13, 80, 11, 70, 90, 75, 56, 42, 21, 34, 88, 89, 39, 67, 71, 85, 57, 18, 7, 61, 50, 38, 6, 60, 18, 19, 46, 84, 74, 59, 74, 38, 90, 84, 8, 79, 58, 15, 72, 30, 1, 60, 19, 39, 26, 89, 75, 34, 58, 82, 94, 59, 71, 100, 18, 40, 70, 64, 23, 95, 74, 48, 32, 63, 83, 91, 93, 92, 58, 16, 22, 58, 75, 92, 48, 52, 32, 22, 38, 41, 55, 31, 99, 26, 82, 17, 17, 3, 32, 40, 97, 5, 39, 81, 19, 22, 71, 63, 13, 80, 78, 86, 37, 5, 77, 84, 8, 60, 58, 45, 100, 12, 28, 51, 37, 61, 19, 6, 64, 50, 45, 12, 6, 35, 92, 76, 56, 15, 90, 69, 94, 19, 6, 83, 23, 83, 18, 31, 94, 75, 27, 94, 87, 54, 44, 75, 15, 14, 80, 78, 63, 76, 89, 20, 11, 33, 95, 18, 47, 36, 38, 92, 54, 44, 74, 29, 26, 92, 11, 19, 18, 37, 64, 56, 91, 59, 31, 5, 72, 62, 34, 86, 90, 74, 5, 52, 6, 51, 69, 4, 86, 7, 96, 40, 50, 21, 68, 27, 64, 78, 97, 82, 66, 61, 37, 56, 71, 19, 12, 43, 33, 97, 80, 22, 71, 85, 73, 28, 35, 41, 84, 73, 99, 31, 64, 48, 51, 31, 74, 15, 60, 23, 48, 25, 83, 36, 33, 5, 55, 44, 99, 87, 41, 79, 60, 63, 63, 84, 42, 49, 24, 25, 73, 23, 55, 36, 22, 58, 66, 48, 72, 77, 70, 19, 2, 4, 54, 34, 8, 60, 29, 7, 98, 21, 85, 9, 35, 99, 92, 77, 99, 16, 53, 72, 90, 60, 7, 11, 17, 25, 10, 40, 1, 79, 10, 54, 82, 15, 39, 90, 27, 68, 48, 24, 88, 32, 33, 23, 82, 76, 51, 80, 91, 55, 51, 32, 14, 58, 95, 82, 82, 4, 21, 34, 83, 82, 88, 16, 97, 26, 5, 23, 93, 52, 98, 33, 35, 82, 7, 16, 58, 9, 96, 100, 63, 98, 84, 77, 55, 78, 10, 88, 33, 83, 22, 67, 64, 61, 83, 12, 86, 87, 86, 31, 91, 84, 15, 77, 17, 21, 93, 26, 29, 40, 26, 91, 37, 61, 19, 44, 38, 29, 83, 22, 11, 56, 89, 26, 16, 71, 38, 54, 9, 23, 84, 51, 58, 98, 28, 27, 70, 72, 52, 50, 11, 29, 40, 99, 89, 11, 94, 78, 91, 77, 100, 53, 32, 88, 78, 100, 58, 67, 53, 18, 42, 36, 69, 99, 85, 96, 77, 6, 67, 29, 55, 29, 9, 94, 79, 98, 56, 73, 75, 46, 1, 26, 98, 84, 13, 28, 83, 22, 94, 35, 40, 35, 22, 60, 86, 58, 55, 62, 63, 73, 42, 17, 53, 51, 63, 83, 100, 18, 55, 74, 16, 7, 52, 65, 91, 64, 92, 73, 38, 38, 60, 29, 72, 81, 88, 57, 91, 42, 71, 53, 66, 12, 70, 18, 62, 84, 52, 13, 1, 7, 39, 68, 65, 90, 33, 55, 5, 76, 80, 42, 13, 39, 70, 37, 71, 57, 45, 61, 50, 15, 66, 15, 27, 87, 84, 40, 70, 36, 53, 22, 94, 91, 90, 10, 32, 74, 65, 36, 49, 96, 78, 14, 34, 99, 50, 56, 56, 94, 69, 57, 61, 34, 24, 87, 72, 59, 78, 41, 46, 82, 62, 91, 24, 51, 1, 55, 76, 65, 43, 25, 60, 20, 90, 45, 70, 39, 52, 77, 84, 20, 34, 44, 5, 57, 82, 76, 67, 12, 68, 13, 93, 30, 3, 69, 32, 3, 75, 8, 19, 17, 84, 78, 88, 73, 74, 58, 63, 26, 34, 98, 97, 19, 42, 54, 27, 75, 81, 94, 86, 49, 6, 31, 30, 60, 99, 61, 63, 25, 20, 81, 42, 3, 11, 81, 27, 84, 90, 41, 9, 24, 39, 58, 94, 32, 11, 21, 6, 91, 14, 92, 39, 71, 22, 68, 30, 72, 81, 44, 96, 100, 25, 89, 55, 87, 70, 33, 70, 11, 74, 31, 34, 64, 88, 80, 95, 50, 100, 52, 40, 65, 43, 31, 87, 16, 50, 16, 87, 82, 12, 35, 34, 88, 23, 88, 74, 44, 20, 43, 55, 45, 25, 40, 60, 64, 19, 54, 13, 70, 6, 5, 34, 100, 35, 20, 16, 36, 88, 54, 70, 51, 88, 3, 38, 63, 90, 11, 6, 61, 5, 12, 58, 30, 4, 17, 93, 22, 23, 6, 44, 80, 62, 29, 79, 48, 1, 46, 83, 88, 100, 52, 90, 87, 54, 27, 49, 95, 37, 7, 8, 93, 18, 65, 22, 21, 81, 67, 95, 55, 24, 38, 34, 85, 18, 13, 32, 18, 10, 66, 57, 9, 70, 46, 96, 23, 72, 96, 70, 60, 2, 77, 53, 72, 41, 26, 44, 73, 92, 90, 28, 67, 79, 13, 51, 97, 25, 34, 14, 87, 100, 71, 95, 69, 16, 42, 43, 40, 38, 64, 99, 91, 40, 3, 14, 32, 29, 58, 5, 72, 47, 84, 39, 26, 96, 41, 22, 73, 27, 35, 59, 26, 57, 53, 46, 73, 47, 40, 12, 84, 4, 62, 26, 43, 17, 40, 75, 45, 97, 31, 68, 95, 14, 58, 20, 61, 51, 93, 33, 77, 80, 91, 54, 36, 96, 99, 8, 42, 38, 71, 77, 41, 85, 2, 84, 1, 93, 10, 97, 41, 40, 64, 36, 5, 74, 7, 65, 24, 52, 50, 52, 31, 40, 5, 66, 87, 3, 26, 80, 92, 48, 8, 85, 32, 62, 20, 32, 54, 29, 28, 95, 20, 44, 82, 24, 69, 88, 40, 44, 39, 89, 95, 21, 81, 99, 87, 19, 53, 64, 99, 96, 11, 6, 80, 43, 67, 99, 26, 73, 79, 54, 67, 98, 49, 48, 73, 17, 87, 13, 60, 78, 1, 54, 98, 33, 4, 36, 52, 8, 99, 50, 55, 62, 7, 35, 4, 26, 85, 29, 98, 64, 34, 16, 61, 82, 15, 86, 98, 1, 98, 9, 30, 50, 14, 80, 35, 17, 15, 86, 76, 66, 87, 31, 27, 93, 17, 30, 70, 53, 10, 67, 16, 96, 34, 29, 77, 48, 14, 27, 1, 63, 87, 30, 64, 1, 9, 98, 17, 76, 83, 45, 41, 21, 27, 19, 66, 95, 100, 35, 47, 9, 54, 63, 4, 87, 43, 33, 35, 8, 11, 35, 70, 97, 16, 85, 97, 25, 83, 66, 52, 17, 62, 44, 38, 88, 62, 3, 82, 61, 89, 80, 21, 42, 94, 25, 29, 36, 9, 63, 43, 71, 97, 64, 67, 12, 1, 16, 88, 35, 33, 91, 51, 94, 34, 40, 81, 95, 94, 14, 55, 83, 45, 76, 24, 39, 52, 52, 74, 12, 66, 69, 82, 14, 84, 100, 78, 36, 15, 65, 70, 47, 8, 73, 92, 41, 12, 24, 88, 58, 37, 94, 40, 82, 21, 15, 72, 72, 19, 97, 35, 84, 65, 68, 98, 1, 68, 75, 36, 34, 91, 58, 33, 50, 30, 24, 91, 93, 48, 30, 50, 36, 23, 41, 69, 44, 56, 40, 67, 26, 37, 54, 61, 53, 21, 58, 5, 88, 84, 41, 22, 27, 98, 6, 28, 79, 29, 70, 71, 28, 99, 21, 64, 22, 61, 84, 17, 68, 24, 83, 93, 12, 36, 54, 64, 9, 63, 69, 96, 99, 61, 69, 77, 10, 74, 4, 88, 55, 74, 58, 82, 24, 30, 97, 45, 43, 81, 13, 10, 56, 48, 55, 67, 35, 60, 82, 43, 74, 2, 39, 72, 14, 59, 100, 23, 85, 56, 62, 91, 81, 72, 24, 4, 1, 21, 1, 43, 53, 13, 5, 8, 60, 59, 26, 95, 18, 59, 37, 91, 61, 27, 15, 74, 38, 66, 49, 22, 21, 10, 64, 1, 33, 87, 5, 34, 59, 57, 28, 11, 69, 32, 70, 29, 42, 47, 75, 59, 6, 11, 2, 66, 90, 68, 91, 27, 33, 39, 100, 6, 1, 63, 58, 33, 49, 62, 18, 8, 70, 98, 70, 39, 29, 40, 19, 71, 86, 93, 81, 43, 55, 34, 8, 44, 1, 51, 22, 86, 89, 21, 91, 41, 35, 48, 26, 84, 62, 95, 43, 31, 92, 64, 21, 21, 55, 39, 43, 93, 31, 23, 35, 86, 9, 95, 81, 9, 45, 3, 46, 85, 23, 88, 26, 58, 36, 3, 93, 49, 97, 87, 31, 41, 50, 52, 13, 57, 90, 55, 49, 73, 29, 83, 58, 89, 77, 38, 98, 21, 40, 95, 6, 15, 83, 83, 24, 70, 37, 16, 18, 85, 54, 100, 25, 55, 51, 37, 11, 93, 43, 59, 65, 24, 42, 22, 12, 70, 11, 61, 91, 3, 56, 48, 17, 90, 82, 40, 59, 18, 7, 76, 2, 12, 75, 79, 66, 78, 67, 77, 70, 62, 35, 34, 37, 28, 7, 100, 98, 17, 61, 40, 71, 68, 87, 87, 9, 68, 78, 67, 37, 36, 94, 38, 47, 20, 68, 13, 97, 35, 41, 18, 96, 75, 51, 32, 3, 9, 31, 52, 26, 43, 91, 48, 62, 77, 35, 70, 96, 64, 36, 32, 52, 81, 21, 98, 1, 89, 62, 97, 75, 2, 15, 70, 29, 17, 53, 83, 26, 83, 34, 3, 78, 24, 50, 91, 52, 36, 61, 47, 100, 48, 30, 3, 29, 50, 100, 29, 90, 14, 77, 64, 67, 91, 85, 95, 60, 37, 77, 85, 72, 10, 39, 1, 85, 40, 91, 36, 76, 51, 82, 27, 51, 63, 29, 79, 65, 80, 59, 54, 45, 35, 70, 12, 78, 6, 58, 37, 43, 35, 73, 66, 96, 11, 66, 33, 50, 8, 68, 77, 59, 2, 3, 61, 64, 83, 39, 28, 15, 97, 34, 59, 31, 55, 70, 8, 60, 28, 96, 2, 14, 68, 19, 61, 30, 36, 93, 32, 44, 13, 8, 54, 14, 63, 14, 29, 97, 52, 57, 11, 100, 42, 70, 82, 96, 91, 90, 55, 70, 37, 9, 83, 5, 27, 96, 34, 15, 88, 65, 58, 52, 25, 11, 65, 39, 24, 94, 35, 27, 2, 46, 26, 95, 67, 7, 90, 57, 48, 96, 27, 85, 4, 61, 41, 83, 56, 74, 49, 96, 91, 6, 47, 67, 68, 64, 5, 91, 9, 91, 69, 62, 36, 94, 56, 2, 52, 45, 11, 52, 92, 89, 36, 48, 49, 76, 82, 57, 1, 30, 52, 43, 35, 50, 61, 2, 65, 65, 44, 73, 56, 12, 34, 43, 57, 41, 97, 60, 37, 59, 11, 29, 47, 98, 76, 95, 25, 57, 51, 26, 86, 54, 20, 72, 56, 81, 25, 20, 97, 68, 45, 4, 31, 30, 47, 87, 71, 95, 46, 59, 53, 9, 87, 99, 6, 14, 45, 31, 22, 48, 8, 59, 1, 79, 30, 8, 59, 54, 80, 8, 73, 76, 11, 3, 5, 9, 41, 27, 3, 87, 86, 7, 47, 24, 5, 52, 38, 2, 34, 11, 49, 93, 70, 1, 72, 51, 9, 82, 57, 88, 89, 29, 63, 52, 84, 19, 60, 24, 46, 15, 62, 83, 73, 8, 58, 30, 12, 95, 31, 45, 58, 79, 38, 27, 79, 61, 29, 87, 42, 85, 26, 83, 66, 40, 34, 49, 59, 45, 24, 56, 11, 86, 90, 84, 45, 47, 13, 56, 94, 43, 1, 51, 21, 90, 29, 51, 50, 57, 38, 43, 42, 15, 25, 59, 55, 10, 59, 65, 55, 82, 20, 17, 19, 61, 100, 64, 7, 64, 19, 100, 6, 71, 2, 78, 12, 30, 29, 13, 87, 18, 56, 80, 84, 80, 90, 38, 90, 48, 54, 96, 81, 25, 12, 100, 85, 12, 15, 44, 27, 85, 43, 33, 8, 97, 62, 19, 26, 42, 32, 64, 11, 87, 95, 95, 18, 36, 84, 59, 83, 38, 54, 16, 14, 18, 15, 99, 81, 81, 42, 7, 65, 36, 39, 24, 32, 53, 43, 10, 46, 26, 25, 57, 64, 72, 3, 81, 7, 86, 92, 90, 75, 45, 57, 89, 62, 71, 39, 42, 3, 80, 49, 19, 67, 39, 43, 51, 43, 85, 60, 89, 62, 36, 97, 25, 7, 99, 57, 14, 36, 48, 55, 63, 45, 11, 3, 58, 33, 41, 52, 87, 72, 100, 5, 90, 90, 47, 40, 85, 83, 51, 73, 44, 87, 69, 20, 93, 19, 77, 58, 54, 76, 64, 16, 20, 26, 70, 78, 10, 10, 81, 96, 33, 32, 1, 23, 21, 47, 14, 57, 30, 65, 29, 25, 51, 49, 45, 95, 19, 73, 5, 73, 48, 68, 40, 20, 94, 10, 49, 55, 71, 29, 51, 56, 60, 51, 30, 32, 49, 43, 89, 78, 7, 69, 55, 9, 70, 99, 4, 88, 71, 8, 12, 70, 27, 4, 41, 72, 65, 89, 27, 87, 17, 77, 42, 28, 79, 23, 60, 27, 66, 100, 5, 24, 68, 59, 33, 89, 9, 88, 77, 31, 95, 40, 52, 73, 43, 93, 45, 7, 81, 23, 94, 50, 99, 87, 29, 77, 10, 88, 3, 27, 39, 59, 50, 59, 69, 82, 47, 29, 21, 75, 59, 15, 15, 63, 40, 57, 55, 36, 16, 35, 58, 61, 36, 8, 47, 65, 84, 56, 4, 38, 34, 43, 49, 84, 1, 69, 17, 47, 50, 38, 22, 60, 4, 88, 22, 43, 44, 76, 78, 11, 63, 87, 71, 98, 94, 18, 62, 29, 25, 18, 67, 59, 60, 67, 94, 60, 87, 10, 58, 36, 47, 31, 96, 3, 18, 17, 97, 14, 93, 75, 24, 7, 61, 95, 4, 7, 64, 18, 35, 40, 35, 53, 50, 94, 19, 43, 5, 6, 5, 14, 93, 3, 45, 88, 5, 62, 57, 2, 27, 49, 28, 51, 55, 40, 97, 10, 46, 12, 27, 81, 3, 13, 33, 53, 58, 4, 47, 62, 61, 51, 28, 53, 54, 72, 41, 58, 85, 49, 11, 12, 49, 38, 14, 55, 78, 62, 64, 75, 25, 43, 55, 27, 55, 40, 79, 65, 43, 26, 78, 3, 28, 5, 55, 81, 76, 47, 91, 61, 95, 1, 24, 43, 91, 89, 97, 20, 50, 13, 94, 26, 55, 49, 52, 61, 88, 83, 25, 30, 60, 3, 84, 87, 7, 38, 68, 35, 37, 10, 47, 31, 10, 70, 26, 52, 58, 74, 71, 59, 86, 65, 84, 40, 65, 87, 53, 4, 69, 77, 33, 28, 31, 68, 67, 38, 5, 34, 72, 93, 95, 18, 76, 56, 39, 1, 8, 48, 74, 78, 58, 60, 94, 93, 51, 58, 79, 3, 61, 48, 32, 45, 27, 62, 12, 93, 99, 69, 78, 22, 61, 72, 91, 88, 80, 81, 88, 87, 80, 14, 64, 37, 25, 10, 29, 75, 67, 60, 30, 28, 59, 61, 72, 85, 74, 36, 30, 25, 4, 59, 46, 16, 83, 89, 4, 62, 69, 43, 48, 1, 56, 63, 37, 32, 72, 18, 59, 39, 77, 88, 18, 35, 100, 41, 71, 73, 28, 52, 97, 83, 11, 95, 99, 93, 83, 54, 54, 3, 48, 53, 55, 56, 15, 92, 87, 39, 61, 45, 29, 89, 84, 46, 23, 35, 38, 45, 8, 66, 97, 56, 48, 7, 50, 98, 51, 84, 3, 4, 39, 51, 56, 93, 6, 22, 36, 92, 12, 96, 89, 40, 84, 24, 37, 58, 59, 27, 3, 66, 92, 51, 21, 91, 9, 23, 89, 59, 58, 91, 62, 96, 41, 69, 41, 98, 42, 76, 42, 54, 24, 30, 45, 59, 53, 34, 17, 11, 60, 71, 28, 51, 73, 1, 41, 81, 75, 81, 39, 32, 72, 100, 80, 64, 20, 20, 62, 13, 47, 55, 18, 70, 84, 63, 29, 88, 96, 97, 51, 55, 67, 30, 57, 39, 30, 97, 19, 56, 30, 9, 88, 1, 8, 19, 16, 79, 38, 29, 91, 36, 83, 9, 6, 18, 23, 86, 58, 70, 82, 8, 24, 100, 37, 80, 90, 19, 28, 8, 74, 57, 16, 13, 9, 75, 31, 77, 5, 20, 57, 47, 56, 40, 7, 13, 9, 29, 98, 66, 98, 31, 73, 73, 30, 62, 4, 19, 32, 84, 78, 57, 92, 45, 70, 53, 71, 52, 29, 27, 24, 85, 73, 31, 76, 80, 95, 85, 60, 92, 50, 10, 74, 75, 82, 3, 36, 38, 73, 67, 21, 2, 75, 12, 46, 44, 16, 68, 48, 44, 94, 23, 81, 18, 5, 8, 97, 99, 92, 9, 90, 94, 18, 63, 68, 51, 17, 55, 88, 41, 73, 60, 42, 47, 24, 39, 43, 39, 6, 90, 83, 51, 64, 15, 68, 68, 22, 17, 66, 66, 25, 7, 59, 42, 21, 26, 92, 89, 80, 32, 29, 52, 91, 70, 98, 14, 60, 92, 53, 17, 33, 87, 67, 96, 1, 86, 15, 74, 2, 80, 39, 78, 38, 97, 19, 58, 74, 63, 46, 5, 94, 26, 8, 36, 47, 6, 50, 6, 49, 54, 74, 82, 40, 40, 77, 92, 78, 92, 65, 31, 23, 56, 9, 61, 52, 27, 70, 78, 41, 16, 82, 34, 93, 90, 70, 40, 47, 71, 97, 95, 24, 71, 76, 15, 62, 5, 6, 39, 96, 22, 70, 70, 77, 78, 30, 81, 56, 100, 58, 97, 67, 39, 82, 59, 80, 3, 50, 26, 25, 47, 73, 48, 17, 48, 62, 78, 52, 19, 17, 99, 41, 38, 69, 17, 67, 50, 97, 22, 49, 6, 70, 67, 97, 52, 78, 76, 6, 27, 54, 31, 73, 26, 30, 89, 73, 44, 19, 77, 62, 87, 27, 2, 24, 95, 71, 90, 97, 19, 63, 97, 25, 33, 64, 21, 36, 41, 48, 93, 19, 1, 23, 44, 26, 5, 84, 51, 48, 2, 79, 9, 88, 5, 63, 63, 52, 33, 52, 48, 3, 67, 44, 27, 51, 59, 99, 38, 51, 99, 30, 70, 99, 5, 13, 77, 9, 48, 79, 56, 50, 9, 64, 37, 65, 78, 52, 16, 10, 55, 15, 13, 21, 11, 91, 71, 69, 42, 8, 72, 40, 90, 41, 90, 94, 5, 18, 54, 52, 48, 9, 53, 56, 24, 42, 73, 2, 93, 40, 63, 47, 55, 27, 20, 17, 70, 90, 85, 11, 50, 56, 2, 91, 48, 43, 84, 4, 13, 89, 8, 12, 97, 12, 20, 72, 53, 92, 25, 97, 31, 88, 44, 37, 66, 63, 53, 35, 4, 90, 97, 5, 97, 98, 95, 97, 93, 30, 100, 57, 18, 59, 68, 66, 23, 87, 38, 75, 78, 62, 72, 9, 1, 67, 97, 67, 81, 50, 1, 36, 39, 98, 41, 35, 47, 87, 31, 91, 17, 83, 47, 86, 93, 15, 52, 15, 53, 41, 42, 31, 54, 65, 91, 55, 31, 87, 73, 63, 88, 73, 98, 26, 22, 90, 61, 21, 77, 43, 11, 93, 25, 10, 30, 70, 76, 81, 84, 28, 21, 25, 10, 75, 89, 100, 81, 71, 39, 53, 33, 26, 77, 83, 52, 99, 72, 64, 71, 48, 58, 33, 92, 35, 42, 22, 4, 17, 54, 39, 97, 27, 64, 6, 53, 4, 58, 33, 27, 96, 37, 59, 21, 13, 93, 24, 63, 65, 39, 33, 64, 49, 66, 8, 83, 59, 29, 38, 28, 34, 76, 24, 60, 91, 29, 12, 47, 86, 96, 73, 33, 32, 83, 6, 97, 76, 29, 59, 40, 20, 44, 55, 68, 61, 62, 2, 71, 42, 39, 98, 76, 14, 21, 87, 57, 2, 99, 3, 39, 46, 75, 24, 30, 57, 29, 26, 32, 9, 36, 23, 80, 31, 78, 47, 91, 91, 48, 14, 33, 38, 11, 8, 52, 84, 94, 8, 37, 44, 10, 27, 90, 36, 50, 19, 92, 78, 96, 24, 39, 31, 98, 18, 14, 75, 17, 56, 66, 16, 69, 50, 54, 80, 57, 57, 15, 2, 16, 51, 98, 77, 77, 39, 12, 27, 9, 3, 56, 4, 78, 94, 86, 76, 12, 99, 2, 28, 7, 19, 43, 75, 68, 48, 54, 24, 4, 68, 78, 19, 70, 27, 95, 47, 65, 6, 25, 73, 61, 80, 28, 38, 26, 65, 65, 37, 16, 67, 16, 22, 85, 10, 96, 53, 58, 2, 28, 61, 21, 57, 32, 91, 83, 26, 89, 47, 84, 13, 71, 44, 92, 50, 33, 17, 67, 98, 5, 82, 64, 72, 55, 100, 82, 2, 52, 91, 3, 32, 3, 76, 88, 34, 66, 71, 12, 6, 69, 47, 18, 92, 90, 61, 93, 74, 30, 59, 71, 34, 92, 86, 58, 98, 38, 91, 100, 89, 81, 54, 72, 35, 29, 60, 21, 46, 82, 84, 51, 2, 30, 20, 93, 71, 81, 38, 44, 10, 48, 67, 95, 40, 4, 4, 89, 41, 94, 88, 82, 26, 42, 53, 13, 22, 64, 33, 68, 45, 16, 70, 47, 45, 90, 91, 15, 22, 28, 10, 31, 76, 76, 77, 67, 32, 81, 55, 72, 26, 43, 5, 4, 36, 58, 16, 57, 73, 48, 76, 18, 15, 46, 64, 59, 87, 54, 25, 8, 82, 34, 90, 9, 62, 18, 75, 93, 50, 29, 16, 76, 23, 73, 31, 58, 82, 46, 67, 54, 93, 42, 71, 59, 39, 86, 17, 25, 40, 93, 84, 73, 78, 73, 33, 39, 43, 7, 83, 92, 87, 51, 19, 10, 23, 49, 19, 56, 46, 85, 9, 90, 79, 80, 48, 17, 65, 16, 94, 56, 8, 77, 80, 86, 2, 12, 76, 96, 70, 11, 87, 57, 13, 58, 18, 87, 58, 36, 42, 4, 73, 50, 93, 51, 81, 41, 19, 98, 56, 12, 5, 16, 41, 85, 1, 94, 48, 28, 89, 18, 38, 75, 74, 2, 84, 91, 88, 42, 78, 29, 97, 2, 31, 89, 4, 11, 81, 23, 60, 37, 86, 65, 4, 78, 1, 56, 71, 48, 83, 59, 65, 73, 86, 38, 74, 69, 80, 62, 62, 10, 90, 58, 11, 20, 47, 67, 83, 79, 89, 42, 67, 26, 58, 70, 4, 58, 25, 26, 6, 8, 85, 70, 32, 70, 60, 5, 90, 91, 66, 52, 52, 8, 9, 63, 79, 7, 29, 61, 86, 69, 55, 52, 46, 12, 22, 1, 70, 46, 27, 27, 5, 63, 96, 36, 32, 7, 41, 21, 50, 58, 24, 1, 17, 33, 15, 96, 91, 43, 8, 76, 63, 14, 80, 61, 78, 1, 61, 47, 98, 39, 25, 55, 1, 72, 90, 32, 79, 82, 5, 80, 92, 28, 80, 8, 12, 95, 55, 3, 89, 15, 30, 4, 80, 9, 64, 57, 61, 76, 55, 11, 15, 79, 65, 15, 51, 54, 99, 81, 88, 55, 60, 79, 34, 39, 38, 46, 85, 45, 100, 74, 59, 29, 29, 38, 90, 92, 47, 50, 19, 1, 60, 33, 80, 24, 100, 30, 30, 98, 10, 17, 4, 21, 47, 37, 59, 84, 34, 96, 28, 33, 21, 38, 14, 49, 28, 3, 92, 74, 4, 10, 26, 64, 43, 5, 39, 94, 86, 20, 43, 47, 88, 46, 67, 34, 82, 78, 70, 16, 73, 49, 100, 93, 39, 13, 41, 66, 15, 32, 91, 71, 93, 16, 34, 87, 73, 24, 80, 58, 96, 22, 5, 83, 19, 23, 69, 53, 100, 90, 20, 72, 90, 19, 16, 28, 84, 56, 45, 50, 39, 35, 20, 84, 3, 5, 70, 75, 29, 50, 84, 24, 23, 40, 58, 94, 63, 26, 46, 14, 67, 65, 38, 57, 35, 53, 84, 18, 61, 81, 68, 51, 67, 87, 34, 69, 92, 4, 95, 72, 5, 79, 47, 79, 18, 56, 72, 80, 34, 69, 94, 100, 85, 83, 56, 20, 35, 92, 89, 95, 72, 8, 98, 90, 95, 31, 59, 38, 86, 5, 61, 90, 83, 59, 21, 1, 14, 92, 32, 47, 13, 77, 47, 97, 59, 54, 68, 46, 45, 57, 92, 68, 64, 89, 10, 10, 20, 20, 99, 57, 24, 59, 99, 7, 17, 19, 59, 83, 62, 42, 29, 74, 19, 27, 71, 29, 81, 38, 74, 77, 46, 66, 97, 10, 54, 6, 71, 25, 25, 70, 34, 48, 28, 32, 6, 97, 50, 64, 79, 11, 58, 59, 37, 76, 86, 59, 4, 66, 48, 30, 42, 94, 95, 38, 55, 100, 95, 25, 77, 19, 46, 10, 19, 26, 93, 24, 22, 42, 40, 52, 4, 97, 10, 92, 24, 95, 50, 79, 12, 98, 60, 54, 91, 54, 43, 97, 6, 90, 73, 34, 8, 19, 95, 78, 44, 87, 54, 17, 80, 93, 68, 83, 41, 29, 75, 16, 24, 76, 46, 35, 73, 6, 40, 15, 11, 35, 11, 16, 24, 36, 1, 83, 54, 95, 61, 97, 33, 14, 13, 12, 58, 32, 95, 50, 60, 21, 17, 35, 96, 62, 22, 21, 67, 13, 87, 78, 47, 50, 45, 22, 85, 46, 57, 38, 92, 17, 86, 25, 82, 50, 88, 91, 81, 82, 92, 92, 54, 8, 27, 2, 69, 48, 74, 88, 12, 60, 65, 11, 9, 61, 32, 45, 58, 88, 34, 50, 56, 19, 26, 89, 68, 13, 79, 100, 47, 70, 92, 52, 29, 70, 5, 98, 69, 78, 85, 80, 90, 1, 90, 50, 61, 74, 95, 19, 13, 28, 20, 21, 47, 97, 9, 66, 61, 40, 18, 7, 61, 9, 11, 90, 30, 15, 39, 98, 93, 75, 29, 82, 75, 19, 31, 87, 44, 77, 57, 56, 5, 28, 28, 3, 76, 37, 20, 37, 28, 37, 95, 88, 45, 5, 77, 74, 20, 67, 23, 64, 41, 52, 97, 67, 22, 79, 6, 65, 56, 62, 72, 12, 42, 100, 14, 17, 88, 33, 5, 15, 22, 100, 2, 66, 56, 31, 92, 27, 97, 66, 90, 38, 17, 38, 4, 90, 17, 9, 6, 24, 23, 78, 87, 16, 29, 52, 84, 16, 84, 89, 30, 57, 40, 83, 23, 95, 13, 66, 22, 10, 83, 63, 47, 52, 1, 2, 41, 69, 63, 47, 44, 37, 76, 30, 4, 4, 81, 87, 19, 16, 27, 100, 73, 66, 82, 47, 61, 95, 64, 82, 56, 46, 44, 54, 97, 96, 55, 90, 64, 69, 36, 59, 57, 11, 88, 60, 66, 68, 47, 84, 84, 73, 35, 8, 39, 16, 54, 51, 10, 17, 84, 65, 62, 79, 70, 11, 75, 25, 100, 90, 45, 35, 49, 2, 97, 36, 61, 62, 56, 59, 97, 91, 32, 31, 98, 22, 98, 51, 24, 60, 19, 7, 76, 32, 85, 46, 42, 11, 70, 41, 1, 66, 27, 1, 67, 75, 36, 28, 88, 43, 38, 84, 33, 69, 66, 30, 42, 64, 32, 65, 23, 50, 71, 50, 82, 8, 95, 23, 18, 16, 16, 18, 82, 94, 18, 48, 69, 6, 27, 56, 48, 65, 92, 33, 85, 57, 62, 79, 72, 46, 43, 46, 95, 66, 96, 28, 73, 90, 3, 90, 6, 18, 60, 87, 11, 29, 86, 31, 86, 65, 87, 86, 81, 78, 18, 65, 86, 31, 43, 10, 76, 38, 55, 23, 3, 2, 50, 27, 92, 52, 68, 49, 21, 27, 87, 84, 8, 72, 14, 93, 88, 52, 30, 68, 81, 47, 33, 67, 78, 27, 28, 5, 64, 82, 27, 18, 36, 29, 44, 79, 32, 12, 27, 5, 90, 13, 88, 97, 36, 53, 42, 76, 5, 71, 43, 85, 18, 75, 3, 47, 54, 30, 51, 17, 64, 30, 87, 99, 58, 30, 77, 89, 41, 55, 93, 31, 19, 32, 79, 6, 85, 20, 81, 41, 43, 24, 77, 60, 50, 32, 58, 3, 61, 60, 72, 76, 89, 58, 74, 46, 39, 2, 87, 32, 56, 31, 14, 74, 63, 92, 80, 99, 64, 60, 91, 6, 83, 67, 17, 85, 98, 74, 87, 11, 85, 10, 86, 74, 19, 12, 71, 58, 13, 9, 89, 69, 40, 2, 94, 54, 45, 25, 52, 60, 85, 94, 65, 19, 60, 33, 3, 10, 58, 42, 20, 43, 3, 57, 16, 22, 68, 38, 31, 33, 47, 19, 53, 86, 72, 46, 91, 68, 71, 42, 28, 7, 87, 44, 77, 46, 77, 80, 7, 86, 73, 78, 28, 75, 87, 95, 48, 54, 33, 78, 38, 31, 48, 90, 16, 71, 88, 6, 39, 10, 99, 18, 16, 85, 13, 92, 82, 41, 23, 41, 27, 47, 18, 6, 22, 56, 1, 69, 10, 85, 99, 99, 15, 46, 89, 82, 17, 28, 39, 7, 37, 89, 76, 4, 25, 88, 47, 58, 29, 70, 98, 55, 68, 68, 12, 89, 23, 12, 10, 84, 48, 8, 83, 14, 5, 23, 95, 21, 2, 85, 79, 38, 73, 54, 93, 97, 42, 39, 55, 22, 60, 52, 28, 28, 71, 39, 68, 94, 3, 29, 29, 50, 36, 11, 16, 93, 85, 10, 65, 86, 47, 44, 75, 19, 49, 67, 16, 42, 58, 22, 63, 69, 25, 42, 96, 96, 81, 16, 41, 83, 44, 69, 84, 32, 32, 99, 24, 68, 61, 40, 54, 7, 83, 28, 25, 32, 47, 92, 25, 4, 65, 88, 24, 90, 29, 72, 37, 61, 87, 77, 43, 82, 97, 79, 65, 80, 77, 40, 48, 37, 80, 53, 95, 62, 32, 20, 45, 78, 63, 70, 33, 28, 9, 57, 69, 89, 28, 5, 50, 66, 33, 44, 47, 81, 74, 12, 61, 51, 51, 60, 39, 30, 12, 34, 44, 95, 5, 40, 25, 19, 61, 57, 98, 69, 65, 66, 10, 44, 70, 59, 61, 2, 54, 60, 35, 28, 23, 47, 30, 25, 6, 20, 55, 69, 5, 50, 63, 61, 41, 87, 80, 2, 96, 77, 70, 12, 43, 31, 8, 64, 41, 68, 18, 95, 79, 52, 74, 1, 98, 3, 26, 3, 74, 32, 23, 79, 81, 37, 39, 21, 24, 18, 22, 71, 47, 44, 34, 41, 26, 41, 4, 67, 61, 21, 13, 39, 24, 86, 40, 21, 40, 17, 75, 13, 48, 97, 91, 28, 86, 82, 100, 61, 51, 74, 31, 97, 69, 16, 37, 94, 57, 93, 12, 69, 65, 24, 59, 89, 9, 50, 9, 100, 66, 36, 65, 13, 84, 55, 92, 69, 88, 44, 29, 39, 17, 11, 35, 37, 27, 24, 82, 35, 16, 94, 3, 80, 17, 61, 68, 78, 63, 29, 77, 28, 64, 41, 41, 99, 48, 32, 68, 35, 75, 96, 25, 43, 59, 60, 31, 85, 35, 13, 19, 50, 58, 73, 81, 74, 85, 1, 3, 47, 81, 32, 75, 96, 24, 67, 94, 23, 98, 61, 58, 25, 9, 82, 19, 67, 93, 50, 3, 27, 14, 73, 28, 71, 45, 61, 96, 29, 61, 51, 28, 41, 82, 54, 88, 5, 20, 81, 28, 69, 94, 37, 45, 54, 70, 64, 72, 15, 65, 74, 93, 30, 46, 21, 52, 42, 81, 99, 22, 93, 49, 49, 85, 30, 2, 72, 87, 73, 4, 66, 42, 97, 54, 86, 50, 75, 1, 73, 89, 65, 46, 82, 94, 43, 54, 97, 84, 86, 96, 58, 78, 44, 6, 62, 26, 60, 85, 64, 32, 88, 29, 25, 37, 34, 11, 38, 8, 11, 11, 97, 28, 8, 30, 73, 3, 35, 70, 38, 20, 65, 95, 49, 8, 53, 62, 33, 12, 46, 96, 95, 85, 76, 20, 21, 9, 30, 59, 69, 92, 21, 65, 19, 28, 46, 92, 30, 80, 13, 68, 51, 77, 62, 99, 84, 66, 60, 69, 77, 5, 16, 24, 41, 44, 43, 62, 4, 24, 20, 72, 67, 40, 88, 86, 19, 33, 29, 49, 64, 41, 68, 14, 69, 81, 64, 4, 47, 23, 72, 75, 79, 40, 98, 20, 83, 40, 33, 38, 15, 52, 10, 82, 43, 97, 19, 13, 82, 99, 13, 45, 91, 80, 11, 59, 13, 26, 14, 11, 49, 86, 85, 79, 77, 83, 50, 11, 74, 82, 48, 41, 85, 57, 74, 79, 54, 92, 92, 87, 42, 4, 83, 32, 36, 45, 42, 48, 71, 55, 58, 71, 92, 94, 49, 20, 76, 99, 30, 2, 80, 78, 94, 17, 86, 67, 95, 91, 58, 86, 77, 51, 90, 60, 34, 77, 4, 27, 24, 74, 33, 33, 44, 25, 26, 45, 44, 54, 95, 26, 7, 26, 55, 100, 42, 40, 66, 37, 31, 75, 22, 59, 25, 63, 70, 10, 39, 74, 36, 14, 99, 68, 46, 95, 44, 24, 91, 88, 29, 85, 65, 35, 10, 19, 86, 52, 58, 3, 88, 40, 77, 61, 99, 53, 24, 20, 62, 62, 93, 49, 76, 44, 16, 73, 90, 60, 48, 80, 99, 76, 16, 63, 62, 25, 33, 47, 28, 90, 49, 67, 82, 77, 28, 32, 81, 51, 51, 94, 64, 96, 42, 91, 91, 10, 16, 80, 69, 63, 11, 19, 91, 26, 81, 52, 2, 13, 99, 82, 54, 99, 48, 87, 28, 75, 18, 8, 77, 21, 2, 93, 16, 95, 83, 6, 4, 50, 37, 24, 13, 99, 42, 3, 76, 74, 6, 29, 38, 4, 10, 92, 55, 58, 78, 82, 84, 48, 41, 61, 68, 94, 53, 35, 41, 87, 92, 44, 37, 28, 68, 1, 26, 61, 55, 53, 35, 60, 81, 72, 16, 91, 15, 22, 100, 45, 55, 83, 92, 95, 43, 11, 41, 47, 45, 81, 86, 36, 76, 74, 15, 43, 74, 92, 56, 28, 44, 90, 39, 24, 61, 54, 66, 28, 27, 65, 72, 81, 48, 63, 76, 42, 73, 68, 41, 69, 48, 26, 4, 23, 99, 70, 18, 24, 61, 73, 3, 56, 14, 41, 79, 26, 47, 97, 53, 73, 61, 24, 54, 8, 38, 81, 2, 62, 48, 42, 30, 47, 67, 85, 21, 17, 54, 90, 40, 66, 14, 42, 21, 27, 82, 52, 5, 80, 48, 57, 53, 8, 33, 58, 68, 70, 90, 69, 32, 37, 10, 61, 35, 28, 98, 55, 44, 51, 45, 83, 69, 58, 24, 89, 37, 57, 92, 41, 37, 39, 97, 41, 99, 29, 98, 66, 51, 39, 34, 82, 27, 95, 94, 61, 22, 91, 67, 65, 94, 11, 99, 62, 21, 22, 2, 9, 30, 94, 49, 66, 32, 97, 58, 30, 78, 7, 47, 28, 45, 32, 61, 71, 26, 54, 31, 99, 45, 50, 15, 90, 12, 13, 51, 32, 86, 4, 40, 16, 97, 40, 33, 81, 37, 43, 62, 14, 49, 9, 93, 94, 92, 53, 16, 18, 6, 99, 68, 2, 48, 35, 91, 59, 47, 93, 43, 85, 97, 34, 52, 45, 74, 36, 25, 10, 78, 87, 75, 27, 47, 67, 72, 90, 19, 87, 59, 24, 37, 27, 78, 84, 61, 68, 95, 59, 13, 37, 43, 9, 70, 46, 53, 43, 82, 30, 4, 59, 68, 78, 37, 66, 96, 8, 55, 14, 47, 14, 90, 83, 40, 67, 19, 52, 86, 13, 10, 50, 1, 5, 58, 70, 50, 63, 65, 31, 92, 20, 42, 11, 50, 78, 76, 45, 38, 30, 11, 36, 43, 100, 70, 34, 18, 88, 85, 55, 52, 47, 5, 52, 51, 14, 74, 52, 76, 38, 35, 19, 57, 76, 29, 6, 5, 4, 3, 42, 86, 13, 77, 28, 12, 99, 14, 81, 86, 98, 87, 90, 96, 91, 41, 46, 57, 14, 98, 84, 3, 32, 3, 60, 59, 83, 17, 63, 39, 19, 5, 24, 31, 33, 3, 94, 83, 16, 26, 69, 66, 65, 58, 61, 7, 50, 7, 63, 16, 56, 47, 18, 39, 1, 77, 97, 83, 46, 11, 21, 16, 67, 44, 99, 52, 47, 44, 34, 62, 22, 2, 79, 86, 11, 40, 92, 13, 98, 55, 28, 53, 1, 45, 43, 1, 74, 91, 35, 71, 1, 56, 86, 68, 51, 84, 19, 97, 80, 52, 11, 1, 6, 89, 86, 68, 80, 77, 80, 77, 83, 59, 29, 35, 4, 23, 87, 29, 13, 22, 99, 14, 77, 36, 81, 79, 72, 99, 76, 51, 2, 38, 51, 7, 78, 88, 27, 58, 16, 6, 34, 99, 17, 15, 33, 20, 37, 20, 100, 50, 93, 50, 63, 21, 85, 95, 99, 56, 45, 26, 58, 46, 63, 8, 5, 93, 47, 31, 50, 63, 88, 35, 61, 4, 49, 45, 75, 38, 16, 74, 39, 8, 23, 53, 28, 60, 47, 27, 15, 43, 52, 25, 88, 67, 84, 44, 59, 31, 74, 60, 93, 14, 94, 5, 17, 95, 49, 92, 32, 17, 17, 70, 24, 92, 74, 4, 51, 20, 82, 17, 14, 85, 41, 1, 51, 25, 97, 61, 55, 22, 20, 99, 35, 66, 3, 52, 60, 3, 95, 43, 19, 11, 64, 95, 54, 37, 98, 4, 8, 79, 21, 21, 63, 13, 73, 66, 37, 69, 26, 43, 43, 98, 41, 77, 63, 95, 80, 74, 98, 26, 68, 68, 89, 31, 62, 42, 19, 11, 46, 26, 41, 18, 98, 4, 30, 70, 21, 67, 91, 98, 9, 33, 47, 2, 61, 61, 96, 41, 34, 45, 18, 1, 13, 6, 83, 26, 48, 1, 37, 45, 78, 77, 62, 75, 32, 91, 45, 4, 9, 87, 2, 70, 19, 100, 71, 79, 61, 66, 71, 46, 11, 89, 47, 23, 46, 81, 100, 93, 82, 88, 89, 11, 17, 50, 86, 48, 93, 82, 4, 53, 68, 57, 22, 38, 56, 92, 16, 16, 58, 39, 62, 68, 79, 60, 42, 24, 40, 93, 69, 73, 81, 57, 36, 97, 59, 21, 96, 3, 2, 99, 55, 21, 55, 77, 58, 63, 68, 73, 78, 77, 63, 91, 96, 41, 2, 89, 17, 94, 82, 85, 66, 62, 93, 1, 58, 3, 73, 5, 5, 26, 4, 60, 46, 10, 88, 3, 72, 55, 28, 2, 84, 42, 44, 79, 83, 46, 68, 51, 39, 49, 35, 56, 62, 79, 9, 71, 82, 81, 75, 38, 7, 30, 97, 4, 40, 36, 59, 63, 91, 86, 16, 26, 27, 60, 4, 61, 5, 23, 11, 43, 71, 97, 98, 84, 28, 6, 54, 9, 39, 29, 46, 97, 10, 95, 100, 49, 30, 58, 64, 72, 95, 79, 97, 74, 90, 53, 34, 94, 75, 97, 88, 98, 45, 38, 81, 72, 95, 35, 80, 33, 15, 78, 29, 24, 24, 81, 25, 5, 90, 88, 77, 85, 18, 25, 58, 8, 77, 43, 53, 4, 91, 41, 1, 36, 78, 81, 7, 72, 67, 39, 57, 81, 68, 37, 57, 91, 69, 81, 95, 59, 20, 23, 95, 89, 48, 4, 96, 76, 98, 1, 79, 89, 93, 31, 24, 70, 64, 82, 93, 30, 20, 1, 11, 87, 90, 67, 29, 58, 99, 24, 16, 18, 98, 62, 6, 97, 65, 54, 73, 63, 6, 3, 51, 98, 86, 26, 19, 49, 7, 63, 78, 79, 64, 40, 17, 53, 58, 46, 62, 56, 21, 78, 25, 18, 91, 83, 15, 56, 88, 39, 18, 93, 93, 20, 42, 78, 97, 60, 26, 3, 74, 56, 33, 37, 95, 50, 41, 5, 95, 3, 60, 15, 32, 37, 84, 22, 71, 98, 29, 58, 88, 98, 2, 81, 69, 95, 58, 65, 54, 36, 20, 27, 91, 52, 16, 37, 53, 8, 41, 47, 62, 53, 13, 45, 89, 97, 19, 11, 46, 47, 20, 34, 97, 21, 66, 65, 67, 23, 30, 20, 10, 49, 98, 52, 52, 65, 89, 5, 73, 29, 3, 86, 33, 16, 31, 73, 64, 49, 83, 61, 47, 2, 46, 43, 74, 11, 8, 40, 86, 37, 11, 95, 37, 61, 47, 40, 25, 87, 44, 49, 67, 99, 35, 100, 14, 17, 72, 29, 65, 7, 89, 11, 8, 35, 6, 34, 45, 13, 73, 82, 1, 36, 77, 89, 96, 75, 28, 72, 61, 24, 21, 27, 74, 7, 26, 87, 23, 50, 67, 39, 56, 7, 1, 15, 93, 6, 48, 90, 70, 73, 71, 22, 8, 47, 10, 55, 21, 90, 26, 33, 65, 98, 60, 38, 56, 85, 76, 30, 34, 94, 68, 41, 100, 21, 56, 93, 26, 3, 34, 48, 27, 4, 69, 34, 3, 31, 40, 75, 20, 18, 8, 36, 15, 67, 73, 23, 3, 100, 52, 89, 93, 72, 29, 92, 92, 36, 36, 69, 39, 69, 16, 65, 73, 37, 51, 27, 67, 42, 1, 38, 59, 8, 73, 26, 26, 45, 48, 29, 44, 51, 17, 36, 22, 97, 79, 13, 33, 15, 82, 23, 35, 49, 39, 59, 85, 41, 85, 3, 83, 86, 40, 93, 45, 12, 18, 71, 8, 17, 99, 3, 68, 67, 90, 41, 15, 69, 54, 47, 35, 87, 21, 69, 87, 60, 28, 24, 52, 64, 26, 34, 49, 66, 27, 94, 77, 96, 64, 85, 65, 14, 39, 32, 80, 29, 72, 46, 97, 77, 45, 31, 15, 65, 51, 54, 76, 30, 77, 28, 94, 54, 13, 94, 19, 91, 87, 48, 87, 2, 84, 51, 15, 22, 34, 46, 50, 57, 44, 46, 86, 88, 28, 52, 52, 31, 5, 80, 12, 33, 59, 5, 87, 71, 51, 5, 62, 37, 4, 100, 91, 87, 2, 57, 9, 87, 55, 10, 95, 98, 8, 80, 85, 87, 84, 88, 17, 40, 19, 29, 73, 77, 85, 59, 48, 35, 15, 61, 24, 71, 12, 66, 57, 65, 22, 17, 3, 28, 27, 97, 77, 86, 29, 13, 72, 12, 1, 41, 3, 71, 21, 75, 48, 5, 85, 47, 92, 52, 7, 67, 22, 70, 32, 30, 34, 5, 47, 36, 33, 25, 84, 9, 10, 12, 22, 33, 75, 74, 73, 78, 44, 93, 4, 43, 98, 89, 89, 41, 92, 95, 7, 13, 16, 90, 42, 49, 94, 40, 36, 78, 16, 20, 87, 77, 83, 60, 10, 58, 85, 82, 87, 28, 27, 90, 23, 76, 78, 11, 16, 69, 58, 74, 33, 73, 63, 27, 74, 8, 18, 9, 86, 34, 80, 24, 62, 15, 83, 71, 72, 67, 5, 10, 46, 31, 99, 68, 6, 29, 79, 73, 49, 88, 46, 82, 60, 60, 60, 85, 67, 77, 46, 52, 10, 25, 75, 72, 39, 57, 94, 62, 75, 50, 71, 73, 80, 22, 92, 37, 50, 22, 9, 98, 9, 6, 31, 69, 65, 90, 53, 32, 67, 98, 83, 28, 75, 10, 51, 65, 18, 97, 79, 93, 46, 1, 17, 26, 22, 8, 14, 23, 30, 75, 21, 38, 80, 3, 58, 97, 93, 63, 28, 59, 60, 62, 38, 86, 71, 89, 3, 41, 85, 81, 33, 30, 81, 1, 7, 55, 8, 73, 77, 37, 47, 49, 75, 78, 52, 32, 74, 96, 94, 1, 6, 6, 15, 43, 43, 37, 83, 45, 77, 19, 25, 61, 1, 58, 61, 7, 12, 69, 31, 40, 57, 77, 89, 31, 55, 92, 15, 28, 39, 60, 81, 44, 17, 47, 86, 60, 83, 21, 4, 12, 39, 81, 72, 39, 90, 85, 98, 1, 5, 28, 92, 61, 5, 32, 92, 11, 75, 58, 90, 13, 17, 70, 56, 86, 16, 94, 45, 51, 14, 100, 62, 4, 32, 33, 43, 21, 69, 92, 73, 73, 19, 17, 34, 75, 48, 77, 37, 23, 34, 27, 35, 2, 96, 43, 87, 64, 88, 83, 14, 1, 35, 75, 56, 18, 59, 50, 39, 28, 41, 63, 52, 60, 79, 85, 86, 79, 61, 23, 1, 46, 49, 87, 48, 96, 81, 86, 59, 68, 21, 24, 20, 7, 98, 76, 24, 9, 25, 14, 88, 66, 77, 39, 77, 7, 24, 14, 85, 36, 36, 37, 82, 36, 76, 81, 32, 56, 18, 42, 24, 38, 66, 95, 96, 63, 70, 20, 23, 47, 33, 10, 64, 61, 49, 40, 68, 24, 53, 4, 59, 41, 41, 40, 76, 68, 20, 7, 23, 38, 49, 98, 27, 66, 45, 23, 28, 14, 94, 3, 12, 26, 12, 75, 39, 12, 14, 58, 35, 19, 13, 94, 11, 5, 85, 86, 72, 57, 45, 47, 94, 45, 44, 72, 10, 40, 46, 89, 54, 39, 91, 65, 17, 55, 92, 55, 66, 5, 64, 1, 75, 76, 46, 85, 81, 30, 23, 52, 86, 67, 98, 31, 63, 94, 55, 72, 33, 100, 12, 38, 39, 3, 55, 7, 9, 46, 13, 74, 2, 76, 26, 29, 3, 71, 65, 83, 1, 87, 87, 38, 5, 36, 69, 67, 81, 23, 90, 66, 74, 2, 55, 64, 56, 9, 70, 64, 6, 82, 89, 60, 9, 15, 40, 64, 85, 4, 46, 37, 91, 84, 75, 47, 72, 95, 14, 52, 69, 55, 69, 94, 56, 24, 58, 63, 84, 79, 78, 42, 13, 67, 1, 21, 81, 40, 84, 17, 95, 82, 6, 85, 17, 80, 32, 88, 26, 97, 92, 46, 51, 60, 39, 59, 83, 96, 73, 67, 75, 51, 8, 87, 69, 60, 59, 1, 51, 95, 17, 45, 28, 74, 82, 44, 53, 65, 32, 30, 13, 23, 75, 63, 82, 14, 73, 17, 9, 46, 35, 35, 48, 94, 73, 16, 53, 32, 16, 55, 78, 84, 99, 5, 58, 32, 48, 62, 96, 31, 92, 60, 5, 18, 23, 39, 31, 47, 55, 92, 44, 41, 78, 91, 34, 51, 6, 38, 34, 73, 92, 11, 9, 42, 67, 18, 26, 66, 31, 73, 97, 74, 33, 1, 92, 7, 91, 74, 53, 97, 65, 97, 37, 95, 87, 70, 45, 45, 7, 30, 69, 50, 40, 29, 44, 6, 46, 69, 71, 29, 93, 19, 2, 25, 72, 93, 31, 62, 19, 84, 59, 35, 32, 95, 29, 18, 17, 73, 14, 75, 54, 35, 77, 93, 63, 72, 50, 61, 92, 73, 89, 84, 43, 90, 9, 14, 35, 39, 28, 5, 74, 38, 39, 5, 84, 68, 75, 52, 92, 40, 27, 46, 74, 55, 90, 37, 26, 92, 97, 17, 64, 37, 100, 58, 78, 8, 24, 12, 99, 51, 16, 72, 40, 7, 29, 23, 74, 55, 27, 17, 94, 53, 62, 68, 7, 4, 4, 32, 95, 52, 48, 10, 40, 99, 67, 17, 7, 90, 81, 57, 92, 48, 80, 83, 54, 8, 58, 79, 62, 84, 96, 56, 88, 9, 75, 94, 12, 30, 77, 6, 81, 76, 67, 72, 74, 34, 88, 32, 75, 20, 88, 19, 68, 68, 53, 73, 75, 10, 52, 89, 93, 99, 96, 80, 7, 70, 25, 19, 99, 53, 76, 31, 28, 43, 2, 2, 28, 41, 85, 54, 61, 73, 24, 80, 40, 77, 52, 66, 86, 55, 6, 31, 53, 1, 62, 60, 70, 39, 30, 68, 91, 57, 50, 19, 51, 51, 72, 78, 92, 56, 84, 4, 80, 7, 83, 71, 83, 34, 89, 21, 89, 94, 3, 93, 47, 64, 52, 68, 2, 33, 36, 45, 90, 37, 63, 40, 88, 86, 70, 31, 93, 53, 34, 73, 11, 16, 95, 46, 1, 83, 18, 41, 29, 20, 34, 75, 35, 37, 42, 89, 70, 29, 33, 11, 66, 47, 2, 5, 32, 71, 35, 76, 75, 20, 48, 86, 35, 95, 83, 87, 77, 100, 28, 5, 19, 13, 31, 5, 1, 73, 93, 70, 53, 77, 32, 18, 23, 34, 22, 6, 56, 8, 82, 31, 27, 81, 68, 13, 75, 50, 100, 52, 1, 79, 8, 19, 43, 39, 75, 43, 63, 68, 65, 15, 44, 96, 85, 67, 81, 58, 24, 37, 66, 5, 19, 44, 86, 86, 57, 12, 87, 8, 15, 87, 38, 23, 57, 80, 13, 31, 22, 75, 50, 38, 41, 94, 86, 25, 12, 66, 83, 87, 54, 100, 92, 72, 43, 29, 9, 99, 40, 47, 58, 55, 85, 95, 29, 93, 74, 41, 24, 48, 67, 25, 37, 7, 18, 22, 32, 81, 40, 66, 68, 93, 65, 11, 17, 7, 91, 77, 58, 30, 76, 67, 36, 60, 62, 16, 53, 87, 56, 28, 86, 74, 52, 23, 81, 22, 44, 64, 54, 35, 29, 73, 80, 93, 35, 96, 51, 25, 24, 60, 7, 99, 27, 42, 11, 88, 58, 15, 26, 65, 42, 12, 39, 45, 34, 19, 66, 29, 34, 72, 64, 62, 44, 95, 6, 79, 90, 8, 3, 65, 68, 61, 16, 46, 3, 78, 85, 12, 92, 10, 76, 85, 73, 66, 29, 6, 36, 47, 87, 69, 18, 2, 30, 13, 96, 87, 43, 37, 95, 98, 53, 14, 58, 68, 59, 60, 45, 43, 23, 36, 4, 99, 72, 77, 16, 1, 34, 52, 47, 20, 20, 16, 73, 2, 80, 68, 88, 23, 56, 34, 20, 9, 47, 77, 76, 5, 89, 73, 99, 11, 60, 55, 61, 32, 31, 77, 32, 64, 28, 30, 36, 99, 97, 8, 100, 76, 28, 88, 98, 83, 21, 69, 91, 68, 98, 19, 24, 86, 91, 75, 48, 50, 29, 61, 33, 11, 89, 16, 26, 16, 97, 61, 66, 93, 21, 66, 21, 48, 53, 18, 82, 25, 39, 25, 44, 36, 43, 20, 21, 85, 94, 20, 86, 74, 80, 19, 84, 68, 34, 9, 35, 31, 22, 1, 23, 42, 66, 95, 41, 70, 65, 74, 94, 3, 98, 90, 38, 92, 9, 10, 76, 2, 81, 62, 27, 61, 80, 10, 80, 65, 70, 15, 95, 91, 67, 70, 84, 84, 64, 76, 53, 28, 50, 98, 82, 99, 87, 19, 91, 95, 80, 66, 48, 61, 79, 74, 21, 58, 83, 52, 23, 5, 66, 69, 95, 84, 38, 31, 67, 54, 6, 71, 33, 7, 69, 15, 6, 7, 85, 96, 2, 65, 13, 1, 25, 92, 75, 97, 1, 9, 48, 75, 13, 66, 44, 60, 49, 33, 42, 68, 38, 99, 38, 71, 6, 58, 85, 11, 65, 69, 58, 18, 85, 70, 18, 9, 13, 44, 57, 14, 53, 57, 88, 17, 22, 31, 28, 22, 16, 21, 89, 53, 20, 79, 23, 25, 36, 59, 87, 100, 28, 44, 17, 12, 65, 87, 73, 78, 30, 29, 91, 34, 37, 78, 3, 58, 61, 82, 32, 76, 3, 72, 28, 22, 50, 51, 98, 86, 61, 84, 37, 88, 27, 6, 52, 91, 92, 76, 20, 21, 56, 10, 7, 93, 40, 9, 2, 100, 90, 33, 75, 92, 57, 54, 65, 6, 56, 62, 43, 17, 45, 32, 56, 23, 37, 7, 66, 28, 34, 85, 100, 90, 47, 58, 82, 86, 66, 83, 85, 8, 68, 11, 99, 24, 16, 16, 81, 72, 77, 76, 40, 74, 7, 95, 96, 43, 54, 13, 22, 87, 50, 73, 28, 96, 31, 9, 81, 48, 44, 17, 55, 11, 79, 6, 86, 94, 21, 66, 17, 49, 93, 8, 22, 99, 55, 70, 93, 8, 82, 66, 46, 31, 39, 74, 26, 21, 82, 58, 20, 77, 74, 75, 39, 4, 32, 24, 50, 4, 42, 18, 52, 34, 26, 74, 33, 80, 43, 77, 39, 24, 43, 84, 7, 33, 9, 32, 5, 43, 42, 24, 19, 15, 50, 58, 71, 33, 81, 20, 36, 74, 89, 88, 8, 66, 61, 92, 45, 55, 68, 35, 78, 62, 19, 36, 46, 27, 68, 50, 21, 9, 26, 40, 75, 75, 97, 97, 60, 29, 68, 95, 55, 57, 82, 62, 22, 94, 5, 19, 48, 24, 53, 78, 86, 23, 13, 31, 2, 80, 33, 22, 40, 58, 61, 67, 84, 9, 63, 43, 90, 31, 38, 44, 87, 71, 57, 60, 65, 13, 78, 12, 36, 31, 89, 73, 5, 2, 56, 6, 33, 88, 28, 25, 45, 40, 91, 80, 49, 53, 75, 90, 83, 12, 85, 21, 34, 41, 81, 98, 53, 10, 62, 40, 92, 50, 13, 97, 3, 68, 2, 36, 55, 81, 12, 51, 21, 2, 82, 21, 54, 56, 10, 89, 19, 94, 61, 53, 86, 93, 50, 90, 55, 63, 29, 46, 13, 41, 42, 67, 8, 96, 54, 14, 76, 65, 16, 48, 66, 98, 20, 72, 53, 29, 12, 72, 74, 72, 24, 11, 17, 25, 100, 71, 88, 81, 16, 52, 21, 10, 18, 81, 57, 24, 46, 84, 88, 62, 32, 54, 59, 51, 77, 11, 32, 88, 34, 57, 11, 9, 20, 27, 34, 71, 49, 73, 51, 17, 24, 24, 26, 93, 56, 82, 16, 1, 65, 56, 14, 48, 61, 24, 51, 37, 87, 34, 76, 20, 90, 86, 29, 9, 65, 14, 32, 65, 86, 82, 81, 61, 5, 6, 5, 12, 39, 21, 13, 56, 28, 78, 3, 88, 2, 53, 24, 88, 86, 99, 7, 28, 36, 87, 88, 52, 100, 19, 17, 37, 53, 97, 97, 9, 55, 2, 21, 93, 74, 85, 100, 1, 62, 3, 40, 63, 7, 63, 50, 45, 13, 9, 24, 48, 95, 63, 100, 95, 34, 68, 31, 86, 64, 80, 94, 70, 33, 14, 15, 58, 98, 14, 10, 12, 68, 49, 74, 75, 11, 76, 71, 75, 84, 46, 22, 30, 8, 73, 76, 41, 40, 7, 78, 56, 38, 72, 25, 70, 37, 39, 79, 87, 5, 88, 98, 72, 36, 23, 98, 98, 98, 68, 72, 33, 65, 45, 63, 25, 70, 90, 65, 9, 96, 43, 16, 85, 66, 93, 6, 2, 83, 84, 88, 87, 71, 37, 59, 58, 60, 56, 55, 9, 76, 78, 94, 40, 23, 56, 16, 92, 97, 81, 52, 93, 75, 20, 29, 40, 12, 35, 93, 46, 18, 81, 33, 41, 69, 91, 98, 28, 98, 5, 37, 73, 34, 30, 65, 8, 37, 80, 99, 33, 12, 3, 77, 38, 74, 6, 77, 37, 92, 22, 82, 9, 54, 14, 49, 22, 56, 47, 50, 6, 3, 38, 30, 36, 19, 94, 44, 7, 26, 94, 91, 89, 48, 68, 27, 21, 25, 55, 57, 16, 28, 91, 76, 81, 56, 25, 3, 12, 23, 52, 17, 77, 41, 46, 12, 59, 92, 7, 17, 69, 1, 7, 9, 100, 26, 87, 21, 50, 94, 29, 17, 21, 71, 45, 2, 27, 69, 4, 90, 43, 7, 58, 71, 99, 55, 82, 9, 46, 41, 25, 66, 41, 31, 27, 40, 57, 13, 12, 58, 6, 93, 27, 79, 63, 71, 80, 41, 91, 35, 30, 33, 41, 87, 3, 39, 42, 36, 99, 39, 76, 23, 57, 68, 53, 83, 60, 61, 47, 71, 71, 53, 15, 97, 31, 30, 67, 62, 70, 57, 96, 100, 41, 88, 38, 95, 78, 79, 30, 76, 70, 58, 98, 26, 25, 2, 8, 84, 63, 6, 7, 33, 10, 73, 81, 92, 2, 47, 53, 72, 55, 48, 23, 95, 35, 60, 89, 12, 39, 70, 39, 60, 27, 36, 85, 4, 38, 44, 87, 52, 49, 45, 36, 59, 18, 16, 50, 19, 62, 55, 42, 16, 54, 64, 62, 89, 24, 50, 52, 14, 19, 91, 73, 98, 78, 9, 1, 15, 52, 39, 18, 52, 84, 53, 62, 53, 68, 12, 71, 81, 18, 65, 48, 71, 28, 9, 11, 3, 10, 63, 68, 81, 5, 40, 78, 34, 100, 30, 1, 51, 68, 18, 55, 3, 23, 16, 55, 42, 79, 78, 23, 96, 42, 22, 67, 21, 83, 77, 24, 44, 91, 91, 24, 47, 83, 53, 81, 82, 82, 81, 85, 2, 98, 39, 4, 72, 54, 11, 14, 33, 88, 88, 28, 29, 61, 94, 49, 43, 23, 24, 87, 13, 15, 62, 60, 49, 15, 40, 30, 48, 72, 14, 49, 21, 52, 5, 93, 58, 15, 6, 90, 2, 93, 69, 82, 53, 15, 82, 48, 37, 6, 86, 1, 72, 47, 60, 20, 61, 51, 49, 61, 22, 15, 9, 43, 18, 13, 87, 75, 79, 92, 16, 80, 36, 37, 13, 40, 51, 95, 39, 39, 100, 24, 39, 23, 71, 51, 42, 83, 53, 42, 43, 27, 8, 52, 21, 26, 16, 7, 100, 95, 98, 68, 26, 85, 4, 39, 76, 54, 33, 15, 44, 84, 38, 34, 6, 8, 36, 99, 91, 89, 92, 33, 15, 100, 36, 87, 25, 4, 93, 76, 98, 42, 43, 75, 26, 98, 13, 1, 3, 45, 15, 46, 80, 5, 32, 37, 12, 67, 35, 54, 55, 27, 39, 21, 78, 26, 7, 2, 29, 51, 29, 78, 92, 24, 53, 69, 21, 65, 70, 24, 62, 36, 21, 41, 92, 52, 78, 56, 19, 64, 9, 25, 42, 99, 98, 19, 25, 56, 72, 53, 7, 1, 31, 50, 24, 83, 19, 96, 99, 40, 71, 60, 27, 92, 53, 19, 95, 82, 74, 65, 45, 34, 90, 87, 33, 39, 57, 9, 94, 29, 13, 52, 81, 43, 2, 56, 77, 20, 51, 28, 11, 22, 87, 37, 65, 39, 55, 11, 20, 80, 76, 17, 66, 17, 55, 98, 55, 11, 58, 100, 91, 70, 52, 71, 65, 53, 26, 93, 24, 29, 20, 34, 2, 7, 22, 18, 97, 29, 28, 69, 8, 55, 85, 73, 71, 91, 22, 77, 1, 79, 29, 92, 1, 80, 14, 65, 84, 92, 9, 59, 20, 29, 44, 21, 87, 65, 90, 83, 93, 17, 3, 1, 72, 39, 25, 94, 29, 99, 23, 30, 77, 51, 73, 29, 82, 38, 45, 65, 29, 54, 75, 100, 82, 18, 72, 68, 82, 61, 2, 75, 78, 57, 27, 1, 95, 3, 46, 24, 1, 20, 53, 30, 70, 77, 58, 3, 14, 3, 67, 95, 56, 93, 94, 89, 10, 66, 8, 92, 78, 61, 18, 55, 17, 44, 7, 12, 46, 5, 35, 99, 24, 39, 28, 94, 67, 85, 48, 32, 39, 15, 26, 46, 59, 72, 34, 69, 89, 93, 60, 66, 54, 77, 73, 22, 72, 31, 33, 69, 35, 19, 67, 59, 9, 94, 4, 75, 31, 51, 7, 69, 17, 84, 15, 76, 55, 100, 44, 43, 93, 55, 61, 98, 83, 33, 19, 6, 63, 4, 74, 98, 22, 93, 8, 31, 38, 11, 57, 68, 13, 63, 37, 30, 47, 3, 57, 53, 54, 100, 48, 46, 6, 8, 95, 88, 92, 66, 93, 54, 69, 18, 3, 42, 10, 10, 24, 48, 72, 81, 67, 37, 95, 55, 66, 41, 57, 74, 46, 11, 25, 93, 8, 30, 52, 55, 69, 43, 20, 61, 96, 88, 30, 51, 29, 92, 12, 5, 91, 36, 85, 57, 72, 79, 12, 89, 72, 20, 62, 17, 82, 86, 61, 90, 67, 12, 44, 35, 54, 15, 47, 1, 2, 76, 51, 82, 19, 63, 86, 9, 50, 70, 18, 21, 1, 29, 61, 72, 100, 22, 40, 82, 59, 100, 23, 25, 11, 18, 59, 64, 32, 5, 64, 85, 32, 67, 66, 51, 81, 4, 59, 30, 25, 76, 50, 25, 56, 62, 48, 8, 83, 87, 89, 93, 86, 63, 17, 96, 32, 27, 11, 15, 31, 75, 99, 62, 93, 16, 12, 73, 19, 23, 2, 96, 50, 3, 20, 6, 64, 68, 65, 98, 54, 5, 90, 92, 67, 6, 39, 50, 32, 50, 64, 14, 76, 14, 27, 68, 29, 91, 40, 100, 13, 93, 47, 14, 95, 66, 71, 10, 85, 35, 7, 39, 39, 96, 82, 57, 53, 20, 6, 36, 69, 69, 1, 96, 34, 27, 15, 15, 69, 54, 66, 81, 98, 12, 47, 92, 77, 17, 1, 62, 52, 59, 52, 42, 6, 85, 99, 10, 4, 4, 45, 25, 25, 97, 20, 58, 76, 35, 24, 44, 40, 89, 77, 38, 100, 23, 81, 29, 91, 34, 42, 42, 92, 93, 36, 98, 77, 34, 7, 32, 89, 4, 56, 13, 100, 28, 23, 27, 14, 46, 71, 53, 35, 47, 42, 86, 21, 23, 14, 11, 56, 55, 5, 99, 47, 40, 96, 75, 73, 55, 7, 61, 58, 14, 26, 9, 41, 100, 36, 54, 45, 58, 59, 31, 4, 100, 17, 24, 74, 30, 86, 81, 85, 90, 80, 83, 29, 27, 10, 53, 81, 68, 66, 90, 81, 91, 51, 74, 90, 38, 79, 86, 95, 37, 17, 50, 89, 33, 25, 14, 62, 10, 47, 98, 100, 26, 33, 80, 4, 42, 33, 85, 9, 98, 26, 41, 40, 76, 66, 81, 13, 45, 66, 59, 33, 82, 8, 73, 66, 32, 87, 80, 94, 33, 77, 93, 10, 9, 72, 65, 2, 56, 1, 10, 5, 27, 3, 44, 54, 68, 24, 19, 64, 42, 77, 97, 23, 85, 21, 41, 68, 7, 20, 61, 91, 48, 5, 52, 9, 29, 17, 10, 84, 17, 72, 89, 95, 74, 84, 49, 93, 60, 67, 57, 1, 43, 5, 75, 79, 25, 15, 99, 84, 34, 59, 26, 34, 64, 78, 42, 44, 46, 51, 27, 14, 22, 67, 9, 47, 3, 9, 92, 62, 75, 48, 62, 69, 4, 36, 100, 28, 51, 98, 11, 36, 8, 89, 69, 23, 66, 62, 66, 63, 13, 45, 76, 86, 63, 36, 85, 65, 44, 76, 26, 70, 75, 87, 91, 78, 75, 90, 5, 77, 39, 68, 64, 46, 56, 85, 21, 73, 46, 86, 87, 58, 82, 14, 96, 45, 50, 80, 9, 45, 55, 87, 67, 81, 25, 57, 58, 99, 46, 14, 27, 36, 33, 91, 81, 40, 75, 53, 64, 20, 39, 50, 30, 72, 64, 77, 16, 65, 56, 77, 61, 62, 63, 27, 42, 39, 83, 51, 90, 80, 64, 16, 15, 97, 58, 48, 36, 32, 100, 100, 4, 90, 1, 85, 62, 16, 13, 29, 32, 68, 57, 93, 81, 71, 19, 74, 10, 54, 24, 99, 85, 87, 14, 100, 35, 24, 99, 23, 7, 50, 74, 10, 92, 74, 46, 5, 42, 58, 33, 73, 77, 42, 65, 9, 12, 36, 82, 21, 41, 5, 19, 25, 44, 85, 76, 30, 8, 74, 52, 14, 76, 77, 76, 67, 3, 73, 23, 44, 83, 7, 16, 11, 48, 33, 20, 60, 20, 53, 80, 60, 10, 51, 84, 5, 35, 60, 34, 94, 85, 38, 59, 12, 14, 86, 30, 16, 59, 52, 59, 93, 59, 27, 3, 6, 59, 74, 65, 78, 27, 97, 89, 36, 47, 72, 92, 33, 83, 25, 26, 20, 62, 36, 31, 28, 22, 13, 43, 32, 64, 54, 24, 22, 80, 78, 80, 90, 52, 44, 19, 30, 40, 7, 17, 38, 30, 8, 70, 13, 84, 47, 84, 98, 83, 66, 25, 56, 78, 19, 39, 42, 72, 62, 15, 3, 91, 94, 44, 94, 90, 62, 23, 81, 68, 91, 19, 98, 98, 40, 62, 34, 87, 45, 31, 21, 62, 55, 28, 40, 73, 66, 33, 97, 79, 47, 51, 21, 41, 95, 15, 82, 8, 89, 62, 76, 80, 32, 25, 29, 72, 38, 62, 10, 82, 44, 82, 43, 98, 9, 34, 23, 26, 66, 19, 4, 13, 21, 76, 5, 15, 90, 38, 23, 31, 99, 50, 10, 31, 26, 90, 2, 63, 4, 63, 96, 47, 44, 90, 97, 52, 24, 19, 77, 41, 89, 32, 5, 61, 7, 61, 28, 49, 98, 2, 79, 97, 51, 40, 79, 28, 81, 32, 90, 84, 94, 37, 83, 37, 26, 31, 88, 1, 49, 16, 42, 89, 99, 98, 49, 57, 59, 76, 57, 56, 29, 35, 4, 79, 26, 82, 58, 7, 13, 99, 42, 6, 35, 24, 42, 13, 54, 81, 65, 54, 48, 58, 94, 98, 56, 95, 7, 14, 22, 63, 21, 51, 50, 25, 81, 75, 6, 39, 81, 19, 37, 23, 76, 24, 98, 18, 36, 4, 50, 100, 9, 50, 58, 3, 47, 13, 97, 53, 78, 70, 16, 98, 20, 65, 22, 1, 91, 80, 39, 72, 98, 27, 46, 25, 50, 43, 94, 85, 98, 44, 37, 7, 93, 94, 9, 91, 58, 57, 44, 35, 26, 11, 32, 98, 27, 6, 98, 17, 85, 88, 40, 34, 66, 85, 58, 68, 80, 52, 52, 77, 47, 40, 35, 39, 85, 95, 29, 42, 3, 24, 28, 81, 34, 60, 78, 12, 17, 27, 29, 1, 66, 20, 86, 31, 5, 43, 98, 36, 46, 2, 64, 92, 93, 51, 82, 78, 45, 63, 19, 48, 86, 47, 28, 72, 58, 5, 35, 26, 83, 15, 78, 48, 35, 63, 30, 91, 57, 80, 26, 3, 81, 41, 46, 73, 91, 80, 2, 36, 42, 21, 35, 79, 19, 14, 50, 76, 70, 37, 53, 52, 51, 30, 99, 85, 92, 80, 75, 100, 59, 52, 2, 91, 45, 100, 64, 35, 79, 65, 22, 72, 37, 8, 50, 55, 21, 52, 82, 90, 88, 34, 41, 38, 15, 91, 23, 6, 71, 49, 6, 81, 53, 59, 72, 97, 10, 87, 83, 40, 3, 57, 11, 40, 64, 61, 46, 85, 64, 80, 74, 51, 65, 67, 88, 80, 9, 62, 37, 79, 63, 94, 12, 15, 5, 83, 63, 14, 69, 45, 6, 71, 1, 16, 62, 17, 28, 8, 1, 91, 39, 26, 93, 3, 44, 33, 34, 53, 94, 71, 83, 8, 16, 94, 74, 20, 28, 36, 86, 96, 33, 91, 67, 85, 58, 80, 1, 38, 87, 53, 28, 77, 31, 21, 80, 74, 53, 65, 78, 98, 35, 13, 58, 3, 58, 31, 22, 86, 19, 59, 81, 3, 1, 99, 87, 59, 79, 88, 96, 17, 92, 75, 94, 22, 47, 25, 48, 51, 89, 77, 1, 76, 89, 58, 78, 47, 40, 51, 32, 10, 10, 64, 12, 10, 63, 99, 20, 41, 38, 67, 9, 29, 94, 2, 3, 40, 78, 50, 91, 67, 26, 43, 42, 67, 52, 19, 13, 91, 69, 96, 53, 30, 59, 64, 92, 21, 14, 11, 13, 51, 78, 74, 32, 71, 27, 34, 62, 5, 35, 4, 71, 12, 46, 64, 78, 97, 34, 42, 40, 54, 89, 92, 84, 48, 55, 75, 20, 69, 37, 85, 71, 66, 58, 2, 88, 84, 87, 50, 88, 73, 53, 10, 37, 51, 25, 66, 47, 10, 8, 38, 64, 48, 29, 99, 95, 36, 25, 15, 4, 61, 99, 26, 27, 8, 80, 14, 91, 18, 15, 31, 91, 68, 92, 27, 70, 17, 92, 16, 78, 51, 54, 41, 99, 34, 39, 45, 69, 15, 11, 24, 76, 9, 50, 54, 68, 29, 67, 59, 98, 34, 41, 88, 1, 32, 66, 22, 100, 10, 37, 78, 60, 42, 70, 10, 28, 61, 55, 96, 75, 65, 20, 50, 26, 21, 3, 93, 1, 22, 3, 98, 55, 43, 38, 7, 27, 3, 80, 78, 12, 16, 55, 24, 10, 25, 85, 37, 85, 91, 84, 11, 56, 55, 61, 33, 75, 15, 77, 27, 88, 32, 25, 94, 74, 62, 52, 52, 16, 31, 30, 28, 99, 84, 3, 60, 60, 87, 48, 96, 78, 31, 7, 85, 86, 19, 69, 12, 33, 45, 39, 73, 76, 63, 66, 2, 76, 70, 53, 91, 100, 82, 70, 50, 18, 24, 9, 29, 11, 56, 25, 40, 87, 83, 24, 24, 1, 44, 87, 85, 88, 25, 57, 16, 39, 75, 69, 14, 44, 21, 57, 95, 55, 78, 45, 24, 2, 53, 52, 64, 61, 28, 3, 99, 10, 78, 22, 10, 21, 8, 95, 60, 85, 3, 75, 23, 77, 43, 89, 72, 16, 97, 67, 22, 26, 63, 45, 27, 15, 96, 90, 27, 76, 44, 25, 85, 21, 98, 47, 93, 58, 93, 53, 42, 95, 79, 16, 24, 74, 56, 95, 89, 52, 13, 62, 78, 75, 6, 56, 42, 53, 98, 20, 28, 41, 45, 65, 14, 42, 11, 6, 99, 3, 10, 92, 97, 89, 8, 72, 62, 63, 67, 2, 67, 31, 63, 96, 58, 68, 51, 51, 72, 100, 70, 100, 93, 66, 64, 6, 8, 74, 63, 58, 28, 73, 50, 24, 13, 57, 96, 74, 71, 14, 75, 37, 96, 37, 32, 5, 56, 35, 55, 27, 34, 77, 78, 26, 42, 93, 83, 49, 18, 98, 7, 45, 22, 8, 21, 34, 64, 68, 7, 34, 81, 33, 23, 28, 69, 6, 33, 76, 40, 39, 2, 26, 15, 32, 51, 9, 24, 86, 57, 42, 83, 15, 86, 4, 22, 6, 37, 37, 25, 95, 23, 57, 27, 45, 85, 47, 50, 69, 22, 42, 7, 75, 67, 74, 6, 69, 82, 30, 6, 90, 23, 88, 57, 60, 43, 30, 18, 31, 67, 42, 25, 41, 99, 3, 85, 83, 49, 86, 51, 22, 79, 9, 97, 45, 82, 54, 66, 15, 83, 71, 5, 57, 11, 61, 17, 5, 90, 34, 36, 8, 75, 60, 48, 73, 15, 32, 7, 63, 70, 9, 37, 48, 18, 33, 45, 51, 38, 62, 66, 73, 84, 70, 29, 46, 82, 45, 51, 71, 78, 86, 79, 5, 97, 78, 77, 11, 62, 36, 26, 31, 44, 62, 30, 13, 46, 26, 64, 83, 39, 81, 7, 23, 50, 36, 68, 83, 80, 70, 5, 10, 55, 83, 14, 4, 13, 42, 14, 74, 77, 91, 4, 21, 4, 85, 33, 1, 63, 48, 84, 1, 28, 90, 23, 29, 77, 43, 11, 57, 12, 16, 18, 19, 50, 31, 22, 62, 72, 87, 35, 49, 78, 90, 21, 81, 75, 53, 82, 37, 1, 17, 37, 28, 58, 12, 57, 87, 6, 19, 43, 69, 34, 12, 87, 84, 42, 8, 97, 65, 47, 32, 13, 24, 21, 33, 56, 47, 38, 89, 35, 38, 57, 24, 17, 67, 35, 25, 53, 92, 44, 95, 60, 77, 6, 47, 12, 99, 6, 9, 63, 52, 92, 28, 27, 12, 12, 35, 11, 49, 23, 45, 38, 32, 68, 55, 98, 54, 31, 50, 45, 74, 96, 5, 3, 53, 3, 66, 51, 8, 74, 65, 12, 17, 92, 38, 81, 56, 24, 91, 4, 99, 35, 94, 30, 55, 100, 27, 60, 30, 76, 5, 56, 23, 61, 58, 75, 63, 75, 77, 70, 1, 41, 33, 17, 85, 23, 97, 40, 46, 87, 95, 44, 74, 40, 73, 80, 39, 51, 39, 69, 78, 43, 76, 100, 55, 85, 74, 17, 59, 50, 39, 59, 43, 71, 76, 79, 45, 24, 70, 91, 11, 64, 86, 36, 56, 11, 15, 94, 61, 5, 14, 39, 100, 89, 38, 54, 73, 64, 71, 84, 65, 61, 42, 7, 83, 69, 37, 28, 93, 6, 70, 55, 22, 55, 90, 77, 17, 56, 70, 78, 60, 36, 68, 59, 24, 57, 13, 49, 20, 35, 32, 37, 47, 73, 95, 29, 94, 32, 8, 86, 37, 77, 40, 10, 84, 29, 86, 100, 36, 8, 29, 95, 43, 96, 54, 18, 5, 18, 66, 76, 4, 49, 12, 50, 74, 7, 78, 67, 38, 86, 4, 26, 14, 43, 36, 97, 23, 73, 49, 58, 32, 29, 52, 74, 25, 57, 44, 81, 26, 61, 56, 29, 10, 68, 78, 35, 74, 56, 1, 63, 93, 4, 88, 58, 98, 75, 55, 20, 48, 55, 29, 79, 83, 32, 5, 59, 41, 100, 39, 66, 60, 47, 95, 21, 14, 72, 55, 39, 79, 7, 53, 71, 62, 40, 29, 59, 67, 35, 30, 66, 41, 10, 44, 23, 42, 100, 34, 82, 51, 24, 47, 11, 70, 41, 83, 83, 65, 90, 73, 43, 96, 25, 66, 10, 17, 46, 68, 83, 32, 50, 48, 72, 59, 43, 46, 52, 95, 79, 33, 45, 3, 32, 7, 72, 24, 42, 7, 88, 31, 31, 31, 78, 56, 96, 87, 24, 93, 7, 6, 24, 8, 5, 95, 66, 47, 92, 70, 41, 71, 2, 38, 25, 85, 44, 96, 9, 85, 54, 96, 67, 85, 78, 45, 92, 25, 83, 15, 17, 41, 72, 40, 48, 76, 86, 66, 22, 78, 35, 15, 100, 88, 52, 24, 73, 47, 71, 33, 32, 25, 28, 50, 61, 6, 94, 52, 82, 77, 18, 99, 69, 89, 90, 17, 64, 76, 82, 37, 5, 68, 51, 4, 55, 54, 27, 79, 53, 97, 11, 36, 73, 39, 85, 85, 96, 79, 36, 29, 7, 5, 27, 75, 93, 17, 43, 8, 44, 76, 45, 100, 43, 47, 3, 98, 1, 81, 28, 53, 29, 39, 88, 2, 29, 24, 86, 24, 2, 74, 4, 60, 30, 31, 87, 23, 99, 29, 30, 94, 5, 26, 93, 99, 73, 47, 96, 25, 27, 24, 29, 55, 14, 68, 8, 42, 91, 46, 17, 93, 71, 20, 4, 100, 2, 90, 22, 100, 71, 4, 45, 27, 29, 37, 25, 53, 83, 73, 77, 61, 48, 5, 16, 61, 72, 75, 2, 63, 20, 70, 7, 90, 89, 10, 42, 91, 52, 63, 42, 74, 18, 87, 100, 99, 23, 76, 51, 58, 48, 28, 18, 47, 32, 85, 7, 4, 12, 60, 18, 31, 29, 24, 73, 70, 85, 14, 60, 88, 28, 1, 61, 98, 39, 12, 96, 14, 88, 46, 71, 87, 73, 40, 34, 57, 77, 92, 12, 88, 52, 29, 70, 32, 52, 42, 1, 88, 7, 12, 76, 87, 65, 88, 84, 3, 100, 79, 16, 39, 24, 38, 77, 49, 78, 10, 5, 54, 54, 16, 41, 57, 96, 10, 88, 99, 4, 41, 86, 62, 4, 61, 48, 68, 1, 31, 71, 100, 9, 38, 38, 85, 76, 14, 33, 53, 76, 89, 58, 81, 56, 50, 37, 51, 11, 76, 49, 66, 68, 86, 28, 72, 99, 75, 39, 99, 6, 61, 50, 66, 99, 39, 50, 74, 4, 34, 78, 79, 22, 87, 59, 29, 36, 47, 31, 98, 23, 31, 64, 90, 17, 91, 13, 15, 65, 52, 65, 22, 64, 14, 88, 62, 52, 89, 87, 55, 23, 16, 86, 96, 2, 96, 77, 89, 43, 7, 87, 17, 38, 50, 58, 54, 40, 71, 20, 56, 74, 36, 30, 37, 49, 69, 51, 52, 57, 89, 6, 31, 57, 43, 79, 10, 39, 55, 99, 33, 61, 85, 1, 98, 86, 58, 3, 77, 80, 74, 84, 53, 9, 13, 42, 57, 81, 92, 60, 90, 32, 18, 20, 88, 60, 98, 98, 50, 4, 96, 34, 65, 32, 34, 14, 69, 44, 17, 97, 75, 90, 80, 80, 51, 45, 21, 59, 25, 64, 19, 66, 95, 36, 86, 35, 47, 35, 32, 97, 39, 79, 82, 55, 62, 68, 68, 82, 63, 36, 78, 37, 78, 57, 16, 28, 1, 36, 38, 78, 99, 56, 43, 46, 43, 80, 80, 90, 67, 63, 38, 57, 41, 19, 11, 54, 86, 30, 35, 48, 18, 12, 37, 95, 20, 52, 74, 73, 40, 11, 50, 38, 19, 44, 35, 61, 76, 14, 50, 42, 76, 39, 98, 68, 58, 60, 21, 95, 89, 55, 95, 6, 18, 31, 52, 38, 34, 77, 10, 73, 40, 11, 63, 58, 6, 97, 70, 81, 63, 72, 74, 90, 10, 23, 10, 67, 82, 30, 14, 71, 37, 8, 28, 6, 90, 32, 43, 23, 8, 4, 48, 47, 66, 10, 56, 72, 58, 26, 4, 72, 49, 78, 62, 58, 52, 23, 77, 34, 52, 90, 56, 40, 49, 83, 98, 90, 66, 92, 64, 74, 96, 11, 72, 13, 72, 80, 36, 30, 57, 40, 1, 5, 69, 14, 62, 20, 36, 38, 5, 40, 79, 60, 31, 79, 95, 28, 68, 60, 20, 32, 85, 67, 94, 57, 79, 66, 88, 15, 95, 44, 6, 47, 100, 74, 13, 13, 45, 48, 51, 50, 39, 81, 61, 70, 60, 55, 49, 27, 15, 68, 10, 99, 34, 4, 7, 65, 69, 94, 79, 15, 89, 84, 61, 88, 9, 73, 1, 5, 73, 3, 6, 11, 35, 67, 32, 94, 21, 81, 73, 87, 48, 82, 86, 34, 85, 44, 98, 53, 38, 28, 19, 78, 63, 80, 18, 23, 4, 70, 27, 28, 72, 85, 91, 6, 51, 22, 52, 71, 54, 24, 58, 54, 5, 95, 39, 42, 38, 88, 46, 27, 15, 65, 5, 29, 96, 22, 51, 51, 43, 29, 79, 14, 13, 21, 71, 15, 94, 74, 86, 48, 97, 95, 1, 54, 89, 39, 47, 78, 26, 92, 5, 92, 56, 61, 20, 3, 34, 22, 54, 76, 2, 84, 41, 67, 4, 63, 33, 97, 37, 70, 44, 85, 64, 96, 90, 4, 86, 36, 34, 63, 28, 38, 54, 35, 50, 25, 38, 83, 98, 91, 10, 52, 74, 50, 70, 77, 12, 2, 25, 100, 72, 69, 85, 35, 16, 26, 91, 2, 62, 24, 64, 89, 13, 70, 23, 62, 46, 12, 96, 44, 2, 5, 47, 27, 6, 16, 3, 69, 17, 80, 21, 88, 48, 5, 75, 15, 82, 17, 16, 43, 40, 32, 83, 4, 1, 58, 17, 46, 69, 12, 41, 71, 68, 87, 49, 25, 2, 4, 93, 71, 83, 13, 10, 30, 69, 84, 44, 51, 52, 12, 45, 43, 43, 28, 46, 95, 85, 62, 40, 53, 25, 33, 75, 92, 19, 24, 16, 73, 27, 61, 43, 9, 25, 52, 90, 46, 88, 85, 96, 39, 48, 92, 82, 90, 19, 79, 36, 55, 41, 28, 8, 65, 60, 34, 9, 30, 57, 24, 2, 35, 36, 44, 95, 61, 48, 84, 6, 35, 21, 53, 73, 68, 44, 6, 10, 15, 85, 45, 69, 77, 72, 28, 41, 83, 62, 49, 13, 70, 25, 14, 57, 60, 10, 51, 72, 57, 87, 77, 91, 7, 81, 15, 26, 77, 21, 35, 91, 57, 32, 59, 33, 55, 39, 25, 38, 100, 74, 50, 21, 50, 63, 77, 9, 72, 28, 81, 80, 66, 9, 70, 24, 90, 85, 49, 66, 57, 36, 8, 65, 67, 18, 97, 21, 56, 21, 58, 55, 46, 59, 76, 95, 74, 52, 56, 97, 31, 36, 77, 96, 96, 46, 19, 37, 82, 20, 54, 90, 55, 61, 54, 73, 79, 2, 93, 34, 23, 3, 41, 20, 13, 68, 15, 86, 71, 70, 83, 2, 57, 11, 49, 52, 56, 20, 41, 90, 39, 94, 79, 45, 55, 85, 17, 33, 86, 61, 18, 60, 15, 58, 80, 28, 77, 46, 65, 48, 67, 99, 49, 23, 9, 49, 26, 17, 68, 66, 6, 58, 60, 36, 54, 66, 72, 70, 50, 58, 83, 67, 69, 49, 77, 100, 28, 53, 45, 93, 100, 11, 43, 100, 85, 52, 1, 63, 20, 20, 80, 77, 78, 91, 12, 31, 56, 84, 53, 5, 93, 87, 24, 61, 35, 100, 61, 63, 4, 57, 7, 4, 20, 49, 55, 56, 52, 55, 70, 71, 75, 50, 47, 4, 92, 11, 34, 48, 46, 38, 4, 38, 76, 27, 50, 11, 78, 62, 25, 82, 71, 31, 37, 90, 79, 91, 45, 31, 46, 15, 53, 72, 16, 100, 75, 7, 62, 60, 6, 7, 98, 10, 96, 73, 88, 97, 35, 18, 59, 59, 99, 29, 89, 87, 70, 20, 77, 66, 2, 74, 32, 54, 45, 47, 5, 71, 6, 66, 31, 11, 72, 80, 72, 19, 4, 60, 16, 39, 77, 74, 97, 27, 54, 38, 13, 75, 57, 41, 40, 10, 67, 72, 63, 63, 70, 20, 34, 75, 85, 64, 86, 9, 95, 57, 27, 98, 68, 42, 36, 96, 67, 85, 22, 72, 22, 86, 46, 30, 79, 38, 39, 45, 9, 53, 59, 78, 72, 92, 53, 57, 7, 90, 17, 1, 46, 43, 99, 14, 37, 86, 61, 55, 70, 83, 79, 43, 20, 24, 72, 98, 61, 10, 94, 21, 63, 5, 99, 86, 48, 3, 42, 55, 92, 58, 7, 89, 53, 57, 54, 41, 95, 15, 95, 64, 97, 73, 7, 68, 49, 30, 18, 61, 40, 11, 34, 54, 15, 32, 39, 63, 86, 33, 69, 77, 42, 27, 65, 46, 36, 19, 86, 30, 33, 33, 45, 81, 57, 3, 100, 5, 33, 17, 18, 24, 28, 51, 29, 94, 34, 19, 8, 71, 3, 28, 47, 45, 7, 63, 90, 42, 33, 28, 23, 17, 60, 19, 49, 16, 22, 49, 73, 6, 65, 42, 81, 44, 44, 61, 90, 29, 79, 97, 99, 82, 77, 97, 78, 83, 59, 19, 24, 44, 46, 98, 12, 57, 68, 61, 25, 41, 61, 49, 46, 25, 90, 78, 21, 33, 38, 10, 13, 17, 58, 11, 50, 34, 7, 79, 16, 65, 97, 91, 60, 95, 40, 72, 3, 8, 84, 27, 48, 44, 75, 46, 68, 16, 23, 40, 100, 61, 1, 12, 29, 59, 22, 30, 44, 28, 8, 60, 45, 56, 2, 56, 2, 42, 27, 57, 1, 10, 83, 48, 53, 10, 93, 73, 77, 68, 64, 77, 80, 65, 40, 8, 23, 14, 89, 66, 93, 48, 77, 37, 55, 31, 45, 57, 24, 71, 13, 24, 33, 47, 71, 37, 8, 16, 61, 85, 83, 25, 13, 14, 89, 4, 21, 63, 17, 61, 80, 10, 60, 9, 98, 14, 39, 42, 22, 62, 65, 86, 85, 97, 85, 7, 85, 92, 74, 46, 28, 8, 22, 40, 21, 10, 96, 93, 24, 12, 5, 3, 21, 64, 11, 71, 78, 1, 12, 99, 62, 76, 37, 98, 24, 21, 57, 61, 12, 30, 6, 92, 90, 27, 83, 10, 88, 78, 55, 63, 90, 59, 65, 62, 23, 28, 32, 52, 28, 44, 50, 42, 71, 38, 39, 47, 58, 95, 7, 22, 77, 64, 13, 66, 42, 95, 27, 81, 73, 33, 43, 14, 92, 59, 75, 66, 38, 7, 17, 66, 2, 18, 59, 72, 56, 49, 70, 13, 44, 76, 34, 72, 91, 98, 89, 84, 93, 15, 64, 17, 100, 58, 30, 91, 17, 4, 56, 54, 10, 72, 71, 11, 89, 81, 35, 96, 30, 4, 9, 73, 32, 94, 96, 74, 44, 84, 58, 36, 50, 73, 4, 49, 31, 33, 91, 99, 88, 46, 4, 98, 69, 27, 60, 10, 7, 46, 5, 36, 50, 65, 60, 33, 11, 55, 6, 54, 90, 15, 41, 92, 88, 44, 92, 70, 28, 83, 20, 15, 80, 23, 12, 49, 49, 24, 10, 8, 69, 14, 43, 70, 31, 55, 2, 41, 61, 60, 46, 51, 26, 86, 94, 13, 81, 85, 34, 8, 67, 53, 22, 99, 28, 86, 99, 28, 61, 8, 35, 29, 73, 30, 51, 3, 84, 4, 95, 44, 63, 40, 46, 89, 25, 39, 53, 5, 24, 39, 64, 42, 43, 86, 40, 22, 23, 38, 50, 83, 45, 36, 63, 70, 17, 13, 72, 100, 17, 67, 96, 31, 58, 93, 71, 83, 32, 76, 39, 7, 66, 55, 100, 8, 40, 40, 82, 62, 29, 83, 96, 26, 18, 58, 95, 35, 23, 18, 86, 91, 36, 33, 73, 94, 78, 44, 28, 9, 71, 18, 67, 36, 72, 66, 95, 63, 57, 76, 76, 38, 58, 71, 63, 28, 81, 9, 14, 3, 26, 51, 93, 14, 36, 65, 59, 13, 60, 86, 73, 30, 55, 91, 17, 27, 8, 64, 89, 65, 91, 17, 54, 1, 87, 68, 28, 67, 76, 93, 21, 53, 95, 65, 18, 30, 30, 76, 94, 41, 13, 66, 23, 68, 8, 39, 94, 16, 54, 34, 32, 45, 50, 85, 45, 89, 52, 24, 7, 27, 68, 28, 31, 62, 92, 49, 44, 73, 24, 37, 14, 37, 55, 36, 56, 62, 26, 1, 77, 80, 34, 8, 76, 36, 44, 20, 76, 95, 95, 82, 73, 62, 61, 56, 23, 53, 4, 18, 77, 79, 55, 42, 67, 61, 77, 22, 22, 55, 22, 51, 86, 8, 58, 61, 43, 2, 32, 70, 48, 26, 51, 21, 39, 12, 28, 13, 16, 31, 31, 92, 61, 37, 34, 28, 97, 62, 49, 18, 68, 71, 68, 5, 78, 78, 65, 72, 31, 48, 41, 78, 73, 43, 50, 63, 54, 77, 76, 21, 59, 6, 65, 20, 42, 50, 47, 90, 63, 95, 7, 83, 17, 27, 87, 94, 4, 52, 17, 34, 99, 57, 63, 24, 100, 13, 38, 5, 41, 13, 78, 100, 70, 94, 19, 63, 43, 65, 52, 57, 11, 11, 39, 28, 37, 26, 73, 40, 29, 90, 25, 27, 98, 87, 2, 49, 51, 92, 6, 92, 4, 83, 91, 26, 76, 61, 88, 70, 25, 40, 26, 87, 50, 17, 14, 38, 42, 39, 29, 70, 28, 53, 48, 77, 91, 2, 26, 42, 93, 31, 85, 96, 65, 27, 21, 92, 87, 61, 61, 63, 52, 38, 49, 53, 54, 15, 90, 95, 53, 18, 16, 32, 22, 64, 8, 64, 17, 85, 5, 9, 15, 41, 56, 79, 67, 29, 70, 53, 89, 82, 15, 92, 20, 16, 44, 25, 30, 33, 72, 34, 2, 87, 65, 75, 2, 24, 38, 18, 9, 95, 78, 75, 35, 34, 54, 54, 62, 75, 6, 2, 9, 73, 93, 80, 88, 36, 4, 17, 20, 75, 2, 73, 14, 18, 47, 67, 41, 36, 37, 1, 30, 14, 76, 17, 47, 81, 70, 60, 7, 75, 61, 15, 99, 53, 94, 86, 40, 50, 54, 59, 76, 55, 83, 41, 72, 29, 8, 65, 65, 44, 65, 46, 9, 92, 62, 8, 24, 83, 67, 31, 10, 80, 97, 8, 84, 43, 94, 24, 92, 99, 34, 67, 54, 69, 8, 25, 97, 67, 41, 13, 62, 6, 11, 70, 49, 24, 29, 73, 7, 96, 55, 68, 27, 3, 75, 10, 45, 20, 85, 36, 19, 71, 55, 24, 39, 14, 48, 87, 80, 41, 52, 93, 98, 62, 62, 46, 37, 91, 70, 43, 38, 24, 62, 16, 27, 37, 25, 23, 8, 62, 11, 26, 84, 65, 49, 22, 30, 49, 60, 9, 89, 11, 1, 86, 24, 14, 83, 61, 56, 53, 55, 45, 28, 17, 60, 6, 5, 37, 29, 12, 50, 39, 90, 33, 55, 90, 54, 84, 38, 13, 44, 78, 76, 96, 15, 99, 9, 50, 11, 17, 2, 66, 13, 29, 34, 73, 35, 38, 61, 15, 1, 10, 53, 90, 42, 7, 80, 47, 90, 69, 11, 33, 99, 86, 28, 13, 37, 88, 62, 47, 56, 15, 64, 69, 96, 49, 93, 82, 86, 53, 96, 39, 14, 48, 28, 55, 6, 7, 1, 95, 28, 63, 79, 26, 49, 58, 90, 85, 97, 4, 83, 53, 18, 99, 73, 13, 47, 65, 46, 85, 69, 41, 23, 82, 88, 2, 88, 45, 61, 40, 39, 88, 2, 69, 13, 2, 78, 54, 86, 75, 57, 21, 79, 27, 71, 51, 91, 17, 67, 37, 53, 87, 77, 75, 68, 17, 77, 7, 61, 37, 46, 52, 76, 99, 20, 40, 1, 98, 93, 38, 24, 2, 58, 2, 28, 28, 4, 18, 97, 70, 54, 49, 56, 83, 76, 75, 99, 52, 81, 11, 40, 78, 62, 15, 76, 34, 54, 76, 83, 98, 14, 58, 99, 23, 59, 26, 3, 14, 96, 99, 35, 1, 99, 42, 83, 74, 68, 33, 25, 48, 44, 16, 77, 57, 30, 4, 42, 35, 32, 24, 33, 45, 81, 31, 19, 91, 9, 21, 4, 4, 71, 90, 4, 70, 31, 39, 43, 98, 71, 20, 97, 66, 35, 25, 23, 17, 29, 64, 51, 60, 40, 35, 56, 72, 18, 26, 63, 26, 47, 18, 81, 69, 60, 84, 90, 90, 74, 33, 40, 45, 4, 36, 10, 38, 61, 84, 6, 41, 100, 57, 100, 91, 43, 7, 62, 60, 32, 76, 37, 30, 46, 69, 99, 5, 53, 88, 94, 78, 72, 33, 22, 75, 21, 84, 65, 33, 19, 70, 73, 18, 78, 24, 8, 21, 30, 22, 32, 61, 97, 21, 91, 42, 89, 41, 46, 93, 80, 92, 71, 4, 76, 44, 30, 96, 27, 94, 80, 46, 64, 52, 15, 93, 75, 75, 65, 4, 96, 97, 17, 92, 69, 59, 86, 57, 51, 83, 2, 82, 74, 72, 85, 2, 15, 15, 49, 94, 60, 29, 39, 75, 80, 5, 68, 7, 79, 32, 62, 74, 80, 78, 18, 48, 88, 3, 57, 38, 85, 58, 72, 11, 81, 56, 12, 95, 22, 60, 40, 82, 88, 30, 8, 20, 35, 75, 78, 13, 59, 39, 39, 38, 69, 56, 38, 56, 10, 46, 46, 94, 3, 69, 56, 83, 24, 67, 29, 98, 79, 69, 31, 18, 98, 38, 37, 84, 65, 14, 97, 23, 5, 87, 12, 73, 42, 1, 80, 51, 46, 77, 96, 100, 45, 4, 82, 21, 22, 63, 18, 100, 83, 100, 18, 32, 37, 6, 16, 53, 20, 64, 27, 76, 50, 39, 48, 43, 91, 27, 45, 37, 56, 92, 36, 100, 95, 70, 72, 17, 84, 41, 16, 66, 40, 85, 97, 29, 91, 64, 81, 62, 27, 8, 37, 28, 98, 36, 70, 40, 14, 14, 76, 69, 6, 64, 21, 52, 85, 92, 68, 68, 33, 36, 85, 72, 20, 33, 100, 62, 97, 33, 23, 75, 40, 11, 3, 89, 46, 24, 28, 60, 90, 56, 28, 95, 71, 48, 46, 55, 92, 66, 74, 24, 1, 10, 47, 72, 42, 47, 34, 90, 31, 56, 65, 70, 19, 19, 10, 64, 42, 37, 23, 83, 44, 3, 77, 14, 2, 75, 20, 93, 92, 93, 68, 92, 2, 15, 63, 96, 13, 48, 85, 43, 56, 1, 64, 74, 19, 73, 37, 13, 61, 12, 95, 5, 66, 24, 18, 19, 50, 38, 12, 41, 82, 31, 84, 84, 45, 98, 79, 57, 46, 15, 99, 1, 16, 62, 26, 86, 86, 14, 50, 47, 25, 97, 51, 42, 20, 68, 61, 21, 57, 24, 61, 39, 54, 44, 74, 99, 41, 4, 7, 38, 18, 58, 38, 85, 71, 63, 71, 57, 77, 72, 3, 53, 68, 5, 95, 39, 72, 7, 59, 81, 30, 71, 19, 35, 66, 44, 33, 7, 47, 92, 96, 16, 49, 34, 1, 19, 48, 23, 75, 76, 94, 29, 29, 62, 33, 75, 100, 57, 33, 11, 37, 62, 81, 7, 96, 99, 50, 81, 57, 48, 24, 52, 63, 72, 85, 63, 42, 85, 85, 69, 60, 79, 97, 40, 92, 30, 66, 43, 38, 98, 5, 74, 11, 38, 32, 59, 36, 33, 91, 92, 80, 14, 43, 42, 85, 80, 5, 78, 64, 41, 46, 75, 71, 43, 67, 62, 24, 32, 57, 61, 30, 61, 86, 92, 98, 17, 50, 33, 49, 40, 24, 28, 53, 19, 21, 89, 98, 25, 67, 13, 18, 12, 87, 88, 6, 53, 2, 29, 37, 58, 41, 66, 18, 26, 57, 68, 94, 59, 100, 94, 98, 76, 21, 3, 94, 94, 91, 91, 70, 9, 3, 87, 21, 41, 75, 26, 46, 28, 7, 82, 85, 47, 99, 54, 73, 7, 21, 18, 65, 21, 12, 15, 96, 84, 17, 89, 77, 59, 31, 47, 68, 85, 33, 40, 25, 59, 17, 22, 86, 23, 55, 22, 22, 5, 76, 94, 12, 96, 11, 28, 68, 74, 42, 15, 58, 10, 55, 34, 69, 37, 80, 88, 21, 65, 27, 98, 23, 95, 71, 9, 70, 26, 82, 91, 30, 57, 84, 93, 5, 46, 21, 24, 20, 62, 91, 29, 24, 97, 62, 92, 34, 94, 31, 54, 58, 57, 3, 80, 3, 74, 40, 72, 51, 22, 62, 80, 30, 97, 73, 34, 43, 45, 10, 14, 6, 100, 42, 81, 96, 55, 72, 81, 48, 2, 35, 5, 10, 89, 37, 13, 62, 76, 84, 12, 49, 98, 44, 79, 94, 68, 64, 88, 12, 73, 53, 69, 24, 46, 50, 72, 1, 73, 52, 48, 75, 38, 53, 36, 79, 89, 100, 40, 16, 36, 4, 65, 33, 99, 95, 26, 66, 10, 66, 77, 35, 18, 97, 58, 64, 46, 81, 64, 19, 85, 63, 45, 22, 67, 32, 100, 7, 32, 92, 23, 67, 47, 39, 51, 45, 85, 28, 62, 94, 93, 90, 28, 63, 86, 38, 26, 32, 18, 41, 2, 2, 3, 46, 76, 70, 77, 27, 76, 60, 70, 50, 78, 16, 40, 28, 12, 24, 8, 73, 18, 52, 62, 97, 14, 48, 34, 91, 31, 4, 31, 32, 5, 86, 77, 32, 7, 5, 59, 34, 65, 28, 84, 94, 96, 75, 22, 7, 99, 81, 32, 68, 32, 93, 64, 98, 92, 98, 88, 22, 1, 71, 53, 57, 8, 81, 41, 14, 38, 51, 47, 2, 30, 82, 95, 25, 57, 68, 84, 7, 100, 15, 74, 32, 7, 37, 29, 99, 86, 68, 72, 38, 90, 25, 95, 97, 57, 35, 10, 94, 37, 9, 47, 66, 42, 94, 91, 50, 13, 74, 56, 13, 88, 81, 44, 46, 70, 24, 96, 55, 43, 68, 93, 33, 44, 39, 29, 100, 25, 91, 46, 61, 51, 92, 26, 92, 37, 68, 94, 50, 41, 1, 62, 80, 82, 57, 78, 51, 32, 73, 57, 74, 40, 49, 58, 83, 87, 87, 35, 11, 29, 80, 23, 79, 23, 49, 70, 60, 16, 15, 61, 9, 16, 22, 88, 97, 78, 17, 99, 61, 90, 55, 34, 81, 56, 44, 16, 42, 30, 50, 5, 58, 81, 27, 88, 55, 27, 57, 66, 43, 72, 26, 51, 39, 47, 90, 35, 76, 7, 85, 88, 48, 39, 74, 28, 46, 17, 43, 40, 98, 44, 96, 55, 76, 22, 94, 31, 1, 2, 96, 43, 73, 74, 45, 63, 72, 86, 97, 100, 44, 33, 87, 91, 24, 60, 71, 69, 76, 13, 8, 73, 9, 3, 79, 84, 77, 72, 14, 77, 74, 62, 71, 98, 35, 67, 61, 58, 4, 9, 57, 100, 94, 44, 42, 17, 55, 12, 37, 31, 77, 45, 55, 85, 99, 86, 68, 27, 57, 34, 55, 82, 47, 77, 32, 33, 95, 44, 90, 99, 52, 47, 98, 97, 42, 39, 13, 96, 3, 50, 78, 79, 46, 33, 15, 96, 18, 82, 75, 26, 67, 29, 8, 13, 58, 91, 45, 52, 34, 35, 50, 37, 33, 99, 34, 74, 38, 98, 69, 92, 47, 47, 70, 44, 31, 84, 92, 48, 17, 66, 73, 36, 94, 32, 48, 51, 22, 93, 55, 7, 79, 4, 44, 11, 3, 77, 84, 92, 74, 52, 35, 73, 50, 4, 68, 80, 39, 59, 79, 7, 24, 4, 42, 70, 35, 42, 72, 9, 34, 26, 15, 12, 30, 10, 22, 84, 86, 57, 27, 12, 60, 61, 84, 10, 16, 51, 41, 6, 62, 20, 12, 85, 23, 6, 54, 9, 47, 26, 17, 32, 51, 84, 95, 32, 93, 16, 67, 31, 24, 93, 42, 83, 53, 77, 92, 20, 79, 33, 25, 40, 52, 89, 77, 26, 94, 30, 34, 92, 7, 51, 23, 10, 86, 17, 41, 30, 84, 60, 60, 7, 52, 53, 41, 57, 81, 33, 76, 12, 17, 53, 51, 20, 41, 27, 45, 86, 9, 78, 77, 67, 80, 51, 76, 17, 19, 69, 47, 2, 28, 58, 60, 79, 11, 100, 87, 43, 84, 63, 54, 52, 67, 57, 23, 7, 83, 67, 92, 43, 97, 20, 10, 28, 70, 85, 45, 88, 53, 43, 41, 32, 100, 52, 11, 62, 3, 97, 5, 87, 11, 58, 90, 77, 14, 13, 35, 49, 31, 78, 91, 79, 97, 52, 59, 66, 89, 3, 5, 41, 45, 97, 73, 96, 48, 35, 58, 51, 83, 62, 89, 46, 71, 30, 74, 37, 42, 61, 85, 25, 38, 27, 55, 35, 79, 13, 52, 67, 67, 57, 59, 63, 5, 83, 59, 53, 69, 68, 55, 4, 29, 43, 49, 51, 72, 74, 87, 66, 34, 71, 42, 72, 50, 96, 58, 28, 61, 9, 46, 27, 17, 56, 90, 22, 91, 100, 26, 59, 67, 80, 62, 47, 22, 62, 97, 45, 88, 84, 10, 21, 6, 3, 44, 55, 51, 1, 34, 11, 10, 79, 37, 26, 87, 78, 99, 77, 77, 24, 35, 95, 3, 49, 41, 76, 10, 38, 21, 97, 21, 82, 70, 78, 85, 13, 33, 35, 14, 66, 97, 75, 97, 33, 52, 83, 63, 51, 59, 91, 26, 45, 86, 29, 93, 26, 56, 55, 63, 76, 3, 35, 10, 24, 13, 46, 37, 97, 32, 2, 14, 28, 28, 10, 12, 79, 44, 74, 81, 2, 65, 7, 99, 50, 87, 91, 27, 42, 97, 90, 70, 52, 76, 79, 75, 40, 24, 63, 36, 55, 16, 2, 34, 43, 11, 45, 22, 55, 19, 2, 8, 35, 8, 6, 36, 46, 49, 62, 88, 97, 3, 57, 48, 79, 87, 23, 70, 10, 37, 58, 16, 53, 59, 49, 95, 69, 45, 16, 75, 15, 70, 83, 49, 29, 40, 84, 75, 88, 98, 14, 85, 100, 22, 84, 30, 8, 58, 100, 17, 95, 9, 84, 47, 67, 84, 93, 87, 28, 61, 62, 43, 30, 96, 91, 10, 35, 27, 84, 75, 24, 49, 11, 75, 70, 94, 5, 77, 52, 4, 45, 98, 64, 28, 96, 30, 63, 88, 16, 91, 48, 29, 33, 29, 76, 75, 39, 63, 53, 74, 37, 28, 23, 47, 3, 92, 92, 7, 21, 43, 62, 65, 92, 25, 45, 87, 6, 7, 75, 73, 97, 74, 2, 81, 55, 29, 8, 45, 91, 60, 70, 27, 88, 92, 25, 42, 36, 69, 48, 8, 11, 61, 72, 55, 37, 68, 41, 42, 75, 67, 14, 23, 93, 67, 4, 47, 96, 11, 43, 86, 22, 12, 65, 61, 56, 41, 2, 43, 9, 49, 50, 72, 61, 73, 26, 97, 41, 18, 38, 67, 85, 4, 89, 77, 70, 44, 75, 17, 6, 17, 55, 28, 28, 71, 88, 83, 63, 42, 25, 72, 90, 26, 95, 3, 99, 72, 99, 91, 89, 89, 57, 25, 44, 97, 1, 65, 41, 27, 82, 46, 43, 88, 25, 71, 58, 65, 5, 20, 6, 82, 43, 47, 7, 89, 49, 5, 60, 100, 47, 1, 40, 3, 77, 83, 100, 78, 99, 92, 56, 32, 37, 99, 19, 14, 21, 76, 78, 25, 96, 83, 6, 90, 81, 65, 79, 30, 21, 38, 81, 68, 90, 20, 70, 67, 54, 21, 96, 4, 12, 51, 36, 1, 1, 54, 14, 21, 30, 91, 98, 77, 25, 3, 18, 5, 19, 96, 86, 40, 86, 18, 7, 75, 89, 76, 93, 94, 49, 88, 98, 60, 91, 33, 60, 91, 38, 73, 64, 67, 15, 61, 95, 91, 15, 13, 48, 34, 60, 33, 73, 45, 3, 79, 72, 91, 6, 64, 85, 6, 4, 82, 66, 94, 66, 77, 36, 3, 50, 99, 22, 16, 11, 68, 7, 78, 80, 6, 11, 40, 90, 35, 36, 92, 65, 7, 83, 22, 71, 67, 28, 74, 100, 93, 19, 65, 69, 6, 67, 70, 57, 40, 38, 67, 8, 96, 44, 87, 1, 6, 78, 90, 40, 14, 82, 4, 72, 64, 26, 42, 82, 53, 67, 81, 97, 85, 45, 17, 91, 63, 87, 47, 55, 24, 65, 62, 19, 9, 100, 71, 14, 78, 60, 6, 43, 41, 9, 14, 56, 86, 8, 37, 90, 74, 69, 86, 11, 13, 3, 1, 28, 41, 99, 82, 16, 63, 43, 86, 23, 94, 56, 89, 23, 15, 94, 17, 8, 54, 31, 63, 40, 90, 52, 81, 63, 20, 19, 73, 85, 73, 25, 64, 13, 75, 45, 28, 90, 39, 65, 12, 84, 20, 100, 7, 86, 45, 23, 93, 99, 5, 8, 90, 94, 59, 22, 9, 30, 40, 33, 14, 12, 10, 77, 76, 84, 73, 55, 73, 63, 19, 37, 47, 38, 88, 53, 24, 33, 27, 68, 83, 32, 75, 24, 25, 85, 45, 85, 15, 85, 18, 28, 48, 27, 57, 24, 10, 29, 78, 35, 44, 97, 71, 42, 86, 10, 46, 9, 94, 72, 29, 76, 3, 3, 51, 80, 88, 96, 64, 2, 32, 33, 81, 79, 59, 89, 2, 69, 18, 32, 55, 13, 28, 77, 54, 13, 86, 99, 74, 80, 22, 2, 7, 77, 56, 58, 56, 95, 5, 71, 48, 36, 4, 29, 14, 62, 17, 68, 82, 86, 99, 88, 50, 78, 64, 3, 42, 2, 53, 67, 33, 27, 68, 39, 3, 76, 48, 10, 70, 52, 32, 18, 39, 35, 46, 5, 49, 14, 72, 82, 52, 22, 70, 1, 51, 85, 56, 92, 86, 60, 59, 18, 86, 78, 9, 40, 53, 8, 49, 23, 60, 81, 92, 50, 67, 37, 54, 67, 2, 77, 49, 5, 98, 70, 6, 48, 6, 13, 92, 44, 72, 50, 61, 10, 79, 21, 49, 32, 29, 50, 6, 40, 30, 97, 89, 48, 85, 43, 15, 38, 19, 15, 43, 69, 36, 48, 68, 41, 60, 59, 84, 83, 60, 97, 44, 39, 17, 93, 22, 97, 42, 27, 36, 23, 75, 25, 70, 59, 19, 36, 96, 37, 50, 38, 57, 85, 37, 25, 78, 48, 83, 61, 83, 95, 9, 26, 33, 26, 70, 6, 74, 63, 32, 10, 85, 58, 86, 7, 16, 4, 94, 63, 40, 44, 53, 49, 80, 41, 73, 57, 89, 7, 70, 23, 1, 78, 48, 85, 55, 18, 90, 29, 80, 73, 90, 17, 30, 75, 75, 97, 78, 68, 60, 69, 63, 64, 17, 95, 4, 89, 3, 44, 48, 72, 66, 100, 2, 14, 85, 8, 83, 26, 36, 14, 99, 77, 82, 80, 51, 56, 77, 80, 76, 88, 49, 90, 51, 17, 84, 6, 58, 87, 50, 5, 10, 15, 4, 63, 80, 40, 71, 62, 66, 58, 76, 16, 35, 57, 95, 37, 65, 23, 17, 92, 10, 65, 81, 12, 33, 17, 70, 90, 55, 19, 94, 16, 33, 50, 79, 13, 89, 49, 26, 6, 58, 53, 21, 92, 10, 68, 29, 26, 90, 97, 17, 52, 13, 49, 15, 45, 65, 84, 35, 19, 54, 80, 35, 87, 29, 13, 51, 18, 13, 28, 23, 70, 81, 96, 14, 42, 63, 94, 67, 4, 90, 35, 7, 54, 83, 74, 98, 48, 57, 84, 18, 11, 64, 52, 49, 92, 16, 51, 61, 80, 30, 36, 2, 10, 31, 67, 51, 45, 60, 69, 100, 1, 3, 7, 54, 38, 80, 3, 85, 88, 87, 54, 50, 2, 58, 50, 45, 25, 52, 6, 5, 82, 93, 58, 91, 23, 24, 94, 19, 83, 14, 18, 35, 17, 24, 40, 6, 55, 42, 42, 95, 80, 95, 96, 33, 52, 46, 78, 77, 49, 35, 33, 30, 27, 90, 73, 1, 13, 18, 19, 47, 31, 36, 81, 99, 60, 20, 4, 66, 13, 45, 60, 45, 40, 8, 77, 43, 53, 6, 71, 53, 40, 3, 83, 18, 92, 7, 18, 56, 24, 36, 2, 54, 72, 82, 53, 83, 53, 8, 48, 18, 53, 60, 62, 44, 67, 90, 38, 71, 48, 9, 23, 39, 11, 57, 57, 55, 63, 74, 10, 38, 62, 12, 44, 33, 45, 48, 67, 98, 55, 66, 15, 59, 25, 28, 2, 43, 69, 40, 65, 16, 48, 40, 7, 10, 48, 63, 64, 63, 88, 74, 100, 49, 85, 43, 33, 81, 90, 99, 78, 97, 65, 44, 55, 41, 23, 9, 36, 92, 100, 52, 59, 99, 91, 65, 8, 91, 79, 72, 53, 19, 97, 4, 67, 33, 99, 52, 13, 40, 50, 91, 36, 66, 86, 43, 7, 61, 51, 94, 4, 50, 45, 62, 48, 88, 79, 7, 78, 9, 78, 82, 27, 26, 37, 46, 58, 35, 97, 71, 75, 98, 13, 62, 64, 50, 4, 70, 10, 54, 15, 13, 55, 59, 27, 54, 98, 5, 61, 75, 65, 90, 8, 92, 16, 45, 89, 73, 79, 85, 95, 5, 82, 7, 67, 45, 57, 22, 66, 18, 28, 80, 31, 82, 91, 57, 36, 88, 13, 96, 15, 77, 85, 22, 20, 52, 18, 8, 25, 49, 92, 19, 53, 26, 78, 71, 22, 86, 45, 88, 3, 72, 19, 85, 5, 9, 41, 40, 49, 53, 87, 63, 82, 24, 36, 53, 75, 54, 61, 51, 2, 4, 70, 6, 81, 99, 29, 3, 36, 73, 90, 38, 44, 60, 23, 48, 21, 15, 40, 69, 20, 78, 83, 53, 1, 70, 5, 28, 75, 65, 78, 28, 21, 99, 34, 1, 97, 62, 3, 84, 86, 44, 22, 81, 56, 96, 80, 76, 62, 19, 96, 81, 49, 78, 85, 1, 99, 90, 28, 74, 6, 6, 1, 26, 4, 86, 79, 53, 99, 81, 36, 84, 77, 9, 64, 32, 56, 44, 7, 70, 14, 54, 2, 14, 83, 87, 15, 81, 76, 42, 54, 81, 99, 7, 7, 55, 92, 85, 7, 91, 17, 94, 74, 93, 55, 90, 76, 62, 85, 34, 31, 50, 87, 33, 64, 69, 19, 78, 50, 46, 71, 55, 26, 70, 61, 84, 24, 53, 20, 82, 43, 89, 27, 68, 33, 81, 57, 9, 95, 41, 42, 77, 91, 81, 9, 6, 49, 79, 83, 50, 76, 53, 5, 2, 74, 17, 37, 97, 69, 57, 78, 63, 97, 57, 83, 29, 89, 39, 37, 83, 32, 31, 60, 74, 11, 20, 31, 11, 51, 13, 13, 26, 17, 69, 79, 43, 85, 16, 39, 6, 24, 69, 20, 20, 25, 2, 48, 13, 93, 37, 48, 76, 19, 59, 1, 81, 78, 31, 91, 80, 95, 3, 6, 63, 23, 84, 5, 8, 51, 44, 13, 74, 64, 84, 45, 40, 86, 93, 52, 78, 81, 51, 5, 99, 9, 5, 79, 87, 35, 21, 18, 29, 76, 23, 91, 98, 59, 96, 5, 61, 91, 69, 35, 6, 53, 79, 45, 90, 23, 48, 67, 55, 99, 71, 53, 7, 75, 31, 45, 61, 4, 63, 89, 79, 37, 31, 76, 47, 78, 33, 8, 20, 1, 94, 25, 5, 24, 21, 94, 47, 69, 12, 53, 19, 82, 6, 25, 8, 88, 22, 20, 91, 36, 60, 69, 24, 43, 97, 71, 20, 29, 30, 92, 81, 23, 68, 86, 46, 89, 79, 44, 9, 91, 97, 27, 24, 2, 3, 84, 41, 24, 55, 32, 11, 15, 52, 35, 57, 48, 57, 28, 76, 86, 19, 57, 8, 87, 94, 5, 27, 72, 49, 87, 14, 45, 13, 90, 98, 67, 25, 90, 43, 79, 21, 53, 93, 73, 39, 49, 72, 95, 29, 48, 80, 47, 56, 39, 85, 49, 44, 63, 72, 92, 49, 38, 88, 13, 27, 37, 80, 51, 26, 22, 29, 99, 74, 74, 23, 13, 74, 94, 59, 2, 41, 39, 1, 48, 77, 85, 48, 20, 100, 20, 63, 48, 9, 50, 13, 35, 38, 92, 37, 64, 13, 17, 14, 38, 90, 36, 2, 16, 29, 61, 17, 22, 99, 17, 69, 27, 54, 69, 99, 53, 88, 61, 52, 48, 63, 64, 82, 100, 7, 70, 15, 19, 38, 28, 9, 28, 63, 10, 95, 44, 70, 63, 65, 20, 32, 85, 47, 85, 53, 97, 89, 92, 57, 92, 39, 19, 8, 72, 71, 14, 41, 85, 85, 79, 65, 93, 58, 79, 2, 52, 22, 24, 66, 86, 43, 97, 71, 41, 81, 23, 37, 21, 67, 46, 13, 5, 64, 72, 77, 86, 85, 69, 71, 69, 99, 87, 13, 56, 65, 15, 59, 87, 90, 25, 72, 84, 21, 94, 25, 54, 69, 13, 26, 35, 58, 90, 39, 74, 61, 67, 59, 98, 36, 81, 66, 34, 67, 79, 42, 84, 45, 52, 70, 34, 28, 41, 69, 49, 87, 93, 54, 55, 58, 79, 89, 67, 21, 79, 92, 81, 46, 3, 78, 33, 35, 96, 18, 54, 26, 11, 37, 22, 63, 6, 7, 90, 98, 75, 90, 84, 20, 95, 38, 77, 26, 78, 95, 46, 57, 87, 26, 54, 89, 56, 38, 23, 51, 7, 28, 76, 18, 64, 97, 32, 69, 55, 73, 67, 29, 15, 2, 48, 9, 92, 24, 34, 69, 19, 79, 77, 57, 57, 82, 97, 12, 71, 71, 14, 78, 99, 41, 47, 62, 89, 30, 31, 43, 2, 49, 71, 16, 50, 19, 25, 93, 94, 10, 62, 64, 41, 90, 20, 97, 72, 16, 60, 42, 87, 25, 71, 85, 65, 69, 98, 53, 98, 28, 95, 52, 28, 17, 67, 30, 35, 43, 22, 81, 53, 35, 44, 45, 25, 16, 41, 96, 31, 52, 89, 69, 76, 12, 5, 92, 32, 3, 44, 30, 82, 90, 81, 10, 58, 99, 39, 45, 42, 12, 25, 46, 47, 68, 90, 71, 83, 82, 18, 66, 85, 58, 34, 12, 69, 39, 3, 1, 93, 46, 82, 74, 87, 14, 83, 44, 12, 73, 88, 5, 85, 64, 50, 83, 32, 91, 53, 66, 24, 22, 83, 8, 79, 69, 19, 100, 59, 73, 52, 51, 18, 33, 24, 56, 46, 7, 52, 9, 31, 39, 14, 15, 3, 15, 49, 86, 58, 1, 3, 81, 22, 38, 41, 53, 6, 11, 52, 64, 84, 3, 14, 53, 87, 37, 61, 84, 95, 12, 92, 26, 2, 57, 92, 56, 24, 41, 93, 81, 93, 96, 13, 67, 85, 5, 19, 90, 16, 70, 5, 51, 24, 18, 55, 10, 6, 15, 45, 53, 26, 88, 30, 80, 97, 73, 35, 20, 65, 28, 52, 58, 75, 64, 24, 59, 21, 42, 48, 88, 63, 4, 38, 38, 21, 92, 99, 78, 59, 43, 82, 36, 82, 63, 15, 78, 36, 50, 97, 100, 77, 100, 57, 3, 16, 32, 61, 36, 25, 60, 23, 39, 63, 12, 76, 35, 55, 74, 64, 13, 68, 46, 49, 50, 8, 63, 27, 43, 64, 76, 95, 92, 27, 51, 94, 42, 35, 54, 77, 59, 13, 51, 98, 75, 62, 25, 9, 17, 99, 25, 29, 18, 70, 29, 19, 29, 44, 46, 72, 7, 73, 18, 99, 99, 68, 44, 41, 54, 98, 69, 13, 62, 72, 62, 89, 33, 86, 49, 1, 36, 73, 82, 54, 94, 10, 72, 23, 5, 69, 46, 12, 93, 63, 62, 44, 82, 5, 36, 36, 54, 4, 48, 68, 75, 61, 8, 60, 46, 56, 60, 82, 81, 93, 87, 74, 55, 10, 96, 59, 31, 41, 22, 23, 3, 83, 66, 85, 40, 1, 20, 45, 57, 19, 64, 83, 79, 71, 94, 76, 27, 6, 9, 7, 98, 95, 80, 52, 57, 28, 63, 87, 68, 84, 61, 23, 19, 79, 59, 58, 79, 30, 54, 87, 100, 18, 22, 78, 88, 67, 5, 66, 72, 14, 24, 22, 60, 56, 25, 16, 83, 87, 54, 2, 71, 15, 76, 89, 93, 34, 98, 23, 63, 3, 62, 62, 20, 35, 91, 60, 1, 96, 25, 25, 61, 49, 46, 20, 4, 22, 88, 38, 9, 41, 39, 31, 7, 15, 71, 51, 100, 20, 74, 15, 22, 87, 76, 94, 21, 19, 53, 21, 66, 29, 45, 26, 29, 42, 45, 84, 64, 84, 73, 24, 25, 12, 6, 83, 78, 28, 34, 29, 47, 7, 43, 20, 93, 71, 65, 65, 89, 69, 85, 54, 50, 82, 79, 78, 75, 75, 14, 38, 59, 86, 13, 35, 49, 70, 17, 78, 97, 50, 7, 95, 8, 49, 15, 52, 19, 31, 16, 59, 100, 53, 12, 49, 34, 42, 78, 60, 17, 91, 50, 27, 77, 62, 61, 25, 32, 77, 3, 28, 79, 9, 75, 86, 9, 41, 38, 80, 71, 5, 38, 22, 57, 2, 70, 42, 43, 48, 2, 11, 90, 51, 37, 66, 64, 97, 43, 95, 26, 45, 75, 4, 5, 49, 41, 65, 89, 30, 44, 59, 35, 82, 81, 91, 35, 2, 85, 77, 1, 86, 88, 91, 88, 76, 8, 51, 25, 50, 46, 50, 46, 72, 5, 2, 20, 45, 67, 60, 75, 10, 70, 61, 43, 2, 3, 77, 4, 87, 6, 56, 72, 45, 98, 59, 20, 6, 62, 44, 7, 7, 45, 53, 78, 49, 54, 49, 46, 72, 8, 20, 82, 29, 32, 76, 31, 34, 5, 86, 21, 10, 41, 44, 54, 39, 55, 25, 96, 16, 69, 2, 74, 65, 54, 3, 14, 60, 51, 59, 31, 10, 30, 64, 90, 61, 40, 20, 94, 96, 5, 66, 5, 98, 62, 10, 36, 16, 34, 83, 83, 54, 84, 56, 19, 90, 10, 84, 49, 12, 42, 31, 21, 23, 47, 62, 83, 86, 82, 28, 33, 38, 46, 37, 35, 7, 98, 22, 74, 31, 56, 56, 37, 40, 63, 7, 29, 72, 90, 29, 83, 83, 59, 55, 5, 5, 16, 39, 42, 49, 66, 74, 87, 63, 62, 73, 69, 59, 47, 94, 42, 2, 49, 78, 93, 63, 84, 21, 34, 25, 49, 16, 7, 60, 22, 11, 64, 38, 49, 58, 86, 66, 31, 24, 29, 45, 49, 49, 3, 47, 95, 96, 48, 43, 73, 41, 58, 8, 13, 91, 32, 62, 59, 38, 21, 80, 100, 36, 69, 48, 93, 7, 66, 76, 82, 46, 72, 30, 46, 74, 76, 40, 70, 76, 83, 94, 68, 40, 54, 32, 82, 85, 93, 40, 75, 65, 72, 74, 53, 92, 22, 97, 98, 87, 72, 80, 84, 43, 61, 29, 69, 89, 69, 90, 16, 3, 35, 35, 94, 88, 66, 75, 73, 11, 67, 99, 75, 90, 72, 79, 81, 93, 76, 31, 31, 99, 62, 14, 94, 22, 43, 14, 62, 63, 3, 77, 65, 89, 63, 58, 77, 29, 32, 1, 39, 50, 99, 65, 39, 70, 44, 72, 15, 19, 2, 97, 17, 63, 63, 62, 36, 5, 75, 50, 19, 77, 78, 83, 18, 41, 40, 94, 69, 23, 94, 7, 25, 44, 71, 63, 13, 66, 86, 79, 84, 87, 76, 53, 1, 38, 14, 89, 94, 89, 38, 12, 17, 15, 46, 34, 7, 85, 79, 75, 59, 24, 33, 83, 67, 56, 98, 32, 21, 83, 62, 57, 70, 37, 9, 22, 26, 74, 10, 19, 14, 99, 82, 31, 14, 27, 16, 72, 63, 47, 47, 22, 70, 31, 4, 89, 86, 1, 20, 7, 84, 81, 15, 5, 70, 23, 26, 95, 48, 36, 66, 62, 86, 47, 44, 99, 26, 11, 71, 88, 57, 69, 9, 27, 99, 65, 15, 37, 17, 86, 95, 100, 18, 9, 56, 39, 83, 82, 34, 30, 69, 51, 91, 54, 49, 86, 5, 74, 97, 27, 62, 53, 47, 22, 31, 97, 86, 45, 33, 55, 82, 27, 54, 52, 35, 62, 90, 69, 95, 75, 99, 15, 25, 41, 20, 74, 27, 24, 47, 75, 2, 60, 27, 48, 34, 10, 45, 71, 54, 29, 25, 88, 56, 31, 39, 42, 92, 28, 11, 86, 3, 61, 100, 79, 1, 19, 52, 79, 95, 51, 53, 96, 62, 32, 96, 95, 41, 92, 66, 46, 20, 42, 85, 27, 72, 23, 69, 63, 3, 31, 100, 5, 91, 99, 83, 91, 70, 87, 22, 16, 89, 26, 63, 50, 57, 58, 45, 49, 1, 62, 47, 73, 3, 31, 99, 27, 6, 19, 89, 8, 49, 89, 64, 39, 39, 98, 82, 60, 84, 55, 75, 72, 80, 38, 74, 89, 47, 70, 37, 48, 83, 35, 20, 85, 66, 70, 11, 71, 89, 52, 30, 37, 92, 93, 28, 82, 90, 9, 42, 26, 63, 68, 49, 94, 57, 74, 82, 4, 43, 71, 3, 25, 5, 74, 62, 22, 43, 24, 92, 31, 75, 73, 68, 18, 65, 95, 100, 7, 55, 93, 84, 69, 12, 84, 14, 69, 58, 96, 72, 100, 66, 74, 77, 22, 47, 38, 44, 41, 61, 87, 72, 36, 60, 91, 5, 24, 85, 4, 82, 91, 48, 17, 11, 60, 1, 24, 28, 58, 71, 51, 9, 36, 76, 85, 58, 74, 22, 1, 14, 35, 87, 85, 22, 98, 75, 26, 22, 11, 82, 55, 53, 29, 72, 63, 40, 24, 39, 67, 81, 9, 17, 41, 97, 92, 78, 6, 65, 99, 58, 79, 33, 44, 15, 6, 94, 90, 32, 15, 52, 13, 21, 5, 93, 44, 19, 33, 67, 57, 51, 99, 18, 68, 40, 14, 11, 17, 19, 28, 67, 76, 58, 52, 71, 24, 57, 64, 13, 40, 30, 17, 52, 3, 21, 45, 46, 39, 29, 13, 48, 79, 11, 65, 98, 2, 30, 9, 18, 48, 88, 37, 75, 97, 40, 45, 20, 96, 61, 85, 36, 42, 1, 39, 44, 21, 35, 90, 11, 63, 2, 10, 42, 64, 74, 39, 66, 3, 99, 35, 2, 38, 71, 76, 34, 10, 73, 6, 58, 33, 90, 45, 74, 42, 83, 70, 62, 18, 59, 24, 32, 12, 34, 25, 75, 59, 16, 40, 14, 66, 75, 15, 4, 97, 43, 89, 59, 67, 94, 16, 51, 35, 60, 76, 76, 94, 45, 89, 63, 3, 65, 95, 14, 50, 19, 89, 8, 34, 80, 73, 100, 54, 40, 55, 3, 82, 95, 61, 100, 41, 76, 50, 75, 87, 25, 3, 80, 70, 43, 43, 24, 7, 89, 38, 56, 59, 78, 64, 93, 57, 88, 44, 63, 27, 50, 65, 60, 44, 25, 59, 84, 52, 8, 59, 90, 33, 13, 69, 54, 55, 63, 77, 62, 3, 66, 17, 62, 43, 32, 6, 52, 72, 49, 14, 98, 98, 30, 58, 41, 54, 16, 77, 57, 24, 35, 46, 8, 99, 66, 13, 53, 81, 89, 66, 35, 7, 83, 96, 49, 66, 1, 100, 37, 1, 65, 87, 98, 94, 44, 91, 99, 11, 67, 55, 34, 53, 52, 93, 51, 70, 57, 55, 2, 98, 21, 36, 4, 55, 32, 52, 72, 84, 4, 61, 85, 68, 47, 82, 62, 90, 24, 60, 100, 42, 67, 86, 94, 70, 30, 96, 39, 87, 51, 40, 84, 71, 76, 87, 25, 59, 90, 96, 42, 93, 56, 26, 61, 54, 60, 74, 43, 35, 33, 95, 77, 51, 32, 70, 21, 13, 66, 59, 51, 68, 51, 34, 38, 78, 72, 14, 36, 14, 61, 29, 6, 69, 7, 18, 22, 66, 43, 17, 52, 28, 11, 28, 78, 94, 50, 98, 6, 15, 9, 9, 34, 11, 94, 23, 88, 66, 36, 75, 31, 96, 3, 88, 64, 61, 6, 38, 26, 100, 54, 78, 27, 16, 57, 5, 9, 6, 54, 66, 72, 14, 74, 5, 24, 20, 27, 11, 37, 14, 37, 67, 10, 40, 54, 25, 100, 11, 62, 78, 11, 15, 7, 37, 30, 15, 41, 90, 21, 47, 8, 92, 60, 33, 49, 84, 52, 75, 46, 88, 89, 83, 54, 50, 74, 60, 26, 25, 70, 88, 54, 80, 54, 60, 69, 36, 27, 61, 77, 47, 7, 84, 90, 67, 69, 38, 2, 72, 65, 47, 60, 5, 29, 65, 6, 2, 76, 31, 27, 46, 18, 80, 77, 24, 92, 45, 59, 70, 58, 87, 16, 64, 71, 57, 82, 91, 47, 83, 62, 11, 82, 73, 67, 10, 38, 72, 64, 65, 2, 42, 10, 72, 73, 39, 47, 16, 35, 5, 85, 92, 91, 52, 56, 13, 9, 89, 55, 55, 72, 17, 17, 5, 89, 83, 14, 78, 54, 29, 43, 7, 70, 4, 30, 95, 42, 76, 10, 77, 32, 95, 20, 75, 98, 75, 39, 6, 64, 94, 12, 87, 10, 28, 91, 50, 62, 56, 80, 67, 85, 74, 26, 6, 29, 55, 100, 23, 31, 62, 51, 62, 8, 70, 36, 5, 97, 75, 11, 12, 20, 74, 50, 81, 54, 40, 30, 15, 47, 61, 82, 83, 86, 7, 41, 67, 13, 40, 89, 43, 1, 39, 57, 60, 60, 92, 65, 56, 18, 27, 19, 37, 100, 68, 17, 53, 59, 99, 20, 6, 11, 53, 40, 49, 11, 80, 15, 23, 20, 3, 66, 72, 93, 22, 32, 4, 65, 48, 60, 35, 74, 78, 23, 73, 98, 92, 78, 56, 42, 97, 61, 4, 49, 53, 52, 59, 32, 66, 33, 3, 20, 98, 27, 64, 71, 10, 68, 88, 57, 79, 74, 30, 56, 96, 54, 5, 39, 83, 61, 80, 31, 73, 36, 31, 25, 87, 89, 57, 5, 22, 59, 24, 71, 37, 40, 94, 46, 7, 81, 2, 85, 6, 83, 92, 1, 89, 97, 92, 71, 57, 23, 2, 29, 58, 32, 6, 45, 73, 62, 1, 46, 72, 24, 68, 9, 15, 61, 6, 21, 93, 8, 5, 98, 42, 49, 51, 30, 45, 42, 53, 53, 64, 6, 33, 74, 37, 38, 18, 61, 51, 18, 58, 23, 93, 26, 83, 8, 86, 88, 80, 31, 47, 37, 28, 89, 85, 30, 70, 81, 71, 22, 33, 87, 27, 65, 60, 16, 3, 29, 28, 53, 98, 86, 27, 42, 63, 9, 49, 48, 49, 81, 30, 95, 17, 58, 35, 1, 39, 57, 81, 62, 30, 65, 48, 9, 29, 59, 24, 31, 39, 3, 36, 36, 40, 62, 77, 2, 23, 78, 2, 71, 58, 31, 17, 74, 40, 4, 26, 79, 60, 58, 40, 41, 22, 39, 49, 2, 97, 24, 85, 35, 27, 20, 22, 66, 33, 98, 68, 55, 75, 69, 77, 84, 51, 46, 9, 91, 49, 86, 69, 60, 43, 60, 100, 16, 98, 49, 70, 46, 24, 54, 32, 50, 25, 53, 68, 57, 50, 87, 64, 77, 7, 40, 60, 57, 85, 21, 47, 85, 6, 67, 96, 1, 26, 48, 68, 75, 48, 37, 20, 71, 42, 51, 21, 66, 3, 40, 23, 5, 26, 38, 81, 32, 77, 92, 88, 14, 12, 87, 50, 18, 5, 46, 18, 31, 45, 37, 57, 92, 74, 77, 62, 15, 27, 34, 81, 82, 25, 55, 86, 50, 92, 18, 33, 20, 61, 73, 85, 73, 59, 35, 42, 15, 32, 11, 97, 76, 47, 54, 67, 72, 30, 80, 87, 8, 66, 19, 89, 90, 25, 26, 40, 68, 43, 24, 87, 56, 96, 72, 28, 6, 6, 21, 21, 89, 31, 17, 64, 29, 70, 82, 1, 99, 13, 39, 59, 78, 57, 47, 68, 33, 25, 59, 100, 19, 82, 86, 74, 30, 9, 1, 35, 66, 73, 55, 54, 3, 24, 17, 84, 93, 50, 84, 44, 63, 22, 2, 40, 30, 100, 59, 62, 24, 69, 61, 43, 3, 98, 16, 32, 7, 69, 66, 72, 41, 73, 26, 96, 96, 94, 79, 88, 96, 14, 83, 58, 35, 84, 49, 64, 84, 60, 77, 7, 28, 37, 1, 30, 34, 17, 61, 92, 85, 27, 64, 77, 51, 41, 72, 46, 34, 50, 85, 29, 63, 68, 38, 49, 3, 87, 64, 38, 46, 40, 97, 25, 28, 97, 55, 14, 13, 15, 5, 49, 93, 20, 26, 43, 60, 97, 40, 94, 99, 25, 74, 13, 44, 12, 62, 46, 50, 77, 84, 47, 69, 80, 71, 96, 28, 25, 61, 41, 92, 66, 41, 36, 85, 66, 79, 45, 63, 70, 90, 13, 94, 15, 25, 89, 26, 38, 35, 27, 15, 70, 73, 83, 1, 44, 30, 28, 68, 91, 20, 11, 8, 61, 47, 44, 26, 77, 40, 40, 46, 29, 52, 92, 96, 29, 80, 21, 66, 14, 48, 32, 35, 72, 14, 35, 15, 96, 15, 35, 86, 34, 45, 45, 94, 43, 88, 20, 19, 28, 11, 65, 8, 63, 8, 3, 43, 87, 76, 8, 53, 75, 40, 87, 46, 5, 74, 13, 52, 88, 47, 37, 21, 43, 33, 67, 38, 21, 38, 56, 100, 48, 72, 7, 62, 79, 62, 4, 18, 37, 64, 70, 63, 3, 8, 8, 59, 33, 72, 11, 20, 70, 99, 93, 13, 32, 59, 2, 4, 48, 57, 3, 95, 81, 61, 9, 11, 74, 12, 28, 62, 75, 49, 24, 29, 9, 84, 40, 41, 55, 50, 13, 25, 100, 5, 89, 83, 15, 90, 86, 62, 98, 40, 8, 78, 53, 16, 89, 26, 80, 68, 88, 6, 17, 63, 87, 25, 46, 26, 17, 53, 27, 29, 77, 26, 33, 17, 9, 99, 6, 46, 12, 3, 86, 20, 33, 90, 87, 21, 15, 18, 40, 54, 24, 8, 69, 10, 32, 66, 87, 49, 18, 13, 29, 46, 38, 62, 62, 98, 12, 19, 44, 24, 22, 81, 95, 6, 70, 33, 78, 36, 51, 17, 42, 26, 25, 10, 87, 8, 75, 73, 8, 45, 85, 37, 90, 74, 50, 4, 72, 61, 22, 67, 36, 95, 99, 82, 100, 20, 15, 77, 7, 17, 94, 48, 94, 70, 9, 80, 77, 36, 52, 85, 32, 88, 73, 21, 61, 22, 24, 84, 34, 98, 2, 70, 92, 100, 51, 92, 19, 17, 68, 26, 85, 13, 25, 78, 82, 86, 57, 59, 21, 60, 95, 52, 47, 67, 24, 60, 40, 100, 95, 73, 97, 97, 94, 40, 48, 97, 31, 67, 13, 51, 44, 98, 15, 20, 27, 97, 5, 84, 7, 77, 95, 53, 80, 94, 71, 56, 5, 10, 7, 99, 82, 3, 95, 28, 94, 43, 24, 25, 61, 36, 27, 56, 85, 41, 27, 12, 89, 84, 47, 47, 12, 41, 99, 92, 86, 69, 99, 90, 78, 5, 89, 12, 59, 35, 39, 52, 29, 62, 28, 89, 49, 54, 96, 86, 47, 75, 97, 87, 58, 43, 34, 69, 35, 32, 12, 21, 53, 10, 10, 30, 66, 50, 93, 24, 85, 83, 28, 13, 96, 55, 54, 45, 61, 1, 82, 59, 75, 78, 45, 32, 72, 78, 1, 58, 62, 64, 78, 14, 74, 40, 95, 91, 89, 40, 15, 25, 22, 42, 38, 18, 48, 43, 14, 8, 43, 95, 18, 18, 24, 63, 1, 47, 92, 53, 4, 53, 17, 34, 66, 42, 73, 13, 32, 13, 52, 98, 38, 25, 91, 75, 94, 39, 69, 7, 98, 11, 53, 16, 80, 28, 30, 81, 74, 21, 85, 78, 74, 1, 11, 91, 94, 35, 55, 26, 47, 6, 23, 84, 31, 14, 10, 76, 4, 78, 83, 1, 41, 87, 68, 20, 15, 97, 52, 40, 18, 37, 17, 43, 89, 79, 85, 83, 13, 40, 8, 60, 97, 82, 95, 79, 47, 5, 55, 2, 34, 89, 3, 74, 75, 22, 46, 41, 19, 97, 81, 88, 33, 49, 30, 74, 80, 66, 56, 92, 5, 15, 3, 54, 48, 50, 32, 47, 6, 86, 48, 39, 26, 50, 65, 53, 24, 10, 93, 42, 6, 25, 81, 91, 26, 62, 64, 5, 27, 71, 48, 84, 85, 3, 37, 84, 52, 20, 30, 57, 58, 78, 47, 83, 79, 11, 35, 2, 20, 28, 95, 26, 4, 75, 68, 29, 36, 83, 85, 15, 53, 85, 98, 89, 87, 86, 24, 90, 5, 54, 46, 62, 83, 44, 45, 61, 55, 79, 15, 26, 58, 61, 3, 14, 36, 70, 94, 23, 52, 79, 37, 56, 15, 86, 96, 1, 71, 20, 90, 76, 73, 87, 89, 55, 30, 33, 67, 36, 64, 33, 62, 73, 94, 64, 38, 81, 34, 32, 55, 37, 62, 44, 45, 76, 29, 40, 76, 52, 59, 17, 79, 83, 3, 67, 37, 84, 52, 56, 20, 67, 40, 81, 91, 85, 44, 29, 17, 77, 12, 72, 66, 25, 67, 10, 100, 95, 49, 27, 98, 8, 43, 28, 90, 97, 47, 79, 80, 50, 86, 99, 68, 77, 79, 58, 62, 23, 38, 78, 51, 49, 1, 68, 73, 67, 77, 24, 14, 78, 50, 11, 37, 44, 91, 78, 92, 37, 8, 24, 86, 93, 22, 53, 22, 53, 62, 83, 27, 100, 12, 29, 100, 13, 97, 25, 31, 73, 48, 44, 2, 50, 7, 38, 45, 97, 16, 37, 33, 23, 60, 70, 68, 33, 74, 89, 85, 35, 23, 63, 34, 34, 92, 86, 98, 88, 10, 29, 12, 57, 72, 66, 6, 78, 3, 51, 26, 18, 39, 58, 41, 50, 79, 60, 34, 52, 48, 19, 87, 70, 33, 72, 3, 24, 57, 53, 63, 66, 81, 27, 23, 52, 92, 80, 82, 94, 82, 7, 64, 72, 17, 56, 21, 47, 15, 55, 99, 62, 25, 37, 83, 9, 8, 37, 85, 17, 89, 47, 82, 21, 25, 56, 25, 68, 88, 6, 14, 69, 64, 77, 93, 32, 84, 65, 79, 98, 19, 29, 11, 95, 65, 45, 4, 72, 81, 88, 88, 22, 86, 22, 42, 63, 29, 66, 30, 16, 23, 95, 37, 87, 71, 29, 70, 6, 93, 48, 3, 64, 28, 65, 10, 92, 61, 65, 16, 42, 52, 55, 63, 90, 76, 56, 4, 5, 22, 33, 72, 44, 28, 8, 82, 50, 36, 52, 56, 81, 51, 10, 96, 79, 27, 5, 22, 87, 70, 37, 80, 73, 44, 94, 62, 19, 50, 17, 75, 71, 50, 99, 66, 29, 6, 48, 30, 94, 99, 37, 74, 1, 99, 69, 79, 77, 25, 53, 15, 94, 89, 95, 67, 32, 88, 80, 3, 89, 97, 29, 11, 98, 27, 77, 78, 85, 76, 59, 78, 26, 48, 3, 26, 46, 23, 57, 74, 47, 9, 88, 93, 49, 34, 59, 33, 22, 90, 35, 62, 38, 15, 73, 87, 42, 1, 64, 26, 76, 75, 55, 1, 22, 57, 78, 19, 31, 34, 92, 77, 94, 79, 69, 43, 65, 79, 75, 86, 21, 61, 99, 58, 75, 23, 45, 68, 23, 60, 45, 98, 34, 99, 50, 7, 7, 28, 25, 37, 13, 16, 66, 59, 47, 86, 1, 11, 17, 27, 48, 37, 87, 98, 94, 13, 21, 90, 81, 43, 50, 77, 93, 35, 28, 94, 42, 86, 73, 18, 23, 86, 86, 40, 96, 32, 25, 96, 94, 41, 22, 93, 29, 60, 90, 23, 72, 62, 64, 4, 5, 65, 81, 49, 100, 60, 42, 93, 45, 15, 10, 19, 52, 95, 10, 47, 78, 35, 94, 23, 27, 67, 15, 8, 26, 57, 82, 49, 18, 45, 53, 74, 10, 85, 74, 61, 96, 16, 53, 40, 82, 62, 59, 85, 9, 68, 83, 86, 54, 28, 9, 33, 94, 75, 40, 71, 83, 21, 19, 53, 17, 23, 78, 26, 7, 52, 86, 2, 19, 90, 94, 52, 52, 4, 36, 12, 23, 70, 97, 29, 49, 57, 13, 42, 84, 52, 12, 66, 24, 82, 18, 92, 5, 96, 18, 63, 47, 55, 17, 17, 45, 10, 68, 48, 65, 55, 59, 87, 24, 7, 15, 72, 16, 27, 65, 99, 30, 28, 64, 5, 9, 34, 97, 65, 81, 66, 80, 27, 72, 96, 95, 16, 57, 62, 15, 73, 16, 25, 59, 91, 84, 26, 62, 99, 4, 78, 49, 86, 5, 12, 42, 65, 97, 90, 82, 77, 55, 61, 55, 79, 8, 49, 46, 16, 10, 61, 88, 25, 37, 98, 15, 20, 23, 28, 70, 79, 5, 18, 16, 61, 82, 57, 78, 30, 47, 59, 7, 53, 71, 61, 31, 78, 10, 77, 93, 71, 89, 32, 48, 25, 29, 62, 97, 4, 42, 66, 82, 98, 36, 49, 59, 69, 5, 36, 98, 3, 46, 4, 56, 16, 17, 38, 93, 78, 14, 37, 100, 54, 68, 47, 79, 48, 61, 27, 51, 2, 44, 84, 99, 79, 32, 9, 99, 37, 96, 97, 91, 93, 52, 46, 8, 20, 36, 52, 97, 1, 40, 97, 55, 59, 43, 85, 7, 55, 11, 57, 56, 54, 93, 7, 85, 24, 67, 83, 12, 15, 31, 3, 7, 83, 100, 15, 54, 35, 18, 51, 36, 58, 99, 42, 16, 93, 26, 22, 48, 88, 31, 3, 41, 23, 61, 77, 46, 28, 12, 10, 94, 42, 12, 100, 76, 11, 14, 82, 98, 84, 32, 33, 41, 82, 74, 8, 74, 51, 82, 21, 38, 12, 76, 30, 86, 88, 59, 83, 67, 70, 92, 60, 63, 3, 60, 91, 66, 25, 72, 63, 8, 55, 47, 100, 36, 20, 8, 9, 22, 89, 82, 59, 100, 9, 40, 37, 96, 98, 19, 63, 67, 11, 74, 82, 65, 33, 24, 30, 10, 95, 44, 17, 1, 90, 17, 36, 61, 76, 96, 82, 64, 29, 92, 15, 37, 32, 51, 85, 29, 69, 99, 48, 31, 72, 81, 96, 57, 4, 77, 66, 50, 21, 34, 50, 10, 50, 85, 23, 77, 32, 4, 40, 61, 48, 6, 49, 79, 56, 33, 59, 77, 83, 58, 59, 55, 38, 54, 63, 41, 83, 28, 90, 55, 61, 39, 16, 63, 75, 38, 39, 59, 94, 31, 71, 41, 36, 19, 71, 44, 4, 29, 72, 86, 87, 30, 92, 24, 36, 54, 17, 18, 33, 6, 72, 94, 97, 87, 8, 23, 77, 46, 81, 70, 76, 51, 10, 64, 22, 80, 7, 25, 60, 78, 62, 46, 59, 6, 22, 94, 11, 38, 63, 44, 95, 34, 89, 43, 73, 96, 66, 49, 41, 46, 70, 69, 49, 79, 84, 70, 10, 42, 94, 21, 71, 7, 19, 29, 12, 40, 23, 23, 29, 85, 66, 75, 71, 54, 18, 95, 1, 83, 95, 93, 80, 64, 13, 28, 94, 96, 97, 55, 37, 42, 75, 7, 49, 93, 88, 60, 84, 10, 34, 12, 46, 51, 87, 68, 56, 56, 62, 56, 38, 56, 49, 17, 71, 61, 45, 64, 57, 93, 18, 45, 35, 45, 4, 83, 37, 91, 94, 73, 52, 80, 84, 97, 30, 22, 17, 38, 77, 30, 93, 66, 38, 41, 35, 8, 54, 31, 24, 62, 23, 93, 6, 57, 37, 9, 91, 26, 51, 37, 98, 2, 68, 33, 51, 49, 7, 67, 86, 35, 96, 79, 1, 33, 71, 35, 93, 24, 65, 16, 85, 39, 8, 43, 48, 97, 3, 90, 22, 54, 78, 19, 55, 45, 51, 57, 94, 57, 23, 31, 92, 71, 61, 44, 55, 32, 30, 99, 7, 46, 14, 44, 84, 74, 86, 31, 70, 88, 21, 91, 93, 50, 61, 48, 95, 11, 56, 40, 20, 31, 70, 63, 1, 31, 58, 7, 14, 87, 6, 20, 32, 71, 63, 67, 44, 100, 98, 13, 88, 70, 55, 80, 19, 15, 79, 65, 26, 87, 4, 97, 17, 26, 11, 69, 8, 68, 75, 21, 6, 32, 92, 37, 3, 7, 55, 98, 6, 4, 11, 45, 73, 65, 77, 44, 80, 7, 8, 57, 93, 64, 5, 9, 41, 15, 29, 48, 34, 56, 20, 39, 87, 11, 27, 41, 69, 81, 39, 75, 85, 1, 71, 9, 17, 99, 4, 48, 6, 12, 4, 50, 27, 60, 11, 67, 26, 39, 66, 59, 94, 85, 49, 33, 47, 75, 25, 16, 8, 63, 42, 44, 15, 64, 4, 32, 63, 8, 79, 20, 71, 35, 21, 97, 94, 31, 15, 72, 22, 80, 30, 67, 16, 79, 51, 62, 5, 76, 77, 64, 90, 70, 7, 5, 34, 11, 88, 48, 18, 18, 67, 40, 52, 39, 36, 98, 70, 2, 69, 43, 81, 50, 61, 96, 80, 12, 9, 85, 39, 38, 100, 28, 7, 59, 84, 92, 69, 71, 91, 38, 89, 57, 77, 92, 48, 64, 89, 69, 65, 9, 11, 97, 59, 23, 44, 90, 34, 4, 74, 72, 41, 26, 52, 100, 84, 35, 43, 4, 6, 34, 93, 46, 42, 21, 37, 89, 84, 78, 57, 100, 86, 19, 48, 96, 42, 91, 86, 75, 94, 11, 99, 87, 36, 2, 86, 19, 36, 28, 22, 93, 13, 14, 90, 55, 34, 27, 43, 69, 4, 100, 20, 41, 18, 67, 89, 11, 57, 74, 86, 3, 36, 36, 89, 72, 89, 26, 42, 76, 5, 16, 69, 18, 81, 10, 72, 67, 36, 66, 87, 91, 65, 7, 32, 35, 73, 72, 45, 82, 45, 82, 84, 32, 69, 24, 3, 9, 1, 97, 85, 5, 64, 5, 22, 44, 14, 45, 10, 2, 11, 97, 92, 27, 3, 75, 13, 27, 46, 10, 8, 42, 43, 43, 74, 64, 18, 28, 72, 18, 24, 56, 23, 87, 60, 96, 83, 74, 93, 92, 75, 3, 40, 18, 81, 94, 93, 46, 73, 90, 55, 32, 32, 49, 75, 5, 12, 44, 32, 84, 62, 8, 39, 36, 46, 51, 31, 28, 76, 75, 72, 2, 29, 63, 19, 10, 9, 63, 7, 81, 53, 61, 12, 84, 9, 38, 40, 73, 82, 23, 56, 43, 30, 46, 30, 28, 48, 60, 7, 23, 87, 30, 24, 15, 93, 95, 24, 53, 57, 30, 33, 9, 42, 96, 44, 3, 34, 83, 75, 15, 6, 82, 9, 87, 79, 38, 14, 27, 49, 21, 1, 35, 50, 77, 50, 94, 71, 25, 46, 27, 7, 30, 36, 100, 26, 79, 2, 59, 14, 28, 25, 19, 61, 85, 5, 92, 74, 19, 70, 74, 91, 70, 61, 92, 46, 10, 38, 16, 86, 83, 95, 92, 13, 82, 44, 90, 12, 45, 100, 25, 25, 76, 43, 85, 60, 48, 28, 85, 18, 97, 58, 60, 67, 18, 51, 64, 79, 88, 32, 17, 23, 26, 60, 87, 7, 3, 76, 18, 48, 75, 43, 24, 50, 37, 60, 61, 36, 88, 45, 53, 84, 54, 64, 2, 72, 67, 66, 2, 6, 97, 18, 28, 74, 78, 66, 80, 80, 41, 49, 79, 67, 43, 2, 68, 80, 62, 28, 15, 49, 24, 20, 84, 30, 83, 86, 1, 49, 51, 54, 55, 99, 72, 34, 72, 1, 100, 51, 80, 92, 51, 59, 59, 94, 12, 26, 73, 73, 6, 87, 73, 81, 6, 57, 10, 89, 42, 62, 89, 44, 68, 43, 42, 39, 29, 13, 39, 28, 15, 70, 19, 65, 80, 77, 58, 92, 55, 82, 16, 12, 69, 89, 44, 26, 97, 6, 66, 90, 19, 55, 33, 86, 49, 26, 24, 77, 90, 14, 56, 56, 84, 75, 20, 63, 3, 30, 54, 9, 11, 22, 72, 31, 10, 16, 57, 58, 73, 74, 47, 91, 28, 31, 77, 29, 8, 100, 57, 97, 66, 13, 52, 1, 39, 23, 63, 93, 4, 69, 2, 15, 90, 25, 97, 51, 92, 5, 60, 64, 79, 58, 55, 58, 88, 83, 86, 47, 34, 95, 95, 99, 7, 98, 99, 97, 20, 14, 89, 24, 34, 42, 90, 75, 67, 86, 25, 10, 91, 36, 74, 21, 93, 80, 78, 32, 62, 16, 78, 95, 10, 72, 46, 68, 69, 44, 64, 40, 9, 4, 15, 42, 98, 56, 16, 16, 42, 92, 25, 84, 27, 50, 56, 19, 29, 33, 50, 42, 48, 79, 89, 9, 2, 34, 76, 22, 29, 91, 62, 38, 47, 28, 79, 44, 84, 47, 59, 77, 38, 35, 12, 65, 85, 67, 35, 65, 99, 85, 59, 99, 15, 47, 7, 17, 32, 35, 38, 60, 25, 51, 97, 23, 31, 28, 66, 14, 74, 76, 90, 11, 63, 1, 27, 99, 67, 62, 63, 17, 98, 73, 15, 12, 71, 22, 80, 2, 56, 70, 62, 32, 20, 10, 55, 50, 89, 72, 15, 62, 48, 4, 25, 10, 56, 51, 8, 74, 64, 22, 91, 13, 47, 5, 77, 17, 78, 56, 19, 33, 25, 32, 17, 97, 93, 71, 98, 82, 42, 13, 95, 41, 68, 19, 2, 76, 22, 61, 49, 37, 83, 39, 50, 81, 44, 26, 97, 21, 33, 67, 6, 10, 50, 22, 58, 43, 44, 55, 76, 37, 19, 70, 30, 39, 41, 31, 14, 14, 92, 62, 50, 26, 1, 51, 6, 96, 28, 54, 68, 13, 21, 25, 22, 70, 98, 79, 64, 41, 85, 39, 30, 56, 61, 59, 94, 1, 41, 59, 66, 32, 20, 67, 9, 72, 70, 66, 19, 97, 20, 39, 61, 40, 63, 34, 61, 61, 12, 25, 53, 49, 63, 82, 4, 75, 40, 49, 27, 81, 7, 92, 64, 78, 59, 25, 2, 80, 90, 72, 28, 9, 10, 89, 48, 73, 22, 9, 33, 86, 85, 85, 34, 47, 19, 89, 74, 10, 89, 100, 42, 47, 92, 6, 76, 2, 82, 29, 81, 71, 1, 8, 80, 62, 48, 79, 34, 70, 39, 18, 55, 23, 55, 40, 22, 25, 80, 95, 34, 20, 46, 76, 66, 37, 33, 93, 90, 14, 22, 22, 84, 74, 82, 15, 35, 29, 46, 69, 98, 36, 38, 4, 59, 44, 95, 32, 68, 26, 78, 2, 45, 23, 77, 62, 12, 61, 7, 53, 74, 28, 75, 9, 1, 56, 76, 35, 84, 21, 55, 34, 56, 45, 89, 66, 88, 36, 49, 8, 61, 78, 9, 58, 53, 37, 71, 64, 97, 77, 16, 22, 56, 42, 82, 56, 97, 57, 43, 33, 77, 49, 18, 85, 93, 58, 2, 81, 93, 51, 40, 6, 80, 48, 15, 32, 36, 37, 47, 84, 14, 63, 5, 21, 56, 38, 29, 53, 95, 71, 37, 23, 19, 6, 59, 12, 63, 61, 44, 56, 63, 83, 13, 42, 82, 27, 74, 17, 15, 20, 100, 80, 34, 56, 1, 90, 93, 29, 94, 39, 99, 82, 62, 69, 87, 20, 32, 49, 80, 27, 56, 94, 9, 20, 36, 42, 98, 61, 10, 13, 32, 61, 92, 18, 16, 44, 7, 61, 72, 52, 99, 22, 85, 12, 91, 71, 32, 74, 71, 63, 1, 79, 9, 61, 98, 44, 3, 96, 56, 12, 8, 87, 73, 51, 4, 40, 95, 62, 52, 66, 65, 3, 40, 49, 14, 82, 71, 97, 55, 94, 12, 55, 72, 20, 16, 21, 15, 70, 16, 22, 33, 75, 60, 57, 26, 64, 49, 72, 77, 100, 37, 94, 54, 28, 94, 20, 9, 17, 68, 16, 10, 79, 70, 33, 50, 37, 53, 16, 58, 69, 89, 91, 95, 49, 47, 20, 64, 95, 91, 92, 47, 80, 85, 52, 59, 31, 71, 68, 47, 39, 83, 8, 69, 4, 40, 71, 41, 44, 38, 50, 12, 27, 40, 59, 75, 39, 78, 38, 33, 21, 29, 31, 52, 66, 83, 10, 96, 53, 29, 94, 43, 63, 1, 12, 67, 92, 34, 59, 35, 71, 8, 99, 97, 48, 57, 71, 86, 86, 60, 70, 6, 41, 53, 9, 58, 35, 19, 53, 39, 99, 46, 34, 62, 98, 45, 28, 89, 78, 38, 23, 48, 45, 21, 97, 44, 77, 19, 81, 63, 31, 3, 20, 71, 55, 29, 28, 41, 99, 32, 31, 49, 29, 64, 10, 78, 60, 89, 66, 89, 26, 40, 89, 23, 13, 85, 18, 89, 3, 51, 3, 33, 53, 75, 55, 59, 55, 34, 51, 5, 17, 33, 53, 45, 97, 63, 22, 56, 51, 39, 97, 29, 79, 85, 51, 43, 69, 20, 83, 23, 70, 86, 8, 74, 12, 14, 84, 66, 48, 34, 22, 64, 67, 74, 61, 15, 36, 34, 22, 39, 25, 18, 67, 55, 2, 69, 97, 22, 40, 79, 97, 10, 16, 4, 35, 27, 17, 19, 44, 16, 4, 65, 32, 22, 39, 92, 36, 26, 77, 10, 16, 1, 27, 82, 55, 81, 2, 3, 54, 94, 82, 50, 3, 97, 5, 89, 76, 74, 7, 71, 89, 63, 36, 20, 84, 26, 63, 72, 51, 40, 81, 19, 92, 59, 100, 99, 91, 54, 1, 45, 47, 82, 46, 1, 31, 51, 41, 6, 24, 100, 76, 12, 62, 63, 84, 97, 88, 98, 68, 91, 89, 100, 9, 81, 11, 60, 79, 1, 65, 31, 97, 63, 13, 43, 15, 95, 93, 56, 100, 68, 55, 27, 79, 16, 90, 14, 64, 29, 12, 32, 71, 100, 83, 31, 32, 93, 43, 10, 46, 7, 93, 42, 22, 57, 36, 36, 51, 28, 43, 2, 95, 97, 28, 26, 64, 69, 91, 28, 50, 2, 11, 72, 2, 45, 3, 33, 38, 45, 95, 35, 3, 39, 28, 24, 95, 64, 12, 45, 91, 54, 46, 38, 3, 25, 15, 66, 94, 5, 93, 95, 7, 55, 66, 60, 100, 68, 44, 89, 64, 90, 23, 67, 28, 50, 42, 22, 13, 5, 66, 56, 59, 63, 45, 61, 88, 59, 78, 81, 63, 23, 27, 21, 77, 92, 32, 76, 12, 76, 16, 75, 17, 38, 93, 45, 40, 87, 18, 4, 91, 36, 59, 1, 98, 55, 13, 85, 13, 91, 17, 28, 13, 43, 48, 41, 87, 80, 69, 98, 7, 84, 24, 23, 74, 69, 19, 13, 55, 37, 68, 97, 24, 79, 98, 21, 33, 62, 6, 46, 52, 74, 25, 16, 17, 72, 57, 55, 3, 77, 52, 61, 60, 27, 84, 85, 95, 54, 49, 1, 42, 17, 98, 65, 95, 47, 86, 27, 8, 43, 24, 12, 16, 48, 27, 84, 72, 35, 38, 26, 11, 41, 87, 23, 68, 22, 7, 62, 75, 56, 63, 69, 72, 12, 33, 66, 58, 70, 44, 65, 12, 68, 28, 80, 67, 55, 63, 90, 41, 1, 16, 52, 93, 2, 74, 60, 23, 32, 22, 49, 87, 36, 69, 58, 47, 54, 75, 56, 23, 19, 72, 87, 38, 100, 18, 56, 6, 80, 46, 46, 32, 61, 49, 25, 14, 22, 36, 88, 54, 9, 88, 92, 44, 57, 50, 42, 10, 76, 49, 84, 46, 21, 70, 35, 20, 39, 91, 25, 19, 88, 22, 2, 100, 71, 78, 13, 44, 14, 100, 97, 22, 39, 41, 18, 95, 42, 11, 56, 17, 60, 40, 63, 80, 61, 49, 51, 100, 91, 27, 70, 78, 48, 23, 77, 18, 53, 41, 62, 66, 92, 10, 39, 31, 50, 8, 77, 91, 71, 33, 60, 30, 72, 74, 61, 84, 22, 63, 83, 13, 89, 4, 90, 88, 27, 19, 6, 31, 59, 19, 96, 3, 28, 86, 33, 30, 46, 9, 72, 16, 41, 31, 97, 64, 4, 9, 48, 78, 71, 82, 90, 11, 38, 31, 98, 16, 1, 55, 46, 12, 73, 93, 14, 1, 30, 46, 82, 75, 6, 53, 42, 99, 84, 38, 62, 39, 46, 61, 16, 68, 95, 57, 78, 32, 40, 28, 47, 40, 82, 44, 51, 7, 36, 64, 7, 65, 61, 40, 92, 67, 92, 33, 65, 27, 23, 78, 18, 20, 91, 33, 40, 85, 42, 69, 68, 81, 96, 66, 20, 30, 9, 23, 36, 44, 38, 94, 60, 99, 33, 3, 17, 76, 36, 33, 3, 10, 10, 20, 29, 52, 4, 68, 36, 45, 37, 3, 77, 84, 20, 49, 13, 28, 71, 48, 23, 8, 41, 35, 58, 25, 37, 74, 1, 24, 58, 55, 33, 20, 74, 14, 71, 29, 33, 59, 26, 69, 13, 2, 5, 33, 50, 17, 60, 72, 17, 83, 80, 9, 69, 89, 34, 5, 15, 86, 29, 72, 40, 13, 91, 65, 26, 62, 93, 11, 72, 18, 31, 84, 72, 35, 16, 73, 4, 76, 45, 20, 10, 76, 80, 78, 64, 13, 34, 78, 50, 14, 50, 89, 27, 92, 53, 4, 5, 98, 14, 76, 67, 45, 60, 90, 79, 75, 63, 82, 2, 7, 53, 63, 82, 33, 92, 45, 97, 26, 23, 99, 39, 24, 87, 17, 15, 92, 21, 20, 41, 86, 47, 7, 30, 6, 97, 61, 33, 11, 94, 86, 17, 99, 49, 50, 83, 92, 94, 31, 17, 68, 29, 8, 43, 16, 76, 10, 59, 48, 29, 99, 34, 27, 57, 15, 33, 5, 27, 17, 15, 73, 2, 83, 71, 50, 32, 53, 42, 78, 83, 10, 97, 12, 69, 40, 79, 45, 49, 89, 44, 29, 87, 29, 55, 95, 44, 39, 100, 22, 55, 66, 94, 57, 49, 64, 6, 32, 16, 99, 9, 51, 61, 6, 14, 81, 97, 44, 77, 45, 32, 21, 25, 70, 49, 79, 64, 44, 18, 15, 66, 72, 33, 59, 28, 33, 23, 86, 16, 90, 36, 25, 92, 48, 82, 5, 29, 30, 100, 5, 26, 31, 77, 50, 52, 26, 80, 68, 21, 97, 34, 86, 21, 66, 45, 100, 50, 19, 37, 66, 60, 25, 42, 52, 72, 75, 8, 100, 4, 8, 57, 29, 38, 33, 78, 90, 10, 9, 57, 31, 6, 90, 68, 78, 8, 64, 29, 57, 82, 66, 74, 42, 90, 15, 93, 61, 89, 100, 13, 92, 59, 21, 72, 97, 5, 1, 38, 15, 10, 46, 97, 67, 87, 16, 44, 46, 80, 72, 3, 13, 89, 28, 54, 78, 43, 98, 91, 83, 50, 3, 27, 8, 75, 98, 56, 79, 99, 45, 45, 60, 90, 41, 26, 29, 9, 21, 74, 88, 92, 28, 100, 33, 56, 6, 10, 50, 3, 52, 32, 4, 6, 58, 64, 80, 8, 19, 59, 58, 16, 3, 17, 5, 96, 42, 85, 4, 62, 59, 43, 5, 86, 94, 37, 93, 99, 99, 42, 54, 50, 74, 57, 56, 83, 20, 87, 90, 91, 45, 47, 6, 100, 63, 62, 95, 56, 47, 50, 17, 57, 92, 74, 42, 85, 62, 87, 36, 60, 28, 89, 62, 1, 97, 69, 84, 69, 55, 25, 11, 52, 72, 16, 51, 34, 29, 45, 42, 27, 46, 10, 83, 37, 83, 77, 73, 97, 63, 8, 8, 90, 48, 69, 43, 45, 89, 26, 13, 44, 50, 23, 95, 73, 90, 45, 59, 70, 41, 100, 97, 86, 9, 79, 74, 44, 55, 98, 40, 17, 6, 47, 7, 53, 68, 49, 49, 56, 26, 13, 99, 27, 87, 45, 100, 76, 41, 10, 46, 81, 9, 94, 18, 17, 72, 43, 12, 27, 41, 51, 95, 98, 50, 53, 50, 17, 53, 51, 72, 30, 63, 23, 57, 50, 67, 8, 77, 8, 17, 74, 40, 25, 67, 10, 93, 39, 52, 57, 17, 92, 7, 63, 89, 8, 16, 91, 24, 68, 93, 96, 50, 55, 70, 6, 56, 36, 65, 33, 95, 81, 58, 35, 57, 25, 96, 1, 15, 47, 9, 31, 91, 68, 93, 79, 75, 60, 21, 99, 80, 13, 46, 29, 20, 15, 86, 75, 2, 50, 59, 97, 82, 17, 83, 38, 41, 78, 90, 55, 76, 99, 37, 66, 66, 29, 97, 40, 41, 17, 90, 20, 82, 87, 48, 1, 1, 33, 27, 55, 82, 86, 51, 15, 2, 85, 4, 94, 14, 93, 48, 89, 43, 36, 55, 60, 64, 3, 52, 56, 19, 41, 75, 52, 80, 74, 52, 80, 6, 79, 86, 39, 16, 88, 5, 17, 72, 8, 10, 37, 1, 9, 26, 95, 44, 32, 55, 59, 34, 6, 15, 4, 98, 41, 56, 77, 15, 59, 9, 72, 89, 94, 63, 4, 34, 67, 72, 57, 75, 81, 94, 27, 41, 71, 21, 84, 2, 27, 95, 87, 32, 9, 42, 82, 1, 49, 10, 15, 8, 18, 39, 96, 64, 53, 52, 97, 19, 23, 53, 45, 56, 98, 71, 96, 68, 44, 32, 21, 70, 26, 7, 54, 86, 1, 35, 86, 49, 44, 53, 56, 14, 43, 4, 77, 95, 7, 25, 65, 29, 29, 10, 84, 27, 32, 32, 46, 75, 63, 67, 97, 40, 25, 50, 25, 25, 36, 62, 74, 79, 14, 81, 44, 8, 36, 72, 2, 42, 96, 19, 71, 77, 28, 6, 55, 11, 37, 100, 38, 51, 66, 34, 90, 43, 35, 66, 67, 70, 28, 92, 100, 93, 73, 96, 1, 60, 67, 54, 2, 63, 72, 24, 91, 51, 81, 45, 62, 70, 44, 99, 20, 62, 84, 62, 4, 70, 27, 70, 91, 54, 14, 42, 47, 86, 37, 99, 97, 4, 52, 98, 18, 24, 21, 8, 74, 54, 52, 87, 23, 47, 37, 42, 8, 20, 3, 11, 41, 82, 33, 31, 35, 46, 73, 33, 83, 9, 31, 79, 12, 83, 77, 29, 58, 49, 36, 83, 2, 39, 70, 24, 86, 6, 18, 93, 78, 72, 56, 18, 53, 88, 49, 40, 33, 21, 72, 67, 29, 55, 45, 93, 37, 73, 21, 46, 74, 9, 28, 27, 99, 97, 3, 84, 3, 20, 29, 80, 43, 84, 49, 48, 23, 97, 87, 7, 17, 10, 73, 98, 64, 69, 90, 52, 94, 62, 97, 67, 22, 25, 93, 21, 73, 95, 56, 27, 66, 36, 58, 9, 19, 7, 56, 93, 3, 94, 99, 72, 3, 23, 21, 19, 92, 62, 70, 85, 23, 67, 3, 97, 43, 95, 69, 67, 42, 24, 94, 7, 60, 3, 67, 30, 9, 74, 23, 64, 67, 73, 87, 22, 96, 7, 40, 39, 68, 9, 23, 42, 27, 77, 38, 21, 71, 6, 88, 64, 82, 33, 71, 93, 35, 89, 22, 44, 63, 96, 59, 81, 21, 45, 2, 68, 51, 93, 6, 70, 54, 80, 11, 80, 56, 49, 53, 26, 54, 40, 42, 35, 72, 64, 79, 6, 52, 1, 1, 66, 48, 11, 47, 20, 55, 100, 87, 57, 45, 92, 26, 98, 71, 37, 29, 26, 37, 81, 4, 90, 20, 45, 77, 43, 60, 55, 1, 11, 7, 53, 29, 7, 64, 27, 26, 70, 78, 13, 79, 22, 56, 56, 71, 27, 92, 100, 4, 28, 80, 7, 70, 52, 3, 98, 46, 62, 4, 98, 25, 63, 51, 53, 69, 66, 79, 46, 87, 56, 10, 65, 30, 66, 21, 100, 92, 64, 51, 95, 44, 83, 54, 65, 34, 8, 14, 31, 22, 17, 29, 98, 31, 31, 50, 51, 96, 80, 97, 34, 87, 6, 99, 16, 71, 71, 68, 14, 34, 18, 61, 29, 100, 66, 93, 85, 25, 6, 16, 46, 75, 96, 43, 5, 26, 44, 56, 73, 75, 4, 6, 62, 61, 56, 29, 32, 78, 96, 97, 12, 14, 9, 92, 65, 74, 37, 50, 99, 42, 17, 96, 68, 12, 39, 25, 89, 34, 32, 13, 9, 35, 70, 22, 95, 26, 50, 78, 3, 46, 27, 66, 11, 35, 10, 75, 9, 46, 24, 59, 39, 40, 54, 7, 3, 44, 83, 43, 78, 14, 55, 38, 48, 77, 59, 94, 54, 8, 24, 8, 5, 50, 74, 15, 84, 35, 90, 44, 80, 65, 2, 18, 57, 8, 76, 11, 51, 58, 54, 80, 71, 60, 17, 70, 36, 27, 16, 89, 35, 39, 97, 91, 40, 22, 6, 23, 56, 47, 19, 35, 63, 72, 52, 19, 79, 80, 30, 82, 37, 35, 61, 8, 94, 30, 29, 30, 56, 44, 70, 42, 34, 66, 33, 73, 39, 90, 48, 94, 88, 66, 28, 50, 89, 32, 69, 68, 63, 50, 49, 99, 84, 61, 58, 29, 42, 87, 10, 98, 82, 80, 91, 16, 97, 75, 88, 36, 16, 35, 29, 3, 52, 9, 53, 41, 92, 21, 8, 54, 22, 8, 4, 57, 20, 62, 85, 62, 100, 95, 11, 81, 26, 53, 96, 22, 28, 84, 9, 95, 70, 90, 98, 22, 50, 50, 62, 93, 22, 21, 46, 43, 80, 1, 51, 99, 62, 35, 60, 61, 81, 22, 94, 6, 75, 89, 80, 54, 24, 40, 48, 94, 29, 45, 15, 78, 46, 28, 70, 19, 100, 67, 13, 79, 68, 63, 77, 81, 98, 89, 94, 30, 62, 87, 36, 36, 27, 67, 41, 51, 6, 89, 96, 35, 85, 62, 64, 83, 89, 86, 1, 88, 52, 14, 18, 71, 28, 94, 52, 77, 34, 97, 7, 96, 35, 94, 83, 61, 60, 24, 63, 17, 64, 58, 3, 48, 19, 19, 82, 59, 4, 83, 98, 55, 48, 15, 78, 75, 61, 81, 52, 46, 77, 10, 41, 11, 3, 76, 23, 14, 99, 86, 82, 62, 43, 85, 61, 14, 55, 43, 24, 58, 77, 22, 64, 76, 88, 41, 50, 48, 21, 53, 94, 97, 14, 86, 59, 16, 61, 34, 81, 11, 19, 63, 24, 13, 99, 85, 78, 53, 79, 2, 62, 7, 23, 25, 82, 62, 66, 83, 10, 86, 36, 55, 35, 1, 92, 45, 17, 5, 78, 49, 15, 48, 63, 91, 61, 13, 27, 38, 65, 5, 91, 26, 11, 65, 3, 44, 27, 68, 26, 88, 53, 13, 42, 39, 14, 33, 84, 82, 89, 13, 30, 4, 61, 93, 94, 73, 5, 20, 62, 22, 76, 53, 99, 38, 17, 1, 81, 43, 20, 6, 30, 25, 19, 23, 63, 84, 8, 98, 65, 96, 11, 94, 51, 23, 38, 96, 95, 95, 15, 56, 68, 42, 60, 66, 31, 77, 19, 11, 71, 90, 69, 53, 14, 39, 27, 77, 22, 34, 26, 86, 82, 36, 31, 32, 10, 69, 28, 4, 63, 94, 12, 30, 88, 71, 47, 18, 99, 17, 29, 22, 7, 49, 26, 72, 39, 52, 48, 60, 38, 74, 97, 19, 61, 27, 2, 71, 95, 29, 26, 9, 75, 37, 90, 62, 60, 89, 79, 58, 57, 59, 31, 15, 59, 56, 87, 97, 60, 86, 56, 97, 11, 4, 67, 24, 31, 68, 94, 77, 49, 71, 38, 23, 8, 27, 36, 19, 67, 66, 76, 24, 25, 59, 90, 35, 14, 76, 32, 73, 14, 39, 21, 24, 43, 87, 47, 73, 7, 92, 1, 55, 15, 38, 77, 22, 65, 12, 40, 83, 29, 67, 58, 53, 77, 48, 40, 43, 75, 71, 67, 88, 9, 88, 64, 3, 26, 62, 27, 32, 6, 28, 86, 20, 65, 14, 93, 81, 77, 84, 64, 6, 2, 21, 10, 79, 68, 49, 21, 43, 19, 87, 82, 80, 26, 97, 82, 52, 11, 9, 83, 16, 36, 21, 35, 52, 34, 79, 33, 11, 62, 96, 16, 63, 16, 25, 93, 36, 74, 13, 30, 44, 52, 63, 23, 77, 60, 57, 28, 70, 17, 63, 85, 4, 83, 71, 55, 16, 1, 87, 78, 62, 34, 93, 76, 50, 70, 69, 37, 95, 33, 66, 38, 84, 28, 13, 61, 39, 21, 40, 8, 37, 2, 44, 40, 36, 66, 46, 4, 66, 85, 81, 79, 18, 26, 55, 19, 95, 23, 7, 89, 55, 72, 78, 91, 52, 90, 51, 90, 10, 42, 98, 46, 96, 93, 37, 31, 59, 35, 34, 76, 19, 67, 55, 88, 92, 9, 59, 38, 83, 65, 26, 89, 37, 3, 79, 40, 45, 81, 29, 54, 23, 78, 52, 18, 71, 40, 100, 81, 74, 86, 56, 44, 52, 62, 84, 95, 70, 42, 32, 4, 6, 9, 45, 94, 63, 23, 85, 7, 56, 14, 13, 78, 91, 64, 47, 13, 55, 98, 93, 29, 83, 1, 24, 86, 62, 7, 32, 84, 100, 15, 87, 58, 23, 31, 51, 86, 6, 36, 44, 61, 1, 56, 90, 43, 71, 36, 56, 26, 85, 48, 6, 68, 100, 29, 5, 62, 88, 37, 45, 87, 51, 83, 44, 26, 14, 47, 63, 71, 34, 58, 31, 34, 14, 72, 76, 36, 59, 83, 61, 43, 83, 18, 62, 82, 99, 67, 43, 86, 55, 87, 24, 57, 70, 68, 82, 35, 66, 96, 57, 99, 54, 87, 84, 19, 10, 11, 54, 68, 94, 67, 10, 76, 84, 72, 57, 34, 90, 52, 19, 44, 90, 95, 100, 11, 14, 34, 97, 79, 81, 53, 29, 34, 39, 64, 52, 100, 74, 58, 67, 67, 24, 77, 94, 59, 100, 3, 93, 89, 54, 63, 84, 95, 57, 35, 6, 70, 20, 2, 100, 1, 55, 28, 34, 45, 91, 38, 45, 17, 95, 11, 35, 18, 39, 29, 28, 90, 83, 20, 30, 88, 35, 13, 82, 91, 100, 87, 13, 19, 41, 64, 19, 47, 44, 5, 91, 34, 42, 87, 2, 36, 50, 37, 5, 88, 17, 32, 30, 51, 4, 59, 38, 38, 72, 19, 80, 71, 58, 44, 41, 50, 8, 12, 96, 51, 16, 86, 36, 9, 25, 38, 44, 74, 26, 100, 13, 94, 31, 42, 44, 86, 1, 81, 23, 72, 51, 55, 94, 60, 98, 86, 9, 5, 97, 4, 55, 64, 42, 91, 72, 66, 80, 15, 39, 5, 66, 51, 50, 97, 93, 93, 34, 45, 25, 57, 68, 75, 11, 61, 87, 60, 98, 95, 65, 95, 51, 71, 58, 92, 61, 82, 9, 92, 96, 99, 48, 14, 1, 97, 62, 45, 89, 95, 89, 13, 51, 56, 40, 13, 68, 26, 73, 66, 72, 89, 12, 74, 59, 21, 65, 72, 2, 25, 63, 50, 23, 11, 63, 76, 7, 24, 20, 48, 18, 9, 12, 21, 16, 51, 85, 84, 28, 57, 1, 52, 97, 64, 25, 56, 84, 42, 27, 86, 66, 41, 35, 41, 51, 49, 68, 10, 72, 87, 57, 41, 47, 68, 13, 63, 71, 98, 98, 50, 6, 50, 1, 3, 13, 26, 58, 96, 19, 36, 33, 36, 76, 19, 76, 79, 67, 43, 88, 90, 82, 96, 83, 28, 63, 95, 42, 85, 92, 91, 35, 50, 40, 35, 52, 52, 12, 61, 100, 30, 96, 32, 66, 23, 51, 93, 1, 69, 88, 88, 59, 69, 83, 93, 48, 98, 87, 42, 34, 31, 32, 68, 80, 72, 55, 31, 75, 18, 43, 74, 48, 38, 6, 65, 60, 8, 9, 13, 76, 96, 52, 86, 16, 87, 78, 16, 84, 17, 57, 69, 47, 88, 37, 78, 11, 43, 60, 86, 60, 2, 59, 59, 91, 16, 23, 2, 23, 32, 14, 51, 79, 66, 36, 47, 52, 66, 62, 87, 34, 70, 55, 32, 9, 43, 9, 20, 85, 68, 5, 45, 69, 15, 3, 11, 31, 78, 12, 53, 61, 26, 3, 39, 43, 91, 37, 94, 56, 50, 32, 41, 19, 86, 72, 80, 81, 80, 99, 65, 99, 55, 61, 19, 69, 64, 29, 51, 41, 40, 4, 1, 65, 58, 91, 7, 48, 80, 52, 55, 29, 83, 95, 100, 21, 66, 31, 1, 45, 29, 65, 95, 35, 26, 13, 55, 41, 41, 6, 33, 81, 9, 85, 97, 18, 27, 56, 66, 6, 7, 72, 87, 42, 67, 38, 62, 32, 68, 14, 29, 48, 30, 23, 82, 7, 36, 36, 47, 28, 41, 79, 8, 1, 15, 5, 71, 42, 12, 36, 47, 70, 7, 85, 11, 25, 22, 24, 9, 89, 89, 37, 36, 19, 11, 69, 25, 98, 57, 24, 26, 49, 2, 85, 50, 17, 41, 20, 10, 52, 7, 8, 22, 65, 93, 84, 90, 14, 8, 98, 55, 96, 86, 42, 66, 48, 63, 91, 98, 19, 14, 75, 67, 67, 59, 68, 35, 52, 39, 44, 3, 45, 52, 76, 62, 96, 60, 3, 61, 19, 100, 67, 66, 37, 9, 32, 36, 71, 22, 85, 89, 87, 59, 7, 5, 70, 75, 40, 21, 13, 35, 23, 58, 38, 51, 71, 33, 10, 73, 94, 28, 24, 60, 93, 12, 20, 24, 47, 42, 97, 84, 82, 35, 42, 89, 40, 63, 63, 31, 83, 75, 65, 58, 84, 3, 8, 54, 35, 17, 78, 80, 96, 1, 40, 88, 12, 11, 64, 11, 53, 12, 94, 34, 47, 87, 74, 38, 50, 36, 68, 84, 63, 32, 41, 98, 86, 100, 52, 21, 16, 81, 52, 63, 82, 43, 51, 45, 54, 66, 55, 58, 77, 100, 43, 75, 87, 17, 12, 88, 4, 31, 71, 66, 63, 64, 64, 48, 63, 67, 20, 31, 47, 72, 93, 80, 14, 95, 25, 19, 60, 31, 76, 89, 31, 19, 15, 69, 87, 79, 56, 90, 9, 78, 8, 23, 41, 71, 23, 4, 89, 42, 34, 87, 65, 26, 67, 31, 73, 91, 49, 32, 21, 77, 72, 3, 47, 87, 71, 33, 65, 78, 74, 25, 8, 81, 48, 48, 3, 70, 3, 91, 63, 88, 78, 80, 66, 44, 10, 38, 86, 10, 21, 58, 38, 93, 61, 84, 79, 83, 68, 95, 13, 42, 71, 20, 22, 18, 19, 25, 39, 74, 15, 54, 61, 44, 33, 26, 39, 94, 15, 24, 55, 36, 34, 45, 28, 94, 28, 58, 28, 48, 4, 40, 89, 74, 11, 62, 44, 30, 86, 34, 3, 53, 87, 15, 48, 71, 93, 87, 16, 7, 62, 23, 42, 47, 67, 21, 40, 46, 78, 20, 93, 81, 59, 33, 7, 70, 95, 50, 51, 32, 83, 53, 36, 22, 19, 84, 44, 11, 22, 60, 18, 35, 34, 59, 82, 100, 32, 73, 97, 9, 92, 42, 42, 3, 74, 100, 72, 20, 49, 74, 4, 83, 78, 39, 56, 96, 74, 100, 7, 95, 11, 24, 82, 96, 34, 63, 47, 65, 35, 43, 26, 79, 84, 19, 81, 10, 18, 4, 81, 18, 77, 84, 52, 54, 75, 8, 1, 48, 59, 7, 95, 21, 82, 76, 16, 16, 90, 62, 32, 76, 4, 9, 54, 40, 27, 34, 1, 96, 89, 81, 13, 17, 17, 17, 70, 91, 24, 23, 90, 34, 29, 84, 54, 11, 11, 69, 78, 100, 82, 61, 76, 37, 70, 81, 76, 48, 67, 28, 96, 55, 61, 60, 72, 77, 76, 93, 19, 51, 15, 8, 84, 96, 44, 37, 6, 6, 57, 35, 6, 38, 95, 33, 75, 16, 65, 2, 64, 31, 30, 59, 38, 42, 70, 9, 18, 46, 53, 36, 96, 68, 95, 80, 15, 38, 68, 72, 44, 77, 6, 1, 66, 52, 85, 92, 68, 49, 94, 83, 32, 75, 93, 69, 16, 62, 29, 85, 7, 81, 20, 55, 100, 66, 86, 14, 4, 53, 85, 99, 81, 42, 51, 47, 94, 35, 38, 61, 35, 83, 95, 18, 57, 87, 86, 24, 48, 14, 8, 7, 47, 79, 61, 46, 45, 98, 12, 100, 50, 48, 50, 83, 90, 100, 29, 83, 34, 66, 95, 20, 49, 41, 38, 57, 27, 75, 33, 26, 41, 92, 84, 87, 71, 96, 84, 67, 93, 47, 18, 95, 95, 67, 77, 84, 66, 5, 18, 51, 22, 64, 22, 70, 4, 59, 79, 82, 86, 11, 59, 26, 2, 43, 12, 24, 38, 95, 42, 83, 42, 59, 77, 88, 77, 5, 23, 94, 9, 92, 96, 30, 7, 18, 52, 10, 28, 82, 43, 13, 44, 1, 38, 45, 95, 1, 21, 85, 96, 14, 67, 89, 73, 95, 28, 1, 99, 50, 95, 7, 41, 90, 88, 47, 59, 91, 8, 87, 24, 2, 51, 67, 2, 41, 64, 49, 41, 36, 33, 88, 49, 99, 28, 73, 93, 55, 74, 43, 4, 20, 49, 96, 61, 88, 94, 20, 31, 1, 58, 54, 2, 60, 73, 56, 100, 36, 4, 41, 71, 88, 28, 19, 38, 56, 92, 82, 62, 17, 24, 66, 36, 24, 13, 96, 63, 7, 67, 93, 59, 24, 99, 13, 84, 71, 20, 83, 58, 75, 75, 80, 62, 3, 50, 99, 10, 93, 80, 71, 9, 55, 88, 96, 78, 1, 92, 40, 59, 58, 33, 17, 34, 83, 29, 69, 5, 100, 51, 62, 74, 78, 93, 35, 80, 42, 85, 41, 35, 16, 11, 95, 70, 99, 91, 47, 51, 34, 87, 9, 43, 71, 25, 28, 53, 6, 96, 57, 5, 99, 70, 31, 76, 62, 65, 55, 55, 2, 95, 41, 17, 57, 36, 87, 55, 78, 33, 57, 63, 71, 65, 5, 41, 42, 33, 45, 99, 80, 53, 55, 78, 74, 85, 53, 87, 2, 59, 42, 3, 5, 34, 71, 62, 69, 57, 68, 98, 42, 25, 60, 64, 41, 17, 57, 82, 1, 53, 80, 80, 6, 87, 58, 31, 71, 62, 18, 24, 21, 11, 26, 25, 44, 49, 86, 65, 5, 6, 62, 98, 30, 74, 62, 70, 42, 70, 4, 94, 22, 35, 73, 27, 21, 82, 10, 44, 96, 79, 67, 16, 89, 45, 40, 84, 93, 78, 48, 49, 35, 62, 99, 64, 87, 12, 85, 28, 81, 40, 21, 2, 75, 45, 81, 47, 79, 90, 90, 74, 68, 9, 89, 8, 53, 80, 91, 97, 9, 91, 45, 43, 52, 43, 58, 38, 6, 95, 17, 86, 34, 89, 40, 8, 33, 20, 55, 11, 61, 96, 36, 80, 4, 24, 87, 8, 56, 29, 4, 16, 19, 1, 11, 22, 95, 68, 59, 1, 62, 27, 86, 96, 15, 25, 55, 100, 96, 61, 62, 56, 57, 98, 87, 12, 73, 73, 20, 80, 54, 23, 96, 72, 75, 6, 94, 70, 25, 4, 70, 87, 83, 55, 34, 97, 32, 40, 48, 27, 1, 10, 35, 9, 7, 21, 20, 31, 46, 91, 11, 99, 66, 6, 22, 40, 63, 67, 9, 39, 23, 78, 25, 5, 85, 10, 1, 16, 50, 1, 94, 50, 10, 28, 58, 68, 1, 29, 98, 98, 20, 8, 48, 85, 65, 69, 24, 79, 88, 33, 18, 10, 10, 94, 14, 94, 4, 66, 61, 5, 66, 55, 6, 27, 34, 15, 94, 86, 43, 92, 83, 14, 51, 82, 98, 68, 3, 74, 46, 90, 6, 15, 99, 67, 9, 12, 13, 64, 29, 73, 20, 95, 79, 25, 21, 65, 39, 67, 50, 81, 10, 85, 95, 60, 18, 44, 79, 20, 17, 25, 9, 74, 91, 59, 41, 51, 22, 5, 14, 51, 29, 33, 97, 8, 9, 69, 24, 47, 35, 25, 80, 44, 9, 26, 56, 27, 69, 34, 98, 38, 10, 7, 11, 1, 65, 3, 51, 87, 7, 17, 89, 36, 1, 85, 95, 10, 53, 70, 56, 40, 94, 35, 35, 55, 12, 90, 81, 33, 76, 30, 70, 85, 36, 32, 85, 53, 35, 88, 91, 93, 4, 79, 80, 56, 15, 26, 65, 67, 95, 21, 58, 89, 7, 93, 43, 19, 34, 75, 51, 9, 4, 72, 94, 92, 3, 30, 44, 89, 69, 86, 34, 24, 64, 13, 80, 78, 91, 44, 96, 37, 64, 6, 25, 23, 98, 19, 41, 31, 45, 43, 92, 49, 14, 85, 92, 68, 66, 87, 57, 35, 72, 42, 10, 35, 6, 89, 64, 96, 33, 11, 33, 48, 16, 9, 70, 13, 28, 62, 96, 72, 56, 39, 72, 21, 75, 63, 89, 40, 1, 97, 26, 72, 90, 36, 58, 95, 24, 21, 91, 8, 32, 75, 8, 99, 83, 29, 12, 62, 43, 59, 86, 98, 49, 57, 71, 23, 72, 11, 62, 72, 59, 40, 96, 48, 75, 53, 42, 50, 74, 84, 10, 57, 58, 17, 55, 93, 45, 18, 6, 39, 28, 91, 37, 76, 100, 59, 98, 23, 69, 12, 46, 27, 51, 41, 74, 77, 94, 67, 26, 19, 51, 87, 27, 60, 3, 81, 4, 100, 51, 10, 38, 78, 52, 26, 6, 51, 36, 55, 25, 4, 66, 71, 30, 68, 11, 55, 44, 56, 22, 22, 74, 24, 8, 100, 83, 11, 33, 87, 62, 35, 48, 51, 12, 99, 29, 69, 50, 64, 24, 26, 68, 89, 96, 49, 9, 59, 56, 52, 14, 29, 73, 40, 52, 81, 91, 34, 43, 75, 72, 56, 9, 19, 6, 73, 18, 34, 41, 19, 50, 64, 44, 69, 5, 92, 17, 65, 50, 24, 16, 15, 52, 41, 6, 3, 21, 49, 89, 15, 23, 60, 70, 84, 31, 27, 56, 100, 13, 96, 18, 62, 12, 13, 30, 68, 56, 98, 32, 57, 22, 99, 24, 73, 39, 29, 28, 11, 29, 16, 25, 52, 27, 46, 35, 57, 73, 42, 56, 85, 37, 25, 98, 100, 90, 79, 19, 97, 76, 2, 54, 49, 1, 77, 74, 91, 57, 53, 2, 86, 68, 26, 89, 94, 24, 75, 3, 96, 16, 10, 32, 4, 35, 81, 56, 76, 59, 26, 72, 86, 28, 77, 87, 80, 53, 12, 70, 62, 64, 71, 99, 31, 49, 39, 76, 72, 65, 30, 19, 80, 40, 2, 35, 26, 82, 42, 53, 40, 68, 24, 77, 95, 1, 63, 74, 5, 74, 95, 18, 37, 18, 68, 19, 66, 6, 47, 89, 70, 76, 59, 1, 15, 60, 88, 92, 41, 29, 44, 32, 96, 68, 60, 42, 20, 23, 67, 76, 48, 62, 46, 37, 79, 13, 7, 96, 71, 53, 84, 40, 29, 42, 93, 95, 53, 80, 87, 45, 8, 30, 28, 4, 49, 87, 97, 20, 61, 64, 48, 61, 25, 93, 97, 3, 57, 3, 98, 27, 8, 33, 19, 36, 26, 11, 82, 78, 90, 20, 22, 49, 2, 49, 4, 50, 87, 1, 22, 48, 64, 69, 8, 40, 13, 56, 42, 21, 58, 91, 100, 65, 75, 70, 52, 100, 80, 86, 29, 21, 5, 2, 21, 6, 50, 25, 8, 88, 77, 29, 87, 40, 49, 94, 79, 13, 49, 72, 85, 59, 14, 36, 75, 88, 5, 79, 39, 36, 16, 67, 8, 20, 68, 29, 78, 69, 5, 85, 56, 81, 65, 43, 20, 65, 88, 50, 29, 89, 21, 65, 99, 86, 1, 25, 73, 5, 3, 11, 41, 18, 29, 100, 90, 96, 28, 67, 64, 32, 3, 71, 12, 19, 65, 83, 35, 53, 84, 63, 41, 56, 79, 91, 41, 79, 15, 65, 36, 70, 75, 28, 39, 55, 27, 28, 50, 55, 46, 65, 38, 100, 36, 2, 18, 52, 84, 52, 4, 20, 66, 96, 75, 45, 86, 16, 75, 53, 80, 10, 22, 7, 37, 60, 61, 16, 40, 63, 70, 85, 27, 59, 37, 14, 60, 54, 66, 96, 58, 21, 15, 75, 69, 89, 71, 6, 56, 46, 58, 88, 7, 79, 46, 96, 39, 58, 11, 30, 20, 32, 66, 99, 90, 2, 64, 50, 8, 81, 45, 17, 2, 11, 91, 22, 51, 14, 27, 7, 11, 85, 46, 17, 63, 91, 64, 53, 48, 74, 82, 20, 57, 100, 70, 47, 1, 33, 48, 8, 14, 44, 24, 67, 54, 67, 40, 4, 80, 66, 62, 90, 50, 7, 58, 65, 49, 22, 17, 49, 47, 51, 68, 56, 2, 89, 54, 2, 21, 1, 62, 86, 44, 37, 4, 49, 55, 43, 4, 34, 9, 18, 75, 10, 76, 85, 74, 25, 58, 43, 25, 56, 45, 44, 11, 46, 32, 64, 99, 52, 64, 60, 90, 59, 97, 45, 59, 51, 88, 15, 37, 48, 32, 63, 57, 7, 47, 83, 83, 4, 25, 7, 12, 69, 50, 22, 66, 81, 86, 64, 85, 1, 24, 26, 12, 72, 70, 22, 74, 9, 36, 62, 56, 67, 77, 65, 26, 23, 47, 8, 79, 23, 15, 90, 43, 16, 63, 8, 97, 48, 23, 33, 1, 98, 58, 64, 21, 27, 85, 47, 36, 73, 8, 43, 91, 84, 7, 16, 59, 5, 76, 89, 79, 42, 30, 21, 57, 92, 80, 5, 92, 3, 37, 92, 100, 94, 7, 21, 73, 43, 67, 8, 15, 26, 50, 58, 62, 9, 73, 72, 65, 100, 60, 44, 93, 89, 16, 50, 80, 96, 6, 23, 50, 43, 14, 1, 88, 72, 21, 60, 15, 39, 67, 81, 17, 69, 38, 78, 29, 63, 49, 45, 62, 60, 88, 55, 48, 56, 56, 79, 3, 61, 2, 52, 55, 67, 52, 43, 91, 25, 2, 5, 15, 21, 85, 31, 41, 75, 60, 69, 37, 8, 65, 50, 19, 5, 56, 18, 60, 63, 49, 62, 24, 50, 13, 30, 68, 16, 72, 58, 40, 26, 14, 55, 98, 51, 37, 38, 25, 97, 58, 13, 56, 22, 62, 75, 26, 70, 92, 85, 32, 40, 98, 7, 41, 62, 37, 61, 78, 60, 18, 69, 85, 32, 23, 82, 34, 12, 19, 58, 8, 28, 22, 63, 50, 83, 89, 27, 4, 33, 12, 36, 72, 61, 42, 65, 23, 30, 25, 100, 90, 94, 68, 26, 77, 43, 8, 10, 54, 78, 19, 13, 58, 40, 75, 7, 75, 16, 33, 78, 48, 96, 65, 71, 57, 59, 35, 31, 88, 11, 30, 29, 5, 49, 55, 81, 43, 14, 43, 48, 43, 61, 60, 100, 1, 87, 6, 75, 2, 91, 52, 49, 38, 69, 71, 46, 27, 6, 76, 14, 68, 57, 43, 72, 6, 49, 5, 100, 62, 47, 48, 4, 59, 7, 4, 59, 45, 61, 33, 46, 3, 37, 46, 41, 5, 17, 38, 83, 74, 14, 96, 93, 70, 90, 17, 27, 90, 21, 27, 51, 19, 26, 7, 77, 84, 10, 88, 29, 22, 72, 26, 77, 8, 24, 69, 64, 92, 6, 98, 17, 19, 94, 9, 41, 35, 25, 19, 25, 97, 97, 27, 15, 22, 33, 44, 6, 94, 31, 86, 68, 2, 11, 44, 62, 86, 12, 77, 77, 69, 75, 93, 88, 20, 2, 80, 6, 78, 50, 82, 75, 47, 9, 41, 68, 93, 84, 25, 39, 66, 62, 6, 68, 25, 1, 81, 10, 64, 57, 87, 32, 83, 31, 71, 2, 84, 2, 60, 62, 52, 41, 36, 98, 1, 76, 17, 46, 12, 42, 84, 77, 55, 41, 44, 79, 93, 76, 89, 56, 85, 27, 39, 67, 57, 10, 21, 93, 63, 80, 54, 14, 72, 89, 11, 25, 16, 80, 70, 27, 21, 5, 4, 27, 97, 99, 6, 89, 27, 46, 96, 11, 72, 86, 29, 80, 47, 49, 72, 10, 80, 77, 23, 4, 65, 86, 28, 33, 65, 97, 11, 37, 53, 14, 63, 49, 65, 20, 89, 91, 65, 84, 53, 36, 21, 81, 68, 68, 82, 91, 77, 61, 68, 51, 16, 84, 36, 43, 16, 52, 91, 27, 88, 43, 92, 3, 91, 8, 22, 79, 98, 87, 14, 2, 74, 35, 83, 93, 54, 64, 84, 82, 76, 51, 32, 92, 34, 20, 34, 50, 71, 25, 28, 11, 19, 19, 13, 10, 27, 86, 40, 76, 24, 6, 78, 98, 92, 12, 90, 45, 75, 73, 26, 2, 23, 9, 93, 9, 28, 79, 58, 51, 55, 37, 61, 73, 7, 25, 34, 33, 10, 74, 61, 86, 31, 90, 83, 22, 1, 24, 18, 75, 49, 95, 76, 23, 3, 21, 31, 31, 99, 40, 33, 5, 76, 93, 77, 83, 69, 11, 67, 30, 36, 79, 15, 66, 68, 49, 87, 68, 25, 4, 94, 73, 50, 22, 95, 52, 42, 78, 34, 92, 69, 66, 96, 45, 10, 24, 79, 30, 34, 97, 60, 21, 76, 26, 86, 43, 75, 24, 63, 99, 79, 56, 23, 28, 77, 69, 80, 70, 46, 13, 13, 67, 31, 60, 11, 40, 84, 41, 70, 69, 89, 81, 90, 64, 6, 27, 59, 32, 51, 21, 82, 29, 28, 4, 57, 5, 25, 88, 26, 22, 52, 39, 88, 82, 50, 50, 74, 33, 90, 95, 54, 79, 75, 95, 94, 32, 21, 52, 16, 71, 24, 97, 52, 52, 53, 60, 8, 77, 47, 33, 50, 50, 23, 38, 32, 25, 87, 57, 9, 29, 51, 62, 59, 77, 56, 52, 8, 29, 56, 23, 51, 79, 72, 2, 30, 24, 13, 89, 52, 11, 74, 53, 61, 48, 90, 44, 72, 29, 100, 81, 57, 50, 42, 15, 26, 50, 18, 85, 78, 73, 8, 80, 4, 31, 82, 85, 6, 46, 74, 57, 57, 47, 9, 17, 94, 51, 60, 66, 79, 11, 46, 87, 60, 39, 53, 37, 40, 70, 21, 69, 95, 80, 49, 98, 62, 82, 82, 67, 27, 7, 75, 83, 53, 36, 51, 99, 86, 62, 64, 16, 72, 61, 2, 83, 51, 54, 19, 43, 23, 92, 11, 69, 23, 59, 66, 85, 40, 100, 51, 19, 6, 26, 1, 11, 61, 4, 9, 98, 65, 24, 13, 37, 36, 14, 19, 38, 67, 90, 80, 41, 33, 91, 62, 7, 1, 27, 91, 41, 78, 94, 11, 84, 71, 11, 46, 31, 66, 54, 80, 31, 29, 92, 67, 64, 57, 37, 1, 23, 78, 81, 15, 62, 23, 76, 69, 23, 55, 11, 15, 84, 4, 25, 67, 26, 88, 64, 8, 53, 17, 87, 83, 45, 78, 1, 60, 34, 90, 61, 8, 19, 93, 75, 81, 15, 2, 49, 37, 8, 11, 4, 92, 15, 28, 10, 40, 15, 74, 48, 20, 42, 86, 2, 87, 64, 55, 98, 49, 96, 10, 9, 14, 2, 83, 94, 68, 84, 94, 5, 44, 5, 8, 35, 71, 87, 44, 62, 54, 17, 9, 73, 11, 95, 26, 49, 10, 80, 46, 58, 75, 56, 66, 41, 9, 100, 34, 77, 36, 28, 33, 79, 84, 92, 13, 54, 78, 8, 15, 31, 77, 76, 55, 87, 22, 81, 35, 31, 12, 80, 40, 39, 87, 58, 79, 96, 9, 12, 72, 44, 91, 4, 74, 74, 95, 86, 79, 24, 46, 46, 7, 22, 21, 61, 60, 42, 41, 94, 24, 53, 25, 15, 91, 12, 24, 69, 59, 85, 32, 82, 28, 23, 85, 2, 48, 31, 39, 79, 6, 36, 24, 12, 57, 44, 73, 16, 37, 65, 61, 12, 17, 86, 78, 59, 49, 54, 27, 59, 38, 11, 40, 17, 85, 76, 70, 84, 58, 61, 62, 63, 96, 37, 75, 5, 32, 99, 20, 68, 63, 33, 31, 32, 70, 61, 90, 70, 14, 69, 28, 3, 79, 67, 19, 15, 42, 89, 98, 99, 49, 12, 13, 44, 48, 39, 48, 80, 37, 20, 99, 52, 4, 82, 83, 73, 42, 24, 94, 7, 92, 21, 9, 22, 39, 27, 88, 32, 67, 86, 82, 15, 49, 94, 11, 96, 33, 10, 27, 21, 81, 26, 24, 36, 7, 6, 8, 100, 30, 1, 6, 73, 73, 66, 47, 11, 92, 34, 94, 59, 71, 75, 25, 19, 21, 87, 15, 5, 49, 93, 25, 29, 18, 49, 65, 76, 6, 24, 75, 87, 77, 32, 12, 49, 97, 58, 12, 41, 43, 57, 51, 14, 32, 27, 84, 52, 14, 50, 56, 62, 43, 32, 42, 60, 32, 6, 88, 38, 82, 14, 24, 58, 46, 35, 58, 94, 44, 21, 86, 39, 78, 36, 52, 61, 63, 87, 12, 28, 37, 19, 41, 79, 50, 82, 90, 34, 40, 77, 71, 21, 43, 46, 30, 88, 33, 39, 33, 28, 12, 19, 66, 89, 6, 69, 1, 68, 56, 12, 47, 92, 82, 87, 22, 83, 69, 11, 16, 60, 40, 38, 80, 82, 84, 61, 21, 68, 99, 5, 95, 62, 23, 61, 50, 29, 29, 2, 48, 84, 13, 47, 27, 46, 33, 48, 29, 53, 11, 96, 12, 2, 34, 43, 35, 69, 3, 7, 36, 54, 11, 82, 15, 86, 42, 17, 66, 23, 18, 65, 58, 83, 11, 37, 80, 96, 36, 8, 48, 98, 56, 12, 99, 41, 54, 85, 9, 9, 91, 96, 14, 54, 77, 28, 39, 71, 96, 4, 45, 14, 20, 2, 48, 31, 90, 27, 78, 26, 87, 77, 23, 42, 88, 22, 34, 94, 58, 42, 2, 49, 89, 15, 2, 65, 94, 92, 87, 90, 47, 31, 55, 66, 85, 54, 96, 26, 80, 73, 51, 18, 50, 74, 11, 89, 47, 44, 82, 4, 37, 35, 4, 25, 1, 57, 42, 95, 48, 28, 36, 46, 11, 42, 12, 47, 95, 59, 72, 26, 32, 75, 96, 33, 48, 6, 73, 46, 2, 7, 49, 38, 41, 5, 63, 94, 13, 4, 40, 61, 83, 75, 58, 45, 68, 69, 43, 14, 28, 67, 91, 11, 41, 86, 43, 40, 44, 67, 85, 45, 73, 85, 82, 14, 89, 44, 59, 2, 99, 98, 14, 34, 24, 71, 30, 91, 92, 73, 56, 19, 39, 46, 29, 31, 84, 23, 70, 27, 89, 54, 71, 14, 90, 4, 79, 79, 100, 37, 32, 50, 34, 97, 83, 57, 19, 13, 99, 10, 37, 6, 80, 27, 51, 8, 57, 86, 82, 78, 64, 23, 31, 34, 36, 20, 90, 14, 50, 89, 50, 33, 38, 83, 29, 73, 91, 100, 37, 41, 61, 73, 46, 41, 99, 48, 48, 7, 34, 82, 84, 97, 4, 66, 83, 39, 37, 72, 52, 87, 12, 1, 71, 1, 35, 52, 73, 25, 51, 9, 17, 11, 33, 62, 51, 31, 9, 51, 89, 94, 32, 72, 91, 35, 37, 25, 73, 26, 48, 76, 64, 59, 76, 34, 59, 10, 85, 84, 86, 87, 44, 2, 98, 77, 15, 100, 7, 23, 2, 48, 17, 33, 19, 59, 19, 8, 83, 43, 85, 30, 18, 48, 40, 93, 81, 50, 54, 18, 33, 91, 4, 77, 44, 53, 5, 58, 5, 63, 81, 6, 10, 49, 39, 81, 59, 9, 88, 41, 52, 24, 22, 21, 71, 61, 66, 51, 10, 19, 20, 95, 62, 24, 23, 5, 28, 27, 15, 32, 89, 47, 38, 51, 95, 28, 31, 53, 88, 70, 45, 39, 93, 66, 60, 63, 78, 25, 65, 39, 95, 85, 33, 8, 60, 7, 13, 87, 85, 27, 71, 74, 73, 8, 76, 19, 87, 6, 23, 74, 75, 67, 65, 67, 84, 76, 81, 61, 52, 45, 99, 98, 81, 84, 6, 92, 90, 70, 79, 75, 48, 1, 100, 72, 8, 75, 90, 46, 32, 64, 19, 6, 30, 35, 24, 65, 10, 56, 25, 61, 52, 23, 59, 33, 6, 64, 24, 48, 33, 54, 74, 80, 54, 73, 3, 13, 99, 92, 58, 30, 7, 29, 35, 88, 63, 10, 52, 73, 65, 76, 85, 16, 50, 95, 100, 8, 58, 24, 55, 42, 29, 28, 73, 35, 52, 75, 47, 50, 18, 57, 31, 24, 85, 17, 11, 99, 26, 62, 23, 42, 89, 60, 57, 91, 54, 9, 98, 12, 84, 4, 5, 12, 83, 30, 46, 86, 4, 45, 35, 74, 1, 17, 97, 37, 33, 60, 87, 58, 73, 62, 51, 62, 21, 7, 52, 74, 67, 1, 85, 50, 56, 42, 14, 38, 71, 59, 23, 26, 55, 9, 99, 7, 25, 48, 95, 57, 7, 82, 66, 79, 43, 16, 92, 63, 74, 95, 88, 41, 95, 73, 42, 50, 66, 55, 39, 36, 66, 13, 61, 20, 73, 60, 79, 97, 7, 73, 5, 65, 6, 22, 95, 100, 89, 87, 14, 63, 81, 2, 55, 28, 26, 96, 29, 91, 51, 68, 26, 16, 32, 38, 87, 5, 49, 65, 53, 7, 90, 58, 71, 95, 31, 66, 95, 20, 4, 8, 34, 84, 61, 40, 63, 86, 87, 92, 76, 89, 11, 53, 4, 42, 91, 43, 46, 91, 7, 99, 98, 48, 8, 20, 43, 90, 37, 89, 61, 40, 48, 94, 76, 9, 85, 38, 94, 72, 81, 22, 60, 91, 74, 16, 33, 16, 58, 30, 59, 16, 80, 56, 64, 39, 27, 58, 29, 64, 46, 89, 3, 93, 35, 30, 53, 19, 68, 47, 42, 100, 20, 2, 91, 93, 69, 75, 61, 78, 56, 19, 93, 36, 26, 8, 74, 52, 65, 54, 15, 62, 95, 70, 55, 81, 99, 59, 99, 18, 5, 93, 18, 76, 46, 60, 21, 14, 34, 81, 91, 89, 51, 35, 76, 76, 43, 2, 79, 59, 7, 46, 21, 1, 67, 27, 81, 17, 85, 32, 35, 42, 24, 4, 17, 69, 63, 37, 34, 48, 69, 24, 88, 19, 58, 64, 46, 52, 17, 77, 11, 23, 22, 83, 24, 88, 9, 56, 4, 45, 87, 90, 86, 62, 93, 55, 30, 7, 43, 15, 54, 12, 38, 94, 82, 48, 57, 80, 99, 25, 56, 61, 47, 29, 43, 22, 68, 3, 78, 23, 48, 64, 13, 85, 26, 57, 39, 7, 16, 34, 22, 69, 97, 11, 62, 78, 10, 70, 9, 9, 94, 16, 21, 93, 44, 64, 14, 63, 18, 91, 86, 65, 7, 98, 2, 84, 6, 92, 42, 21, 25, 15, 42, 21, 26, 55, 51, 35, 25, 59, 95, 70, 75, 68, 14, 70, 83, 28, 33, 100, 70, 18, 17, 28, 67, 18, 11, 72, 9, 5, 93, 34, 19, 86, 54, 96, 40, 56, 83, 16, 15, 29, 38, 41, 96, 51, 62, 78, 30, 94, 30, 52, 63, 46, 79, 29, 63, 42, 53, 23, 46, 97, 56, 16, 82, 62, 12, 21, 17, 46, 37, 83, 74, 74, 23, 22, 76, 85, 99, 6, 30, 80, 57, 93, 25, 35, 73, 39, 28, 25, 62, 73, 21, 69, 89, 54, 30, 52, 75, 99, 97, 63, 81, 22, 36, 56, 43, 11, 40, 94, 68, 21, 73, 24, 13, 98, 11, 38, 88, 38, 62, 49, 11, 35, 18, 51, 88, 99, 54, 14, 97, 2, 76, 30, 23, 63, 85, 66, 26, 76, 59, 93, 48, 83, 17, 13, 32, 79, 50, 20, 16, 11, 68, 78, 97, 37, 80, 85, 36, 33, 98, 84, 34, 74, 65, 9, 36, 1, 74, 61, 28, 84, 6, 76, 66, 74, 88, 50, 52, 37, 69, 67, 99, 36, 45, 96, 73, 76, 80, 60, 9, 29, 95, 94, 54, 60, 2, 42, 60, 75, 54, 88, 10, 59, 63, 28, 32, 2, 77, 83, 38, 45, 2, 36, 32, 98, 31, 56, 73, 62, 15, 81, 43, 10, 27, 96, 69, 28, 37, 80, 55, 91, 67, 16, 49, 81, 43, 33, 82, 71, 67, 71, 67, 68, 7, 99, 65, 89, 54, 38, 3, 21, 70, 45, 82, 96, 40, 2, 24, 29, 81, 30, 19, 48, 45, 19, 80, 88, 51, 14, 10, 18, 84, 77, 37, 42, 27, 2, 31, 32, 91, 85, 52, 12, 29, 85, 8, 20, 86, 83, 48, 67, 64, 66, 66, 8, 37, 45, 47, 39, 58, 57, 8, 94, 85, 45, 35, 11, 98, 17, 94, 40, 1, 46, 51, 29, 82, 10, 1, 68, 44, 48, 34, 7, 66, 51, 15, 2, 95, 13, 92, 5, 69, 100, 98, 53, 44, 84, 15, 93, 1, 9, 32, 1, 6, 34, 82, 87, 44, 82, 6, 39, 81, 39, 46, 46, 89, 12, 99, 36, 24, 91, 92, 45, 90, 41, 49, 85, 24, 64, 29, 24, 24, 60, 77, 81, 45, 58, 19, 88, 91, 25, 27, 71, 63, 24, 17, 4, 35, 67, 91, 10, 57, 82, 54, 98, 22, 3, 34, 97, 18, 62, 73, 41, 73, 1, 21, 18, 58, 39, 57, 100, 63, 35, 70, 78, 10, 38, 33, 96, 5, 23, 6, 13, 4, 11, 63, 77, 13, 48, 25, 30, 62, 49, 22, 86, 49, 94, 3, 58, 85, 12, 57, 99, 98, 27, 28, 8, 64, 60, 3, 20, 82, 8, 85, 37, 71, 47, 65, 83, 94, 42, 65, 7, 90, 38, 93, 39, 32, 47, 96, 68, 58, 53, 66, 56, 31, 94, 15, 46, 53, 17, 66, 87, 77, 2, 23, 47, 48, 40, 81, 93, 81, 97, 100, 70, 35, 92, 60, 18, 38, 8, 85, 48, 60, 50, 55, 42, 43, 69, 87, 48, 37, 4, 34, 65, 5, 8, 11, 52, 47, 44, 97, 79, 40, 48, 1, 74, 91, 12, 91, 80, 19, 75, 27, 30, 77, 33, 71, 71, 53, 58, 18, 90, 61, 3, 54, 66, 11, 17, 69, 9, 60, 65, 88, 51, 64, 40, 25, 54, 51, 67, 34, 70, 94, 12, 99, 70, 45, 70, 92, 97, 79, 10, 38, 39, 12, 92, 56, 74, 60, 25, 83, 71, 41, 22, 21, 5, 61, 97, 58, 63, 64, 43, 32, 9, 55, 83, 30, 51, 4, 21, 47, 82, 82, 37, 72, 46, 28, 28, 19, 39, 52, 53, 9, 44, 74, 81, 48, 86, 78, 58, 49, 93, 52, 32, 1, 6, 14, 82, 8, 17, 2, 55, 50, 36, 91, 22, 81, 70, 49, 99, 60, 52, 52, 68, 95, 77, 100, 95, 15, 77, 4, 15, 69, 55, 46, 21, 13, 12, 2, 20, 80, 56, 26, 30, 91, 68, 51, 71, 89, 51, 21, 48, 2, 72, 67, 48, 1, 67, 42, 15, 43, 97, 29, 64, 52, 26, 84, 16, 37, 38, 35, 69, 45, 61, 98, 35, 80, 100, 57, 69, 2, 77, 16, 3, 1, 35, 2, 1, 1, 96, 15, 95, 92, 95, 10, 95, 20, 94, 10, 57, 83, 45, 25, 27, 57, 74, 13, 36, 25, 69, 56, 26, 45, 72, 80, 97, 58, 81, 97, 58, 76, 63, 4, 20, 57, 14, 14, 77, 59, 24, 85, 41, 20, 61, 19, 76, 86, 31, 63, 10, 99, 19, 87, 95, 42, 18, 44, 99, 98, 40, 8, 26, 55, 63, 45, 11, 76, 58, 39, 86, 81, 75, 78, 52, 87, 96, 79, 72, 78, 42, 33, 28, 12, 71, 75, 5, 88, 18, 55, 86, 9, 14, 63, 63, 76, 7, 26, 4, 16, 16, 41, 97, 91, 19, 100, 77, 66, 79, 1, 44, 72, 33, 71, 83, 4, 97, 39, 91, 14, 93, 28, 23, 58, 90, 85, 33, 48, 62, 88, 64, 78, 29, 12, 68, 99, 11, 96, 64, 89, 96, 59, 60, 81, 82, 94, 84, 78, 84, 26, 92, 76, 6, 14, 33, 47, 50, 18, 95, 64, 57, 10, 41, 85, 73, 60, 83, 83, 55, 99, 24, 51, 57, 35, 83, 38, 81, 18, 16, 64, 43, 7, 92, 100, 72, 76, 47, 73, 45, 93, 36, 2, 54, 76, 86, 26, 35, 21, 60, 42, 19, 83, 44, 75, 70, 26, 65, 50, 43, 80, 65, 37, 38, 56, 37, 61, 84, 35, 33, 28, 79, 21, 29, 32, 48, 67, 57, 35, 87, 16, 76, 57, 51, 71, 83, 20, 96, 47, 21, 38, 26, 37, 26, 15, 93, 62, 75, 28, 48, 8, 55, 26, 80, 36, 57, 27, 2, 65, 13, 40, 33, 40, 48, 83, 10, 30, 54, 5, 77, 26, 94, 54, 62, 20, 21, 6, 81, 95, 33, 81, 54, 40, 6, 33, 75, 15, 12, 76, 79, 24, 15, 11, 16, 62, 45, 25, 43, 98, 30, 71, 75, 23, 77, 37, 94, 97, 94, 27, 91, 27, 7, 97, 66, 12, 29, 40, 26, 92, 67, 57, 68, 33, 67, 83, 46, 12, 7, 88, 61, 88, 59, 36, 63, 87, 24, 56, 83, 17, 82, 25, 95, 40, 21, 60, 52, 2, 51, 29, 45, 17, 85, 12, 1, 4, 46, 46, 67, 5, 34, 27, 92, 44, 14, 6, 30, 37, 14, 64, 6, 47, 88, 100, 87, 61, 12, 90, 14, 62, 70, 58, 31, 7, 22, 83, 10, 67, 29, 76, 71, 14, 54, 15, 57, 68, 72, 38, 56, 85, 53, 61, 32, 92, 61, 18, 52, 72, 59, 65, 85, 28, 75, 67, 34, 96, 50, 43, 62, 30, 70, 85, 43, 76, 51, 51, 43, 22, 40, 50, 7, 92, 11, 90, 83, 23, 7, 87, 46, 17, 3, 82, 44, 77, 49, 78, 24, 50, 72, 86, 79, 94, 22, 73, 69, 72, 23, 63, 93, 62, 12, 51, 5, 22, 40, 39, 96, 98, 77, 41, 14, 32, 23, 10, 8, 23, 39, 32, 24, 62, 69, 54, 55, 90, 26, 75, 13, 100, 37, 57, 61, 49, 60, 17, 22, 51, 55, 70, 49, 84, 10, 14, 15, 84, 75, 74, 6, 13, 57, 29, 27, 25, 82, 81, 66, 59, 8, 30, 58, 44, 87, 18, 44, 98, 86, 18, 48, 93, 87, 96, 76, 48, 62, 90, 32, 88, 63, 89, 1, 20, 18, 27, 96, 51, 59, 14, 10, 18, 43, 67, 62, 81, 37, 57, 78, 22, 26, 26, 14, 64, 73, 41, 12, 86, 30, 43, 74, 45, 31, 26, 64, 100, 4, 11, 3, 14, 24, 12, 32, 67, 30, 45, 99, 66, 1, 77, 40, 79, 2, 5, 42, 26, 46, 53, 12, 27, 47, 85, 71, 30, 10, 86, 29, 13, 97, 31, 26, 20, 94, 9, 38, 24, 53, 37, 41, 54, 13, 80, 32, 66, 85, 73, 91, 82, 78, 54, 8, 24, 38, 79, 53, 99, 64, 34, 63, 60, 16, 41, 32, 62, 49, 69, 85, 2, 57, 25, 7, 21, 5, 90, 86, 41, 62, 29, 22, 91, 82, 29, 15, 72, 7, 19, 22, 23, 4, 85, 34, 20, 25, 65, 81, 73, 34, 17, 26, 42, 41, 32, 63, 97, 21, 100, 89, 35, 28, 10, 25, 62, 91, 91, 85, 49, 10, 6, 71, 65, 90, 5, 84, 14, 69, 16, 39, 54, 84, 64, 96, 77, 48, 10, 73, 68, 9, 62, 2, 37, 23, 27, 50, 13, 17, 34, 62, 78, 39, 32, 43, 81, 88, 78, 94, 57, 46, 84, 62, 29, 100, 9, 5, 47, 18, 30, 14, 27, 43, 68, 15, 65, 46, 16, 78, 62, 49, 91, 92, 39, 22, 86, 19, 10, 15, 65, 18, 60, 100, 31, 41, 99, 40, 45, 45, 57, 74, 11, 83, 16, 78, 49, 33, 23, 64, 10, 36, 64, 52, 79, 3, 25, 64, 21, 86, 31, 37, 3, 90, 37, 34, 30, 35, 73, 27, 32, 81, 52, 42, 16, 20, 71, 64, 52, 45, 28, 13, 80, 91, 64, 11, 45, 88, 26, 66, 74, 56, 54, 28, 98, 90, 61, 27, 25, 85, 5, 8, 66, 57, 49, 33, 76, 71, 96, 27, 15, 75, 39, 46, 18, 54, 8, 62, 41, 34, 79, 66, 89, 33, 94, 86, 74, 6, 65, 98, 91, 69, 5, 8, 25, 5, 40, 52, 27, 87, 78, 93, 14, 68, 91, 31, 21, 98, 44, 14, 31, 75, 79, 72, 59, 72, 9, 32, 78, 25, 82, 20, 94, 38, 79, 70, 43, 70, 22, 21, 56, 51, 14, 69, 19, 4, 51, 91, 1, 95, 4, 84, 21, 35, 7, 79, 58, 15, 10, 35, 40, 91, 6, 85, 81, 84, 6, 23, 53, 27, 95, 61, 30, 60, 81, 100, 63, 32, 90, 16, 78, 46, 51, 98, 32, 57, 28, 89, 71, 37, 76, 62, 80, 81, 46, 60, 17, 52, 34, 69, 30, 80, 81, 11, 40, 62, 10, 2, 93, 52, 69, 70, 49, 19, 19, 80, 75, 46, 68, 98, 34, 95, 59, 65, 76, 57, 76, 92, 60, 61, 12, 89, 41, 93, 100, 32, 54, 61, 33, 98, 12, 54, 19, 60, 72, 37, 91, 99, 34, 59, 96, 19, 5, 54, 36, 80, 62, 11, 23, 21, 24, 35, 10, 64, 79, 61, 95, 84, 21, 79, 81, 85, 84, 99, 44, 56, 87, 35, 6, 72, 45, 1, 90, 49, 6, 25, 81, 68, 88, 3, 88, 11, 89, 49, 26, 67, 61, 72, 2, 34, 50, 82, 18, 86, 80, 13, 93, 18, 47, 98, 89, 43, 50, 31, 44, 55, 55, 76, 74, 94, 78, 14, 4, 19, 14, 29, 37, 75, 100, 39, 60, 2, 20, 77, 87, 52, 89, 79, 21, 88, 28, 10, 30, 77, 40, 25, 83, 46, 100, 9, 40, 30, 22, 43, 48, 87, 24, 36, 13, 75, 74, 72, 76, 46, 48, 14, 49, 37, 44, 69, 76, 71, 30, 57, 99, 21, 82, 82, 67, 33, 90, 58, 62, 63, 52, 61, 1, 75, 97, 14, 50, 22, 85, 77, 19, 85, 43, 19, 73, 86, 40, 48, 9, 69, 4, 7, 90, 37, 40, 8, 70, 81, 65, 83, 43, 16, 44, 96, 43, 92, 9, 92, 65, 45, 20, 36, 81, 62, 54, 53, 100, 93, 52, 60, 14, 8, 18, 3, 44, 58, 62, 65, 38, 26, 48, 33, 93, 91, 28, 35, 34, 88, 78, 98, 84, 98, 85, 65, 11, 39, 17, 62, 83, 21, 73, 96, 28, 91, 50, 71, 48, 11, 88, 37, 36, 35, 69, 81, 77, 48, 15, 10, 87, 93, 59, 71, 42, 44, 35, 4, 34, 3, 18, 16, 23, 90, 64, 50, 80, 13, 73, 79, 24, 60, 16, 11, 46, 36, 91, 22, 36, 58, 83, 22, 2, 93, 44, 43, 36, 78, 98, 21, 33, 15, 89, 7, 57, 52, 57, 88, 64, 81, 67, 87, 92, 34, 50, 37, 69, 40, 10, 4, 49, 92, 78, 50, 84, 21, 92, 72, 51, 42, 44, 35, 8, 32, 41, 64, 83, 49, 4, 99, 29, 70, 85, 72, 3, 86, 60, 23, 78, 69, 79, 26, 60, 56, 76, 96, 28, 19, 19, 30, 60, 62, 64, 20, 94, 5, 35, 28, 5, 38, 26, 86, 7, 63, 57, 61, 48, 17, 84, 25, 85, 62, 3, 97, 69, 78, 92, 96, 96, 62, 78, 8, 23, 41, 79, 68, 97, 13, 96, 2, 51, 21, 87, 9, 83, 95, 70, 83, 11, 5, 59, 48, 66, 61, 44, 86, 38, 87, 81, 86, 48, 10, 45, 22, 3, 23, 90, 99, 87, 85, 52, 89, 57, 90, 98, 92, 37, 19, 74, 47, 75, 32, 46, 92, 45, 41, 77, 82, 79, 9, 19, 78, 19, 15, 100, 21, 37, 89, 71, 76, 25, 75, 64, 81, 64, 13, 72, 52, 83, 97, 51, 57, 81, 96, 48, 25, 37, 24, 58, 67, 85, 29, 45, 3, 43, 44, 75, 32, 84, 45, 7, 8, 19, 22, 88, 35, 35, 12, 86, 17, 60, 88, 26, 40, 84, 25, 16, 72, 1, 26, 38, 85, 54, 82, 39, 96, 77, 13, 27, 60, 57, 85, 67, 28, 7, 7, 14, 93, 18, 51, 9, 29, 39, 86, 69, 22, 11, 36, 45, 11, 61, 82, 47, 14, 16, 85, 62, 92, 97, 88, 4, 5, 25, 70, 32, 31, 76, 45, 23, 45, 48, 83, 74, 86, 69, 94, 59, 31, 29, 3, 93, 42, 36, 39, 55, 3, 23, 16, 95, 19, 56, 98, 23, 80, 19, 7, 62, 47, 3, 84, 91, 50, 66, 16, 35, 86, 61, 93, 68, 90, 47, 60, 83, 83, 98, 37, 85, 20, 5, 31, 90, 12, 80, 65, 91, 51, 71, 52, 97, 73, 87, 39, 75, 4, 55, 9, 42, 15, 54, 9, 56, 100, 69, 90, 34, 18, 27, 71, 90, 83, 1, 79, 94, 33, 43, 36, 83, 65, 39, 79, 90, 77, 69, 64, 80, 75, 24, 21, 42, 77, 30, 97, 29, 50, 87, 14, 67, 65, 84, 56, 99, 85, 87, 44, 69, 81, 31, 51, 46, 69, 81, 87, 97, 49, 50, 76, 24, 73, 49, 65, 2, 30, 13, 82, 79, 51, 95, 97, 67, 79, 5, 65, 15, 91, 60, 35, 71, 90, 85, 68, 10, 17, 54, 6, 65, 55, 34, 40, 80, 82, 56, 33, 11, 69, 14, 41, 71, 60, 89, 38, 90, 93, 54, 56, 35, 14, 90, 58, 3, 26, 25, 13, 42, 31, 70, 59, 37, 3, 50, 16, 36, 6, 100, 98, 74, 65, 38, 44, 77, 79, 33, 66, 71, 87, 74, 6, 100, 15, 15, 2, 41, 91, 66, 34, 73, 88, 44, 10, 42, 46, 77, 78, 51, 77, 75, 76, 93, 65, 71, 69, 43, 4, 87, 65, 90, 60, 22, 41, 74, 36, 94, 66, 27, 60, 52, 99, 99, 47, 60, 40, 92, 37, 17, 94, 65, 44, 69, 57, 60, 40, 26, 54, 95, 64, 18, 36, 23, 92, 76, 48, 79, 69, 66, 57, 80, 17, 56, 78, 15, 67, 70, 59, 55, 38, 52, 19, 81, 73, 28, 92, 64, 5, 45, 58, 68, 15, 93, 90, 6, 68, 89, 84, 88, 54, 41, 68, 22, 48, 97, 37, 66, 66, 47, 21, 4, 98, 39, 84, 22, 66, 28, 85, 22, 72, 94, 89, 86, 86, 30, 43, 5, 19, 79, 45, 24, 71, 12, 46, 18, 8, 34, 35, 74, 80, 55, 77, 29, 94, 12, 51, 11, 39, 87, 85, 63, 81, 73, 100, 18, 55, 43, 23, 25, 21, 67, 48, 91, 30, 93, 60, 37, 78, 94, 62, 9, 1, 90, 38, 46, 54, 40, 8, 44, 26, 92, 6, 6, 17, 6, 76, 71, 100, 50, 95, 20, 68, 94, 62, 97, 39, 73, 85, 16, 18, 99, 25, 18, 88, 14, 63, 41, 53, 71, 85, 30, 14, 42, 88, 30, 99, 63, 100, 98, 12, 46, 69, 79, 40, 82, 27, 78, 54, 11, 93, 24, 9, 69, 41, 97, 82, 56, 89, 34, 78, 25, 16, 91, 19, 3, 21, 17, 65, 72, 15, 76, 18, 35, 6, 57, 17, 32, 86, 22, 42, 78, 45, 3, 47, 38, 51, 80, 45, 39, 66, 22, 16, 81, 64, 34, 83, 84, 50, 47, 8, 16, 74, 25, 51, 31, 33, 19, 62, 18, 40, 55, 47, 85, 9, 45, 22, 59, 25, 66, 50, 90, 39, 65, 70, 2, 50, 4, 38, 99, 2, 45, 67, 27, 21, 69, 57, 53, 87, 70, 22, 26, 76, 68, 10, 85, 65, 83, 43, 89, 100, 44, 30, 90, 8, 99, 92, 9, 54, 81, 60, 55, 77, 26, 81, 97, 94, 89, 1, 80, 58, 74, 57, 33, 41, 19, 17, 5, 1, 12, 45, 53, 55, 74, 42, 15, 24, 85, 23, 77, 65, 82, 83, 41, 7, 63, 89, 52, 51, 89, 83, 60, 62, 40, 93, 55, 58, 61, 11, 10, 72, 56, 62, 27, 81, 56, 41, 5, 40, 63, 81, 5, 45, 64, 97, 3, 78, 86, 55, 81, 26, 89, 40, 40, 28, 32, 94, 37, 45, 56, 99, 16, 11, 60, 94, 92, 15, 34, 48, 7, 49, 80, 63, 45, 95, 59, 99, 73, 96, 5, 5, 22, 94, 44, 61, 73, 28, 6, 10, 72, 13, 8, 87, 24, 19, 81, 67, 86, 66, 66, 92, 66, 45, 6, 62, 40, 64, 61, 64, 60, 65, 68, 33, 10, 11, 45, 83, 90, 2, 44, 61, 14, 3, 100, 89, 73, 32, 7, 58, 49, 72, 1, 15, 17, 6, 76, 8, 22, 88, 71, 81, 53, 90, 65, 62, 100, 9, 96, 90, 10, 39, 2, 75, 93, 1, 64, 66, 84, 70, 75, 33, 42, 76, 47, 58, 33, 74, 17, 54, 62, 87, 86, 66, 76, 2, 79, 27, 10, 27, 68, 71, 17, 70, 46, 10, 22, 9, 75, 6, 78, 49, 38, 71, 76, 36, 80, 61, 61, 96, 66, 74, 34, 52, 39, 61, 5, 70, 88, 15, 96, 7, 37, 12, 28, 82, 21, 2, 42, 47, 7, 72, 48, 96, 42, 75, 83, 22, 35, 43, 17, 1, 69, 3, 4, 7, 63, 8, 28, 50, 74, 23, 9, 11, 35, 36, 44, 7, 37, 86, 6, 95, 9, 53, 42, 50, 27, 24, 23, 14, 19, 92, 14, 87, 94, 17, 45, 56, 76, 73, 58, 50, 95, 66, 60, 81, 53, 55, 40, 90, 92, 45, 36, 100, 97, 78, 50, 75, 1, 24, 88, 71, 15, 53, 57, 60, 69, 2, 16, 97, 74, 25, 46, 20, 42, 57, 53, 94, 63, 92, 35, 55, 36, 71, 54, 84, 48, 55, 58, 100, 79, 98, 71, 45, 50, 27, 5, 71, 80, 72, 67, 5, 48, 64, 77, 89, 72, 29, 82, 34, 20, 69, 88, 55, 39, 94, 90, 86, 48, 47, 85, 78, 96, 55, 23, 46, 34, 79, 16, 13, 2, 34, 70, 49, 97, 46, 89, 68, 74, 22, 53, 93, 90, 41, 99, 28, 34, 88, 65, 33, 86, 50, 11, 82, 56, 85, 27, 41, 15, 94, 54, 68, 27, 75, 16, 23, 20, 4, 42, 45, 77, 94, 37, 67, 86, 87, 94, 71, 74, 11, 4, 11, 60, 66, 92, 67, 2, 70, 8, 16, 63, 13, 83, 89, 87, 50, 63, 58, 5, 56, 2, 81, 2, 90, 47, 87, 76, 93, 10, 1, 3, 65, 11, 14, 30, 55, 32, 83, 24, 39, 98, 39, 3, 32, 79, 41, 33, 42, 98, 37, 97, 99, 69, 98, 40, 68, 37, 15, 12, 46, 67, 66, 10, 78, 79, 91, 84, 62, 73, 59, 1, 22, 97, 55, 5, 76, 96, 37, 69, 93, 25, 17, 44, 45, 67, 83, 12, 3, 50, 75, 100, 16, 40, 61, 45, 70, 51, 28, 32, 75, 87, 84, 96, 83, 38, 52, 10, 33, 88, 78, 78, 64, 47, 73, 8, 13, 7, 72, 67, 56, 46, 66, 24, 86, 78, 68, 55, 80, 96, 38, 54, 34, 21, 1, 16, 59, 52, 78, 43, 91, 55, 72, 54, 1, 44, 61, 65, 51, 32, 31, 58, 78, 48, 81, 15, 25, 49, 21, 4, 96, 59, 57, 29, 79, 9, 44, 89, 60, 73, 84, 50, 80, 55, 55, 32, 51, 16, 97, 53, 99, 27, 10, 76, 75, 91, 42, 99, 39, 63, 55, 86, 21, 63, 14, 51, 72, 9, 92, 31, 82, 27, 33, 61, 33, 87, 92, 83, 54, 88, 35, 53, 67, 97, 80, 93, 87, 22, 43, 77, 36, 97, 62, 8, 60, 75, 58, 31, 83, 1, 13, 64, 79, 97, 76, 12, 36, 68, 46, 89, 7, 33, 93, 25, 29, 25, 17, 15, 98, 60, 43, 33, 56, 4, 40, 67, 30, 49, 49, 64, 50, 14, 80, 28, 10, 55, 91, 45, 74, 37, 86, 81, 69, 78, 5, 49, 54, 74, 63, 51, 33, 57, 83, 40, 12, 22, 59, 93, 23, 7, 56, 24, 20, 35, 3, 30, 42, 94, 26, 15, 82, 63, 47, 50, 93, 4, 98, 46, 77, 12, 97, 61, 20, 31, 52, 31, 53, 10, 23, 27, 17, 78, 50, 88, 65, 52, 69, 58, 45, 95, 72, 26, 9, 71, 27, 1, 26, 76, 47, 54, 87, 95, 14, 58, 25, 65, 88, 29, 27, 62, 55, 43, 92, 4, 82, 56, 56, 51, 13, 52, 97, 36, 78, 5, 6, 56, 6, 83, 32, 4, 36, 70, 98, 49, 28, 74, 66, 15, 3, 44, 77, 57, 86, 68, 13, 19, 75, 20, 69, 39, 71, 65, 74, 48, 22, 32, 4, 79, 14, 87, 82, 50, 56, 31, 50, 83, 56, 67, 50, 58, 10, 78, 67, 47, 45, 31, 66, 71, 50, 86, 9, 20, 3, 34, 20, 24, 17, 75, 2, 31, 61, 35, 32, 16, 17, 33, 99, 72, 52, 100, 30, 13, 77, 48, 60, 73, 78, 77, 43, 27, 14, 3, 46, 16, 36, 17, 91, 53, 91, 92, 35, 51, 78, 18, 67, 94, 2, 17, 66, 53, 16, 47, 18, 92, 94, 29, 64, 23, 57, 58, 49, 70, 60, 46, 38, 47, 63, 28, 51, 53, 72, 85, 56, 49, 54, 22, 43, 56, 90, 60, 60, 57, 58, 77, 48, 51, 5, 63, 25, 13, 20, 25, 83, 31, 70, 20, 77, 84, 47, 28, 89, 18, 64, 44, 19, 18, 17, 13, 25, 58, 72, 36, 14, 29, 65, 13, 31, 21, 27, 7, 34, 98, 31, 16, 28, 52, 87, 56, 36, 33, 83, 76, 3, 99, 71, 73, 68, 87, 85, 92, 44, 8, 79, 9, 88, 43, 21, 70, 64, 47, 76, 97, 44, 6, 64, 71, 57, 50, 78, 44, 34, 13, 71, 88, 11, 41, 60, 78, 27, 44, 21, 22, 3, 51, 30, 90, 94, 2, 59, 57, 48, 34, 5, 91, 91, 68, 13, 100, 17, 43, 43, 2, 55, 14, 90, 65, 6, 49, 94, 33, 45, 66, 6, 47, 68, 88, 89, 61, 89, 47, 69, 37, 33, 73, 79, 23, 92, 44, 22, 8, 86, 17, 62, 92, 82, 51, 8, 87, 99, 53, 71, 95, 70, 77, 42, 37, 64, 82, 98, 4, 28, 18, 40, 12, 91, 71, 35, 34, 66, 8, 42, 3, 24, 55, 94, 5, 5, 53, 92, 3, 5, 62, 50, 74, 90, 43, 10, 5, 24, 59, 9, 51, 77, 100, 15, 19, 22, 49, 52, 87, 56, 45, 41, 32, 99, 34, 36, 3, 86, 79, 58, 42, 93, 7, 15, 82, 49, 77, 39, 72, 35, 47, 74, 63, 98, 88, 81, 20, 88, 33, 6, 96, 77, 99, 27, 28, 84, 14, 30, 22, 45, 87, 63, 37, 45, 30, 70, 93, 6, 8, 16, 92, 6, 42, 55, 4, 29, 87, 75, 69, 19, 32, 64, 48, 30, 90, 75, 14, 55, 56, 35, 99, 95, 97, 87, 39, 78, 57, 84, 83, 16, 51, 27, 74, 92, 81, 29, 21, 67, 3, 89, 38, 34, 4, 37, 64, 93, 63, 29, 99, 18, 63, 98, 12, 11, 84, 3, 89, 92, 38, 23, 60, 88, 49, 85, 80, 29, 13, 52, 48, 67, 40, 37, 100, 95, 73, 15, 87, 35, 43, 85, 4, 57, 34, 68, 68, 70, 70, 56, 61, 7, 78, 72, 94, 27, 56, 25, 7, 20, 76, 6, 86, 67, 42, 86, 61, 14, 52, 99, 48, 95, 36, 52, 51, 69, 71, 70, 38, 40, 77, 51, 98, 7, 22, 43, 33, 78, 68, 91, 97, 95, 97, 35, 62, 38, 72, 22, 4, 23, 73, 3, 69, 8, 6, 72, 76, 76, 41, 14, 67, 18, 64, 64, 24, 37, 7, 8, 14, 26, 50, 63, 20, 98, 97, 81, 88, 20, 55, 91, 42, 27, 93, 11, 34, 51, 82, 61, 26, 74, 26, 93, 91, 41, 56, 66, 78, 14, 25, 91, 91, 75, 5, 11, 72, 53, 43, 59, 72, 49, 49, 66, 27, 94, 76, 12, 44, 9, 73, 21, 34, 50, 13, 77, 91, 21, 42, 68, 86, 67, 10, 77, 41, 15, 39, 64, 19, 33, 23, 43, 82, 23, 8, 60, 16, 35, 24, 11, 43, 48, 32, 28, 97, 96, 4, 87, 16, 46, 54, 2, 64, 16, 30, 56, 82, 68, 19, 100, 100, 41, 42, 33, 16, 49, 45, 31, 83, 68, 94, 77, 15, 25, 5, 11, 20, 60, 50, 88, 57, 55, 89, 20, 70, 70, 75, 51, 37, 46, 51, 88, 38, 44, 73, 53, 45, 17, 36, 27, 84, 29, 56, 98, 5, 12, 60, 76, 71, 9, 63, 28, 16, 3, 99, 85, 72, 74, 36, 60, 71, 38, 48, 8, 33, 20, 61, 77, 36, 96, 56, 71, 76, 63, 20, 80, 74, 79, 7, 96, 40, 70, 75, 55, 24, 74, 91, 96, 99, 78, 7, 69, 67, 54, 76, 100, 25, 88, 28, 60, 83, 35, 82, 10, 97, 1, 89, 22, 32, 96, 70, 23, 17, 44, 29, 40, 69, 19, 87, 67, 97, 94, 87, 15, 99, 15, 66, 24, 2, 94, 35, 37, 28, 17, 46, 77, 69, 87, 98, 100, 34, 19, 22, 50, 63, 2, 41, 83, 21, 80, 50, 69, 25, 88, 83, 23, 2, 49, 98, 4, 94, 33, 92, 73, 1, 37, 49, 69, 75, 99, 21, 8, 17, 94, 9, 31, 96, 50, 14, 68, 81, 15, 88, 5, 2, 70, 79, 4, 70, 29, 59, 15, 13, 2, 88, 13, 90, 36, 33, 65, 86, 53, 72, 3, 99, 81, 33, 46, 82, 98, 13, 14, 12, 100, 70, 14, 21, 48, 69, 43, 28, 79, 57, 40, 80, 96, 52, 69, 84, 37, 33, 69, 41, 57, 23, 39, 89, 56, 84, 70, 53, 48, 35, 17, 47, 4, 30, 68, 3, 98, 62, 31, 28, 18, 70, 7, 66, 74, 27, 49, 10, 12, 17, 50, 68, 40, 41, 56, 47, 24, 77, 51, 72, 63, 67, 70, 66, 96, 89, 68, 45, 50, 98, 24, 20, 68, 30, 85, 41, 9, 33, 2, 20, 1, 51, 39, 40, 91, 46, 38, 67, 74, 89, 90, 36, 55, 59, 1, 3, 48, 20, 99, 49, 70, 23, 68, 37, 4, 4, 29, 12, 88, 30, 83, 89, 32, 73, 80, 75, 18, 18, 41, 43, 58, 30, 78, 64, 40, 30, 66, 39, 2, 17, 88, 71, 39, 7, 59, 42, 11, 39, 6, 98, 20, 40, 38, 51, 13, 18, 25, 82, 87, 17, 25, 44, 46, 54, 7, 38, 36, 73, 76, 89, 89, 63, 59, 79, 70, 17, 72, 32, 7, 77, 29, 26, 69, 67, 76, 81, 36, 53, 14, 22, 69, 90, 65, 67, 44, 71, 4, 31, 95, 79, 19, 35, 94, 29, 13, 63, 97, 37, 46, 3, 65, 26, 28, 33, 44, 55, 65, 79, 7, 79, 100, 28, 68, 16, 94, 63, 39, 49, 45, 85, 79, 15, 20, 72, 43, 84, 86, 39, 20, 31, 93, 85, 57, 20, 69, 100, 27, 34, 79, 33, 12, 30, 12, 31, 46, 57, 94, 36, 5, 90, 20, 36, 5, 39, 7, 99, 75, 93, 38, 46, 23, 82, 82, 31, 54, 51, 31, 80, 84, 61, 64, 47, 90, 76, 29, 87, 84, 74, 22, 41, 64, 42, 76, 68, 32, 82, 66, 58, 26, 55, 56, 49, 37, 37, 79, 42, 39, 61, 21, 74, 21, 36, 20, 11, 11, 49, 49, 47, 22, 71, 87, 37, 64, 62, 4, 47, 95, 22, 57, 21, 76, 12, 21, 64, 48, 99, 57, 87, 12, 77, 60, 32, 65, 32, 94, 27, 32, 43, 73, 5, 65, 59, 42, 28, 72, 45, 26, 67, 18, 82, 87, 46, 93, 7, 61, 41, 57, 18, 79, 68, 46, 90, 52, 10, 21, 45, 37, 52, 87, 9, 57, 51, 68, 98, 30, 91, 94, 8, 57, 12, 89, 95, 57, 82, 1, 17, 74, 10, 34, 4, 29, 32, 93, 80, 41, 66, 25, 77, 17, 63, 86, 25, 66, 5, 74, 47, 95, 68, 54, 4, 31, 43, 98, 39, 76, 51, 55, 1, 60, 41, 56, 88, 72, 48, 20, 64, 13, 44, 41, 82, 58, 26, 6, 23, 82, 32, 70, 28, 51, 23, 31, 81, 17, 29, 19, 44, 79, 25, 44, 90, 17, 99, 29, 40, 99, 48, 4, 11, 43, 44, 44, 1, 21, 2, 23, 54, 33, 44, 81, 83, 19, 12, 15, 35, 92, 85};
+
+int output_array[NUM_BINS];
+int expected_array[NUM_BINS] = {7079, 7237, 7182, 7228, 7274};
+
+int output_array_accel[NUM_BINS*NUM_ACCELS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise1/solution/bambu.sh b/documentation/tutorial_pact_2022/04-simd/Exercise1/solution/bambu.sh
new file mode 100755
index 000000000..4b8bc8da8
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise1/solution/bambu.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)/..
+bambu ${root_dir}/histogram.c \
+ --compiler=I386_GCC49 --experimental-setup=BAMBU-BALANCED-MP \
+ --device-name=5SGXEA7N2F45C1 --clock-period=10 \
+ -fwhole-program -fno-delete-null-pointer-checks -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 \
+ -fopenmp-simd=1 \
+ --simulate --pretty-print=output.c \
+ "$@" |& tee log.txt
\ No newline at end of file
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise2/bambu.sh b/documentation/tutorial_pact_2022/04-simd/Exercise2/bambu.sh
new file mode 100755
index 000000000..d78d048a4
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise2/bambu.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)
+bambu ${root_dir}/histogram.c \
+ --compiler=I386_GCC49 --experimental-setup=BAMBU-BALANCED-MP \
+ --device-name=5SGXEA7N2F45C1 --clock-period=10 \
+ -fwhole-program -fno-delete-null-pointer-checks -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 \
+ --simulate \
+ "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise2/histogram.c b/documentation/tutorial_pact_2022/04-simd/Exercise2/histogram.c
new file mode 100644
index 000000000..11c9063cc
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise2/histogram.c
@@ -0,0 +1,98 @@
+#define NUM_ACCELS 8
+#define MAX_NUM 100
+#define NUM_BINS 5
+#define BIN_MAX_NUM MAX_NUM/NUM_BINS
+//#define ARRAY_SIZE 60
+//#define ARRAY_SIZE 120
+//#define ARRAY_SIZE 6000
+#define ARRAY_SIZE 36000
+#define OPS_PER_ACCEL ARRAY_SIZE/NUM_ACCELS
+
+#include
+#include "histogram.h"
+
+void histogram (int * input, int * output, int max_idx)
+{
+ int i, num;
+ int temp0 = 0, temp1 = 0, temp2 = 0, temp3 = 0, temp4 = 0, temp5 = 0;
+ //make local variables here instead of reading and writing to global memory each time???
+ for (i = 0; i < max_idx; i++)
+ {
+// printf ("%d\n", input[startidx]);
+ num = input[i];
+ if (num > 0 && num <= BIN_MAX_NUM)
+ {
+// output[0]+=1;
+ temp0 += 1;
+ }
+ else if (num > BIN_MAX_NUM && num <= (BIN_MAX_NUM * 2))
+ {
+// output[1]+=1;
+ temp1 += 1;
+ }
+ else if (num > (BIN_MAX_NUM * 2) && num <= (BIN_MAX_NUM * 3))
+ {
+// output[2]+=1;
+ temp2 += 1;
+ }
+ else if (num > (BIN_MAX_NUM * 3) && num <= (BIN_MAX_NUM * 4))
+ {
+// output[3]+=1;
+ temp3 += 1;
+ }
+ else
+ {
+// output[4]+=1;
+ temp4 += 1;
+ }
+ }
+ printf("%d\n", temp0);
+ output[0] += temp0;
+ output[1] += temp1;
+ output[2] += temp2;
+ output[3] += temp3;
+ output[4] += temp4;
+
+}
+
+int main ()
+{
+
+ int i, j;
+ int main_result = 0;
+
+ #pragma omp simd
+ for (i = 0; i < NUM_ACCELS; i++)
+ {
+ histogram(input_array + OPS_PER_ACCEL * i, output_array_accel + i * NUM_BINS, OPS_PER_ACCEL);
+ }
+
+ //could have been done with locks inside accelerator
+ //combine the results
+ for (i = 0; i < NUM_BINS; i++)
+ {
+ for (j = 0; j < NUM_ACCELS; j++)
+ {
+ output_array[i] += output_array_accel[i + j * NUM_BINS];
+ }
+ }
+
+ //check the results
+ for (i = 0; i < NUM_BINS; i++)
+ {
+ main_result += (output_array[i] == expected_array[i]);
+ }
+
+ //check final result
+ printf ("Result: %d\n", main_result);
+ if (main_result == NUM_BINS)
+ {
+ printf("RESULT: PASS\n");
+ return 0;
+ }
+ else
+ {
+ printf("RESULT: FAIL\n");
+ return 1;
+ }
+}
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise2/histogram.h b/documentation/tutorial_pact_2022/04-simd/Exercise2/histogram.h
new file mode 100644
index 000000000..ff015af91
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise2/histogram.h
@@ -0,0 +1,6 @@
+int input_array[ARRAY_SIZE] = {84, 87, 78, 16, 94, 36, 87, 93, 50, 22, 63, 28, 91, 60, 64, 27, 41, 27, 73, 37, 12, 69, 68, 30, 83, 31, 63, 24, 68, 36, 30, 3, 23, 59, 70, 68, 94, 57, 12, 43, 30, 74, 22, 20, 85, 38, 99, 25, 16, 71, 14, 27, 92, 81, 57, 74, 63, 71, 97, 82, 6, 26, 85, 28, 37, 6, 47, 30, 14, 58, 25, 96, 83, 46, 15, 68, 35, 65, 44, 51, 88, 9, 77, 79, 89, 85, 4, 52, 55, 100, 33, 61, 77, 69, 40, 13, 27, 87, 95, 40, 96, 71, 35, 79, 68, 2, 98, 3, 18, 93, 53, 57, 2, 81, 87, 42, 66, 90, 45, 20, 41, 30, 32, 18, 98, 72, 82, 76, 10, 28, 68, 57, 98, 54, 87, 66, 7, 84, 20, 25, 29, 72, 33, 30, 4, 20, 71, 69, 9, 16, 41, 50, 97, 24, 19, 46, 47, 52, 22, 56, 80, 89, 65, 29, 42, 51, 94, 1, 35, 65, 25, 15, 88, 57, 44, 92, 28, 66, 60, 37, 33, 52, 38, 29, 76, 8, 75, 22, 59, 96, 30, 38, 36, 94, 19, 29, 44, 12, 29, 30, 77, 5, 44, 64, 14, 39, 7, 41, 5, 19, 29, 89, 70, 18, 18, 97, 25, 44, 71, 84, 91, 100, 73, 26, 45, 91, 6, 40, 55, 87, 70, 83, 43, 65, 98, 8, 56, 5, 49, 12, 23, 29, 100, 44, 47, 69, 41, 23, 12, 11, 6, 2, 62, 31, 79, 6, 21, 37, 45, 27, 23, 66, 9, 17, 83, 59, 25, 38, 63, 25, 1, 37, 53, 100, 80, 51, 69, 72, 74, 32, 82, 31, 34, 95, 61, 64, 100, 82, 100, 97, 60, 74, 14, 69, 91, 96, 27, 67, 85, 41, 91, 85, 77, 43, 37, 8, 46, 57, 80, 19, 88, 13, 49, 73, 60, 10, 37, 11, 43, 88, 7, 2, 14, 73, 22, 56, 20, 100, 22, 5, 40, 12, 41, 68, 6, 29, 28, 51, 85, 59, 21, 25, 23, 70, 97, 82, 31, 85, 93, 73, 73, 51, 26, 86, 23, 100, 41, 43, 99, 14, 99, 91, 25, 91, 10, 82, 20, 37, 33, 56, 95, 5, 80, 70, 74, 77, 51, 56, 61, 43, 80, 85, 94, 6, 22, 68, 5, 14, 62, 55, 27, 60, 45, 3, 3, 7, 85, 22, 43, 69, 29, 90, 73, 9, 59, 99, 37, 9, 54, 49, 4, 34, 34, 49, 91, 55, 68, 47, 69, 30, 1, 47, 89, 98, 50, 91, 4, 34, 64, 98, 54, 93, 87, 26, 53, 97, 76, 89, 58, 30, 37, 61, 15, 22, 61, 5, 29, 28, 51, 49, 57, 3, 95, 98, 100, 44, 40, 3, 29, 4, 1, 82, 48, 39, 60, 52, 36, 35, 40, 93, 16, 28, 5, 30, 50, 65, 86, 30, 44, 36, 78, 1, 39, 72, 50, 90, 68, 89, 93, 96, 44, 45, 30, 91, 83, 41, 42, 70, 27, 33, 62, 43, 61, 18, 24, 62, 82, 10, 91, 26, 97, 68, 78, 35, 91, 27, 25, 58, 15, 69, 6, 59, 13, 87, 1, 47, 27, 95, 17, 53, 79, 30, 47, 91, 48, 71, 52, 81, 32, 94, 58, 28, 13, 87, 15, 56, 13, 91, 13, 80, 11, 70, 90, 75, 56, 42, 21, 34, 88, 89, 39, 67, 71, 85, 57, 18, 7, 61, 50, 38, 6, 60, 18, 19, 46, 84, 74, 59, 74, 38, 90, 84, 8, 79, 58, 15, 72, 30, 1, 60, 19, 39, 26, 89, 75, 34, 58, 82, 94, 59, 71, 100, 18, 40, 70, 64, 23, 95, 74, 48, 32, 63, 83, 91, 93, 92, 58, 16, 22, 58, 75, 92, 48, 52, 32, 22, 38, 41, 55, 31, 99, 26, 82, 17, 17, 3, 32, 40, 97, 5, 39, 81, 19, 22, 71, 63, 13, 80, 78, 86, 37, 5, 77, 84, 8, 60, 58, 45, 100, 12, 28, 51, 37, 61, 19, 6, 64, 50, 45, 12, 6, 35, 92, 76, 56, 15, 90, 69, 94, 19, 6, 83, 23, 83, 18, 31, 94, 75, 27, 94, 87, 54, 44, 75, 15, 14, 80, 78, 63, 76, 89, 20, 11, 33, 95, 18, 47, 36, 38, 92, 54, 44, 74, 29, 26, 92, 11, 19, 18, 37, 64, 56, 91, 59, 31, 5, 72, 62, 34, 86, 90, 74, 5, 52, 6, 51, 69, 4, 86, 7, 96, 40, 50, 21, 68, 27, 64, 78, 97, 82, 66, 61, 37, 56, 71, 19, 12, 43, 33, 97, 80, 22, 71, 85, 73, 28, 35, 41, 84, 73, 99, 31, 64, 48, 51, 31, 74, 15, 60, 23, 48, 25, 83, 36, 33, 5, 55, 44, 99, 87, 41, 79, 60, 63, 63, 84, 42, 49, 24, 25, 73, 23, 55, 36, 22, 58, 66, 48, 72, 77, 70, 19, 2, 4, 54, 34, 8, 60, 29, 7, 98, 21, 85, 9, 35, 99, 92, 77, 99, 16, 53, 72, 90, 60, 7, 11, 17, 25, 10, 40, 1, 79, 10, 54, 82, 15, 39, 90, 27, 68, 48, 24, 88, 32, 33, 23, 82, 76, 51, 80, 91, 55, 51, 32, 14, 58, 95, 82, 82, 4, 21, 34, 83, 82, 88, 16, 97, 26, 5, 23, 93, 52, 98, 33, 35, 82, 7, 16, 58, 9, 96, 100, 63, 98, 84, 77, 55, 78, 10, 88, 33, 83, 22, 67, 64, 61, 83, 12, 86, 87, 86, 31, 91, 84, 15, 77, 17, 21, 93, 26, 29, 40, 26, 91, 37, 61, 19, 44, 38, 29, 83, 22, 11, 56, 89, 26, 16, 71, 38, 54, 9, 23, 84, 51, 58, 98, 28, 27, 70, 72, 52, 50, 11, 29, 40, 99, 89, 11, 94, 78, 91, 77, 100, 53, 32, 88, 78, 100, 58, 67, 53, 18, 42, 36, 69, 99, 85, 96, 77, 6, 67, 29, 55, 29, 9, 94, 79, 98, 56, 73, 75, 46, 1, 26, 98, 84, 13, 28, 83, 22, 94, 35, 40, 35, 22, 60, 86, 58, 55, 62, 63, 73, 42, 17, 53, 51, 63, 83, 100, 18, 55, 74, 16, 7, 52, 65, 91, 64, 92, 73, 38, 38, 60, 29, 72, 81, 88, 57, 91, 42, 71, 53, 66, 12, 70, 18, 62, 84, 52, 13, 1, 7, 39, 68, 65, 90, 33, 55, 5, 76, 80, 42, 13, 39, 70, 37, 71, 57, 45, 61, 50, 15, 66, 15, 27, 87, 84, 40, 70, 36, 53, 22, 94, 91, 90, 10, 32, 74, 65, 36, 49, 96, 78, 14, 34, 99, 50, 56, 56, 94, 69, 57, 61, 34, 24, 87, 72, 59, 78, 41, 46, 82, 62, 91, 24, 51, 1, 55, 76, 65, 43, 25, 60, 20, 90, 45, 70, 39, 52, 77, 84, 20, 34, 44, 5, 57, 82, 76, 67, 12, 68, 13, 93, 30, 3, 69, 32, 3, 75, 8, 19, 17, 84, 78, 88, 73, 74, 58, 63, 26, 34, 98, 97, 19, 42, 54, 27, 75, 81, 94, 86, 49, 6, 31, 30, 60, 99, 61, 63, 25, 20, 81, 42, 3, 11, 81, 27, 84, 90, 41, 9, 24, 39, 58, 94, 32, 11, 21, 6, 91, 14, 92, 39, 71, 22, 68, 30, 72, 81, 44, 96, 100, 25, 89, 55, 87, 70, 33, 70, 11, 74, 31, 34, 64, 88, 80, 95, 50, 100, 52, 40, 65, 43, 31, 87, 16, 50, 16, 87, 82, 12, 35, 34, 88, 23, 88, 74, 44, 20, 43, 55, 45, 25, 40, 60, 64, 19, 54, 13, 70, 6, 5, 34, 100, 35, 20, 16, 36, 88, 54, 70, 51, 88, 3, 38, 63, 90, 11, 6, 61, 5, 12, 58, 30, 4, 17, 93, 22, 23, 6, 44, 80, 62, 29, 79, 48, 1, 46, 83, 88, 100, 52, 90, 87, 54, 27, 49, 95, 37, 7, 8, 93, 18, 65, 22, 21, 81, 67, 95, 55, 24, 38, 34, 85, 18, 13, 32, 18, 10, 66, 57, 9, 70, 46, 96, 23, 72, 96, 70, 60, 2, 77, 53, 72, 41, 26, 44, 73, 92, 90, 28, 67, 79, 13, 51, 97, 25, 34, 14, 87, 100, 71, 95, 69, 16, 42, 43, 40, 38, 64, 99, 91, 40, 3, 14, 32, 29, 58, 5, 72, 47, 84, 39, 26, 96, 41, 22, 73, 27, 35, 59, 26, 57, 53, 46, 73, 47, 40, 12, 84, 4, 62, 26, 43, 17, 40, 75, 45, 97, 31, 68, 95, 14, 58, 20, 61, 51, 93, 33, 77, 80, 91, 54, 36, 96, 99, 8, 42, 38, 71, 77, 41, 85, 2, 84, 1, 93, 10, 97, 41, 40, 64, 36, 5, 74, 7, 65, 24, 52, 50, 52, 31, 40, 5, 66, 87, 3, 26, 80, 92, 48, 8, 85, 32, 62, 20, 32, 54, 29, 28, 95, 20, 44, 82, 24, 69, 88, 40, 44, 39, 89, 95, 21, 81, 99, 87, 19, 53, 64, 99, 96, 11, 6, 80, 43, 67, 99, 26, 73, 79, 54, 67, 98, 49, 48, 73, 17, 87, 13, 60, 78, 1, 54, 98, 33, 4, 36, 52, 8, 99, 50, 55, 62, 7, 35, 4, 26, 85, 29, 98, 64, 34, 16, 61, 82, 15, 86, 98, 1, 98, 9, 30, 50, 14, 80, 35, 17, 15, 86, 76, 66, 87, 31, 27, 93, 17, 30, 70, 53, 10, 67, 16, 96, 34, 29, 77, 48, 14, 27, 1, 63, 87, 30, 64, 1, 9, 98, 17, 76, 83, 45, 41, 21, 27, 19, 66, 95, 100, 35, 47, 9, 54, 63, 4, 87, 43, 33, 35, 8, 11, 35, 70, 97, 16, 85, 97, 25, 83, 66, 52, 17, 62, 44, 38, 88, 62, 3, 82, 61, 89, 80, 21, 42, 94, 25, 29, 36, 9, 63, 43, 71, 97, 64, 67, 12, 1, 16, 88, 35, 33, 91, 51, 94, 34, 40, 81, 95, 94, 14, 55, 83, 45, 76, 24, 39, 52, 52, 74, 12, 66, 69, 82, 14, 84, 100, 78, 36, 15, 65, 70, 47, 8, 73, 92, 41, 12, 24, 88, 58, 37, 94, 40, 82, 21, 15, 72, 72, 19, 97, 35, 84, 65, 68, 98, 1, 68, 75, 36, 34, 91, 58, 33, 50, 30, 24, 91, 93, 48, 30, 50, 36, 23, 41, 69, 44, 56, 40, 67, 26, 37, 54, 61, 53, 21, 58, 5, 88, 84, 41, 22, 27, 98, 6, 28, 79, 29, 70, 71, 28, 99, 21, 64, 22, 61, 84, 17, 68, 24, 83, 93, 12, 36, 54, 64, 9, 63, 69, 96, 99, 61, 69, 77, 10, 74, 4, 88, 55, 74, 58, 82, 24, 30, 97, 45, 43, 81, 13, 10, 56, 48, 55, 67, 35, 60, 82, 43, 74, 2, 39, 72, 14, 59, 100, 23, 85, 56, 62, 91, 81, 72, 24, 4, 1, 21, 1, 43, 53, 13, 5, 8, 60, 59, 26, 95, 18, 59, 37, 91, 61, 27, 15, 74, 38, 66, 49, 22, 21, 10, 64, 1, 33, 87, 5, 34, 59, 57, 28, 11, 69, 32, 70, 29, 42, 47, 75, 59, 6, 11, 2, 66, 90, 68, 91, 27, 33, 39, 100, 6, 1, 63, 58, 33, 49, 62, 18, 8, 70, 98, 70, 39, 29, 40, 19, 71, 86, 93, 81, 43, 55, 34, 8, 44, 1, 51, 22, 86, 89, 21, 91, 41, 35, 48, 26, 84, 62, 95, 43, 31, 92, 64, 21, 21, 55, 39, 43, 93, 31, 23, 35, 86, 9, 95, 81, 9, 45, 3, 46, 85, 23, 88, 26, 58, 36, 3, 93, 49, 97, 87, 31, 41, 50, 52, 13, 57, 90, 55, 49, 73, 29, 83, 58, 89, 77, 38, 98, 21, 40, 95, 6, 15, 83, 83, 24, 70, 37, 16, 18, 85, 54, 100, 25, 55, 51, 37, 11, 93, 43, 59, 65, 24, 42, 22, 12, 70, 11, 61, 91, 3, 56, 48, 17, 90, 82, 40, 59, 18, 7, 76, 2, 12, 75, 79, 66, 78, 67, 77, 70, 62, 35, 34, 37, 28, 7, 100, 98, 17, 61, 40, 71, 68, 87, 87, 9, 68, 78, 67, 37, 36, 94, 38, 47, 20, 68, 13, 97, 35, 41, 18, 96, 75, 51, 32, 3, 9, 31, 52, 26, 43, 91, 48, 62, 77, 35, 70, 96, 64, 36, 32, 52, 81, 21, 98, 1, 89, 62, 97, 75, 2, 15, 70, 29, 17, 53, 83, 26, 83, 34, 3, 78, 24, 50, 91, 52, 36, 61, 47, 100, 48, 30, 3, 29, 50, 100, 29, 90, 14, 77, 64, 67, 91, 85, 95, 60, 37, 77, 85, 72, 10, 39, 1, 85, 40, 91, 36, 76, 51, 82, 27, 51, 63, 29, 79, 65, 80, 59, 54, 45, 35, 70, 12, 78, 6, 58, 37, 43, 35, 73, 66, 96, 11, 66, 33, 50, 8, 68, 77, 59, 2, 3, 61, 64, 83, 39, 28, 15, 97, 34, 59, 31, 55, 70, 8, 60, 28, 96, 2, 14, 68, 19, 61, 30, 36, 93, 32, 44, 13, 8, 54, 14, 63, 14, 29, 97, 52, 57, 11, 100, 42, 70, 82, 96, 91, 90, 55, 70, 37, 9, 83, 5, 27, 96, 34, 15, 88, 65, 58, 52, 25, 11, 65, 39, 24, 94, 35, 27, 2, 46, 26, 95, 67, 7, 90, 57, 48, 96, 27, 85, 4, 61, 41, 83, 56, 74, 49, 96, 91, 6, 47, 67, 68, 64, 5, 91, 9, 91, 69, 62, 36, 94, 56, 2, 52, 45, 11, 52, 92, 89, 36, 48, 49, 76, 82, 57, 1, 30, 52, 43, 35, 50, 61, 2, 65, 65, 44, 73, 56, 12, 34, 43, 57, 41, 97, 60, 37, 59, 11, 29, 47, 98, 76, 95, 25, 57, 51, 26, 86, 54, 20, 72, 56, 81, 25, 20, 97, 68, 45, 4, 31, 30, 47, 87, 71, 95, 46, 59, 53, 9, 87, 99, 6, 14, 45, 31, 22, 48, 8, 59, 1, 79, 30, 8, 59, 54, 80, 8, 73, 76, 11, 3, 5, 9, 41, 27, 3, 87, 86, 7, 47, 24, 5, 52, 38, 2, 34, 11, 49, 93, 70, 1, 72, 51, 9, 82, 57, 88, 89, 29, 63, 52, 84, 19, 60, 24, 46, 15, 62, 83, 73, 8, 58, 30, 12, 95, 31, 45, 58, 79, 38, 27, 79, 61, 29, 87, 42, 85, 26, 83, 66, 40, 34, 49, 59, 45, 24, 56, 11, 86, 90, 84, 45, 47, 13, 56, 94, 43, 1, 51, 21, 90, 29, 51, 50, 57, 38, 43, 42, 15, 25, 59, 55, 10, 59, 65, 55, 82, 20, 17, 19, 61, 100, 64, 7, 64, 19, 100, 6, 71, 2, 78, 12, 30, 29, 13, 87, 18, 56, 80, 84, 80, 90, 38, 90, 48, 54, 96, 81, 25, 12, 100, 85, 12, 15, 44, 27, 85, 43, 33, 8, 97, 62, 19, 26, 42, 32, 64, 11, 87, 95, 95, 18, 36, 84, 59, 83, 38, 54, 16, 14, 18, 15, 99, 81, 81, 42, 7, 65, 36, 39, 24, 32, 53, 43, 10, 46, 26, 25, 57, 64, 72, 3, 81, 7, 86, 92, 90, 75, 45, 57, 89, 62, 71, 39, 42, 3, 80, 49, 19, 67, 39, 43, 51, 43, 85, 60, 89, 62, 36, 97, 25, 7, 99, 57, 14, 36, 48, 55, 63, 45, 11, 3, 58, 33, 41, 52, 87, 72, 100, 5, 90, 90, 47, 40, 85, 83, 51, 73, 44, 87, 69, 20, 93, 19, 77, 58, 54, 76, 64, 16, 20, 26, 70, 78, 10, 10, 81, 96, 33, 32, 1, 23, 21, 47, 14, 57, 30, 65, 29, 25, 51, 49, 45, 95, 19, 73, 5, 73, 48, 68, 40, 20, 94, 10, 49, 55, 71, 29, 51, 56, 60, 51, 30, 32, 49, 43, 89, 78, 7, 69, 55, 9, 70, 99, 4, 88, 71, 8, 12, 70, 27, 4, 41, 72, 65, 89, 27, 87, 17, 77, 42, 28, 79, 23, 60, 27, 66, 100, 5, 24, 68, 59, 33, 89, 9, 88, 77, 31, 95, 40, 52, 73, 43, 93, 45, 7, 81, 23, 94, 50, 99, 87, 29, 77, 10, 88, 3, 27, 39, 59, 50, 59, 69, 82, 47, 29, 21, 75, 59, 15, 15, 63, 40, 57, 55, 36, 16, 35, 58, 61, 36, 8, 47, 65, 84, 56, 4, 38, 34, 43, 49, 84, 1, 69, 17, 47, 50, 38, 22, 60, 4, 88, 22, 43, 44, 76, 78, 11, 63, 87, 71, 98, 94, 18, 62, 29, 25, 18, 67, 59, 60, 67, 94, 60, 87, 10, 58, 36, 47, 31, 96, 3, 18, 17, 97, 14, 93, 75, 24, 7, 61, 95, 4, 7, 64, 18, 35, 40, 35, 53, 50, 94, 19, 43, 5, 6, 5, 14, 93, 3, 45, 88, 5, 62, 57, 2, 27, 49, 28, 51, 55, 40, 97, 10, 46, 12, 27, 81, 3, 13, 33, 53, 58, 4, 47, 62, 61, 51, 28, 53, 54, 72, 41, 58, 85, 49, 11, 12, 49, 38, 14, 55, 78, 62, 64, 75, 25, 43, 55, 27, 55, 40, 79, 65, 43, 26, 78, 3, 28, 5, 55, 81, 76, 47, 91, 61, 95, 1, 24, 43, 91, 89, 97, 20, 50, 13, 94, 26, 55, 49, 52, 61, 88, 83, 25, 30, 60, 3, 84, 87, 7, 38, 68, 35, 37, 10, 47, 31, 10, 70, 26, 52, 58, 74, 71, 59, 86, 65, 84, 40, 65, 87, 53, 4, 69, 77, 33, 28, 31, 68, 67, 38, 5, 34, 72, 93, 95, 18, 76, 56, 39, 1, 8, 48, 74, 78, 58, 60, 94, 93, 51, 58, 79, 3, 61, 48, 32, 45, 27, 62, 12, 93, 99, 69, 78, 22, 61, 72, 91, 88, 80, 81, 88, 87, 80, 14, 64, 37, 25, 10, 29, 75, 67, 60, 30, 28, 59, 61, 72, 85, 74, 36, 30, 25, 4, 59, 46, 16, 83, 89, 4, 62, 69, 43, 48, 1, 56, 63, 37, 32, 72, 18, 59, 39, 77, 88, 18, 35, 100, 41, 71, 73, 28, 52, 97, 83, 11, 95, 99, 93, 83, 54, 54, 3, 48, 53, 55, 56, 15, 92, 87, 39, 61, 45, 29, 89, 84, 46, 23, 35, 38, 45, 8, 66, 97, 56, 48, 7, 50, 98, 51, 84, 3, 4, 39, 51, 56, 93, 6, 22, 36, 92, 12, 96, 89, 40, 84, 24, 37, 58, 59, 27, 3, 66, 92, 51, 21, 91, 9, 23, 89, 59, 58, 91, 62, 96, 41, 69, 41, 98, 42, 76, 42, 54, 24, 30, 45, 59, 53, 34, 17, 11, 60, 71, 28, 51, 73, 1, 41, 81, 75, 81, 39, 32, 72, 100, 80, 64, 20, 20, 62, 13, 47, 55, 18, 70, 84, 63, 29, 88, 96, 97, 51, 55, 67, 30, 57, 39, 30, 97, 19, 56, 30, 9, 88, 1, 8, 19, 16, 79, 38, 29, 91, 36, 83, 9, 6, 18, 23, 86, 58, 70, 82, 8, 24, 100, 37, 80, 90, 19, 28, 8, 74, 57, 16, 13, 9, 75, 31, 77, 5, 20, 57, 47, 56, 40, 7, 13, 9, 29, 98, 66, 98, 31, 73, 73, 30, 62, 4, 19, 32, 84, 78, 57, 92, 45, 70, 53, 71, 52, 29, 27, 24, 85, 73, 31, 76, 80, 95, 85, 60, 92, 50, 10, 74, 75, 82, 3, 36, 38, 73, 67, 21, 2, 75, 12, 46, 44, 16, 68, 48, 44, 94, 23, 81, 18, 5, 8, 97, 99, 92, 9, 90, 94, 18, 63, 68, 51, 17, 55, 88, 41, 73, 60, 42, 47, 24, 39, 43, 39, 6, 90, 83, 51, 64, 15, 68, 68, 22, 17, 66, 66, 25, 7, 59, 42, 21, 26, 92, 89, 80, 32, 29, 52, 91, 70, 98, 14, 60, 92, 53, 17, 33, 87, 67, 96, 1, 86, 15, 74, 2, 80, 39, 78, 38, 97, 19, 58, 74, 63, 46, 5, 94, 26, 8, 36, 47, 6, 50, 6, 49, 54, 74, 82, 40, 40, 77, 92, 78, 92, 65, 31, 23, 56, 9, 61, 52, 27, 70, 78, 41, 16, 82, 34, 93, 90, 70, 40, 47, 71, 97, 95, 24, 71, 76, 15, 62, 5, 6, 39, 96, 22, 70, 70, 77, 78, 30, 81, 56, 100, 58, 97, 67, 39, 82, 59, 80, 3, 50, 26, 25, 47, 73, 48, 17, 48, 62, 78, 52, 19, 17, 99, 41, 38, 69, 17, 67, 50, 97, 22, 49, 6, 70, 67, 97, 52, 78, 76, 6, 27, 54, 31, 73, 26, 30, 89, 73, 44, 19, 77, 62, 87, 27, 2, 24, 95, 71, 90, 97, 19, 63, 97, 25, 33, 64, 21, 36, 41, 48, 93, 19, 1, 23, 44, 26, 5, 84, 51, 48, 2, 79, 9, 88, 5, 63, 63, 52, 33, 52, 48, 3, 67, 44, 27, 51, 59, 99, 38, 51, 99, 30, 70, 99, 5, 13, 77, 9, 48, 79, 56, 50, 9, 64, 37, 65, 78, 52, 16, 10, 55, 15, 13, 21, 11, 91, 71, 69, 42, 8, 72, 40, 90, 41, 90, 94, 5, 18, 54, 52, 48, 9, 53, 56, 24, 42, 73, 2, 93, 40, 63, 47, 55, 27, 20, 17, 70, 90, 85, 11, 50, 56, 2, 91, 48, 43, 84, 4, 13, 89, 8, 12, 97, 12, 20, 72, 53, 92, 25, 97, 31, 88, 44, 37, 66, 63, 53, 35, 4, 90, 97, 5, 97, 98, 95, 97, 93, 30, 100, 57, 18, 59, 68, 66, 23, 87, 38, 75, 78, 62, 72, 9, 1, 67, 97, 67, 81, 50, 1, 36, 39, 98, 41, 35, 47, 87, 31, 91, 17, 83, 47, 86, 93, 15, 52, 15, 53, 41, 42, 31, 54, 65, 91, 55, 31, 87, 73, 63, 88, 73, 98, 26, 22, 90, 61, 21, 77, 43, 11, 93, 25, 10, 30, 70, 76, 81, 84, 28, 21, 25, 10, 75, 89, 100, 81, 71, 39, 53, 33, 26, 77, 83, 52, 99, 72, 64, 71, 48, 58, 33, 92, 35, 42, 22, 4, 17, 54, 39, 97, 27, 64, 6, 53, 4, 58, 33, 27, 96, 37, 59, 21, 13, 93, 24, 63, 65, 39, 33, 64, 49, 66, 8, 83, 59, 29, 38, 28, 34, 76, 24, 60, 91, 29, 12, 47, 86, 96, 73, 33, 32, 83, 6, 97, 76, 29, 59, 40, 20, 44, 55, 68, 61, 62, 2, 71, 42, 39, 98, 76, 14, 21, 87, 57, 2, 99, 3, 39, 46, 75, 24, 30, 57, 29, 26, 32, 9, 36, 23, 80, 31, 78, 47, 91, 91, 48, 14, 33, 38, 11, 8, 52, 84, 94, 8, 37, 44, 10, 27, 90, 36, 50, 19, 92, 78, 96, 24, 39, 31, 98, 18, 14, 75, 17, 56, 66, 16, 69, 50, 54, 80, 57, 57, 15, 2, 16, 51, 98, 77, 77, 39, 12, 27, 9, 3, 56, 4, 78, 94, 86, 76, 12, 99, 2, 28, 7, 19, 43, 75, 68, 48, 54, 24, 4, 68, 78, 19, 70, 27, 95, 47, 65, 6, 25, 73, 61, 80, 28, 38, 26, 65, 65, 37, 16, 67, 16, 22, 85, 10, 96, 53, 58, 2, 28, 61, 21, 57, 32, 91, 83, 26, 89, 47, 84, 13, 71, 44, 92, 50, 33, 17, 67, 98, 5, 82, 64, 72, 55, 100, 82, 2, 52, 91, 3, 32, 3, 76, 88, 34, 66, 71, 12, 6, 69, 47, 18, 92, 90, 61, 93, 74, 30, 59, 71, 34, 92, 86, 58, 98, 38, 91, 100, 89, 81, 54, 72, 35, 29, 60, 21, 46, 82, 84, 51, 2, 30, 20, 93, 71, 81, 38, 44, 10, 48, 67, 95, 40, 4, 4, 89, 41, 94, 88, 82, 26, 42, 53, 13, 22, 64, 33, 68, 45, 16, 70, 47, 45, 90, 91, 15, 22, 28, 10, 31, 76, 76, 77, 67, 32, 81, 55, 72, 26, 43, 5, 4, 36, 58, 16, 57, 73, 48, 76, 18, 15, 46, 64, 59, 87, 54, 25, 8, 82, 34, 90, 9, 62, 18, 75, 93, 50, 29, 16, 76, 23, 73, 31, 58, 82, 46, 67, 54, 93, 42, 71, 59, 39, 86, 17, 25, 40, 93, 84, 73, 78, 73, 33, 39, 43, 7, 83, 92, 87, 51, 19, 10, 23, 49, 19, 56, 46, 85, 9, 90, 79, 80, 48, 17, 65, 16, 94, 56, 8, 77, 80, 86, 2, 12, 76, 96, 70, 11, 87, 57, 13, 58, 18, 87, 58, 36, 42, 4, 73, 50, 93, 51, 81, 41, 19, 98, 56, 12, 5, 16, 41, 85, 1, 94, 48, 28, 89, 18, 38, 75, 74, 2, 84, 91, 88, 42, 78, 29, 97, 2, 31, 89, 4, 11, 81, 23, 60, 37, 86, 65, 4, 78, 1, 56, 71, 48, 83, 59, 65, 73, 86, 38, 74, 69, 80, 62, 62, 10, 90, 58, 11, 20, 47, 67, 83, 79, 89, 42, 67, 26, 58, 70, 4, 58, 25, 26, 6, 8, 85, 70, 32, 70, 60, 5, 90, 91, 66, 52, 52, 8, 9, 63, 79, 7, 29, 61, 86, 69, 55, 52, 46, 12, 22, 1, 70, 46, 27, 27, 5, 63, 96, 36, 32, 7, 41, 21, 50, 58, 24, 1, 17, 33, 15, 96, 91, 43, 8, 76, 63, 14, 80, 61, 78, 1, 61, 47, 98, 39, 25, 55, 1, 72, 90, 32, 79, 82, 5, 80, 92, 28, 80, 8, 12, 95, 55, 3, 89, 15, 30, 4, 80, 9, 64, 57, 61, 76, 55, 11, 15, 79, 65, 15, 51, 54, 99, 81, 88, 55, 60, 79, 34, 39, 38, 46, 85, 45, 100, 74, 59, 29, 29, 38, 90, 92, 47, 50, 19, 1, 60, 33, 80, 24, 100, 30, 30, 98, 10, 17, 4, 21, 47, 37, 59, 84, 34, 96, 28, 33, 21, 38, 14, 49, 28, 3, 92, 74, 4, 10, 26, 64, 43, 5, 39, 94, 86, 20, 43, 47, 88, 46, 67, 34, 82, 78, 70, 16, 73, 49, 100, 93, 39, 13, 41, 66, 15, 32, 91, 71, 93, 16, 34, 87, 73, 24, 80, 58, 96, 22, 5, 83, 19, 23, 69, 53, 100, 90, 20, 72, 90, 19, 16, 28, 84, 56, 45, 50, 39, 35, 20, 84, 3, 5, 70, 75, 29, 50, 84, 24, 23, 40, 58, 94, 63, 26, 46, 14, 67, 65, 38, 57, 35, 53, 84, 18, 61, 81, 68, 51, 67, 87, 34, 69, 92, 4, 95, 72, 5, 79, 47, 79, 18, 56, 72, 80, 34, 69, 94, 100, 85, 83, 56, 20, 35, 92, 89, 95, 72, 8, 98, 90, 95, 31, 59, 38, 86, 5, 61, 90, 83, 59, 21, 1, 14, 92, 32, 47, 13, 77, 47, 97, 59, 54, 68, 46, 45, 57, 92, 68, 64, 89, 10, 10, 20, 20, 99, 57, 24, 59, 99, 7, 17, 19, 59, 83, 62, 42, 29, 74, 19, 27, 71, 29, 81, 38, 74, 77, 46, 66, 97, 10, 54, 6, 71, 25, 25, 70, 34, 48, 28, 32, 6, 97, 50, 64, 79, 11, 58, 59, 37, 76, 86, 59, 4, 66, 48, 30, 42, 94, 95, 38, 55, 100, 95, 25, 77, 19, 46, 10, 19, 26, 93, 24, 22, 42, 40, 52, 4, 97, 10, 92, 24, 95, 50, 79, 12, 98, 60, 54, 91, 54, 43, 97, 6, 90, 73, 34, 8, 19, 95, 78, 44, 87, 54, 17, 80, 93, 68, 83, 41, 29, 75, 16, 24, 76, 46, 35, 73, 6, 40, 15, 11, 35, 11, 16, 24, 36, 1, 83, 54, 95, 61, 97, 33, 14, 13, 12, 58, 32, 95, 50, 60, 21, 17, 35, 96, 62, 22, 21, 67, 13, 87, 78, 47, 50, 45, 22, 85, 46, 57, 38, 92, 17, 86, 25, 82, 50, 88, 91, 81, 82, 92, 92, 54, 8, 27, 2, 69, 48, 74, 88, 12, 60, 65, 11, 9, 61, 32, 45, 58, 88, 34, 50, 56, 19, 26, 89, 68, 13, 79, 100, 47, 70, 92, 52, 29, 70, 5, 98, 69, 78, 85, 80, 90, 1, 90, 50, 61, 74, 95, 19, 13, 28, 20, 21, 47, 97, 9, 66, 61, 40, 18, 7, 61, 9, 11, 90, 30, 15, 39, 98, 93, 75, 29, 82, 75, 19, 31, 87, 44, 77, 57, 56, 5, 28, 28, 3, 76, 37, 20, 37, 28, 37, 95, 88, 45, 5, 77, 74, 20, 67, 23, 64, 41, 52, 97, 67, 22, 79, 6, 65, 56, 62, 72, 12, 42, 100, 14, 17, 88, 33, 5, 15, 22, 100, 2, 66, 56, 31, 92, 27, 97, 66, 90, 38, 17, 38, 4, 90, 17, 9, 6, 24, 23, 78, 87, 16, 29, 52, 84, 16, 84, 89, 30, 57, 40, 83, 23, 95, 13, 66, 22, 10, 83, 63, 47, 52, 1, 2, 41, 69, 63, 47, 44, 37, 76, 30, 4, 4, 81, 87, 19, 16, 27, 100, 73, 66, 82, 47, 61, 95, 64, 82, 56, 46, 44, 54, 97, 96, 55, 90, 64, 69, 36, 59, 57, 11, 88, 60, 66, 68, 47, 84, 84, 73, 35, 8, 39, 16, 54, 51, 10, 17, 84, 65, 62, 79, 70, 11, 75, 25, 100, 90, 45, 35, 49, 2, 97, 36, 61, 62, 56, 59, 97, 91, 32, 31, 98, 22, 98, 51, 24, 60, 19, 7, 76, 32, 85, 46, 42, 11, 70, 41, 1, 66, 27, 1, 67, 75, 36, 28, 88, 43, 38, 84, 33, 69, 66, 30, 42, 64, 32, 65, 23, 50, 71, 50, 82, 8, 95, 23, 18, 16, 16, 18, 82, 94, 18, 48, 69, 6, 27, 56, 48, 65, 92, 33, 85, 57, 62, 79, 72, 46, 43, 46, 95, 66, 96, 28, 73, 90, 3, 90, 6, 18, 60, 87, 11, 29, 86, 31, 86, 65, 87, 86, 81, 78, 18, 65, 86, 31, 43, 10, 76, 38, 55, 23, 3, 2, 50, 27, 92, 52, 68, 49, 21, 27, 87, 84, 8, 72, 14, 93, 88, 52, 30, 68, 81, 47, 33, 67, 78, 27, 28, 5, 64, 82, 27, 18, 36, 29, 44, 79, 32, 12, 27, 5, 90, 13, 88, 97, 36, 53, 42, 76, 5, 71, 43, 85, 18, 75, 3, 47, 54, 30, 51, 17, 64, 30, 87, 99, 58, 30, 77, 89, 41, 55, 93, 31, 19, 32, 79, 6, 85, 20, 81, 41, 43, 24, 77, 60, 50, 32, 58, 3, 61, 60, 72, 76, 89, 58, 74, 46, 39, 2, 87, 32, 56, 31, 14, 74, 63, 92, 80, 99, 64, 60, 91, 6, 83, 67, 17, 85, 98, 74, 87, 11, 85, 10, 86, 74, 19, 12, 71, 58, 13, 9, 89, 69, 40, 2, 94, 54, 45, 25, 52, 60, 85, 94, 65, 19, 60, 33, 3, 10, 58, 42, 20, 43, 3, 57, 16, 22, 68, 38, 31, 33, 47, 19, 53, 86, 72, 46, 91, 68, 71, 42, 28, 7, 87, 44, 77, 46, 77, 80, 7, 86, 73, 78, 28, 75, 87, 95, 48, 54, 33, 78, 38, 31, 48, 90, 16, 71, 88, 6, 39, 10, 99, 18, 16, 85, 13, 92, 82, 41, 23, 41, 27, 47, 18, 6, 22, 56, 1, 69, 10, 85, 99, 99, 15, 46, 89, 82, 17, 28, 39, 7, 37, 89, 76, 4, 25, 88, 47, 58, 29, 70, 98, 55, 68, 68, 12, 89, 23, 12, 10, 84, 48, 8, 83, 14, 5, 23, 95, 21, 2, 85, 79, 38, 73, 54, 93, 97, 42, 39, 55, 22, 60, 52, 28, 28, 71, 39, 68, 94, 3, 29, 29, 50, 36, 11, 16, 93, 85, 10, 65, 86, 47, 44, 75, 19, 49, 67, 16, 42, 58, 22, 63, 69, 25, 42, 96, 96, 81, 16, 41, 83, 44, 69, 84, 32, 32, 99, 24, 68, 61, 40, 54, 7, 83, 28, 25, 32, 47, 92, 25, 4, 65, 88, 24, 90, 29, 72, 37, 61, 87, 77, 43, 82, 97, 79, 65, 80, 77, 40, 48, 37, 80, 53, 95, 62, 32, 20, 45, 78, 63, 70, 33, 28, 9, 57, 69, 89, 28, 5, 50, 66, 33, 44, 47, 81, 74, 12, 61, 51, 51, 60, 39, 30, 12, 34, 44, 95, 5, 40, 25, 19, 61, 57, 98, 69, 65, 66, 10, 44, 70, 59, 61, 2, 54, 60, 35, 28, 23, 47, 30, 25, 6, 20, 55, 69, 5, 50, 63, 61, 41, 87, 80, 2, 96, 77, 70, 12, 43, 31, 8, 64, 41, 68, 18, 95, 79, 52, 74, 1, 98, 3, 26, 3, 74, 32, 23, 79, 81, 37, 39, 21, 24, 18, 22, 71, 47, 44, 34, 41, 26, 41, 4, 67, 61, 21, 13, 39, 24, 86, 40, 21, 40, 17, 75, 13, 48, 97, 91, 28, 86, 82, 100, 61, 51, 74, 31, 97, 69, 16, 37, 94, 57, 93, 12, 69, 65, 24, 59, 89, 9, 50, 9, 100, 66, 36, 65, 13, 84, 55, 92, 69, 88, 44, 29, 39, 17, 11, 35, 37, 27, 24, 82, 35, 16, 94, 3, 80, 17, 61, 68, 78, 63, 29, 77, 28, 64, 41, 41, 99, 48, 32, 68, 35, 75, 96, 25, 43, 59, 60, 31, 85, 35, 13, 19, 50, 58, 73, 81, 74, 85, 1, 3, 47, 81, 32, 75, 96, 24, 67, 94, 23, 98, 61, 58, 25, 9, 82, 19, 67, 93, 50, 3, 27, 14, 73, 28, 71, 45, 61, 96, 29, 61, 51, 28, 41, 82, 54, 88, 5, 20, 81, 28, 69, 94, 37, 45, 54, 70, 64, 72, 15, 65, 74, 93, 30, 46, 21, 52, 42, 81, 99, 22, 93, 49, 49, 85, 30, 2, 72, 87, 73, 4, 66, 42, 97, 54, 86, 50, 75, 1, 73, 89, 65, 46, 82, 94, 43, 54, 97, 84, 86, 96, 58, 78, 44, 6, 62, 26, 60, 85, 64, 32, 88, 29, 25, 37, 34, 11, 38, 8, 11, 11, 97, 28, 8, 30, 73, 3, 35, 70, 38, 20, 65, 95, 49, 8, 53, 62, 33, 12, 46, 96, 95, 85, 76, 20, 21, 9, 30, 59, 69, 92, 21, 65, 19, 28, 46, 92, 30, 80, 13, 68, 51, 77, 62, 99, 84, 66, 60, 69, 77, 5, 16, 24, 41, 44, 43, 62, 4, 24, 20, 72, 67, 40, 88, 86, 19, 33, 29, 49, 64, 41, 68, 14, 69, 81, 64, 4, 47, 23, 72, 75, 79, 40, 98, 20, 83, 40, 33, 38, 15, 52, 10, 82, 43, 97, 19, 13, 82, 99, 13, 45, 91, 80, 11, 59, 13, 26, 14, 11, 49, 86, 85, 79, 77, 83, 50, 11, 74, 82, 48, 41, 85, 57, 74, 79, 54, 92, 92, 87, 42, 4, 83, 32, 36, 45, 42, 48, 71, 55, 58, 71, 92, 94, 49, 20, 76, 99, 30, 2, 80, 78, 94, 17, 86, 67, 95, 91, 58, 86, 77, 51, 90, 60, 34, 77, 4, 27, 24, 74, 33, 33, 44, 25, 26, 45, 44, 54, 95, 26, 7, 26, 55, 100, 42, 40, 66, 37, 31, 75, 22, 59, 25, 63, 70, 10, 39, 74, 36, 14, 99, 68, 46, 95, 44, 24, 91, 88, 29, 85, 65, 35, 10, 19, 86, 52, 58, 3, 88, 40, 77, 61, 99, 53, 24, 20, 62, 62, 93, 49, 76, 44, 16, 73, 90, 60, 48, 80, 99, 76, 16, 63, 62, 25, 33, 47, 28, 90, 49, 67, 82, 77, 28, 32, 81, 51, 51, 94, 64, 96, 42, 91, 91, 10, 16, 80, 69, 63, 11, 19, 91, 26, 81, 52, 2, 13, 99, 82, 54, 99, 48, 87, 28, 75, 18, 8, 77, 21, 2, 93, 16, 95, 83, 6, 4, 50, 37, 24, 13, 99, 42, 3, 76, 74, 6, 29, 38, 4, 10, 92, 55, 58, 78, 82, 84, 48, 41, 61, 68, 94, 53, 35, 41, 87, 92, 44, 37, 28, 68, 1, 26, 61, 55, 53, 35, 60, 81, 72, 16, 91, 15, 22, 100, 45, 55, 83, 92, 95, 43, 11, 41, 47, 45, 81, 86, 36, 76, 74, 15, 43, 74, 92, 56, 28, 44, 90, 39, 24, 61, 54, 66, 28, 27, 65, 72, 81, 48, 63, 76, 42, 73, 68, 41, 69, 48, 26, 4, 23, 99, 70, 18, 24, 61, 73, 3, 56, 14, 41, 79, 26, 47, 97, 53, 73, 61, 24, 54, 8, 38, 81, 2, 62, 48, 42, 30, 47, 67, 85, 21, 17, 54, 90, 40, 66, 14, 42, 21, 27, 82, 52, 5, 80, 48, 57, 53, 8, 33, 58, 68, 70, 90, 69, 32, 37, 10, 61, 35, 28, 98, 55, 44, 51, 45, 83, 69, 58, 24, 89, 37, 57, 92, 41, 37, 39, 97, 41, 99, 29, 98, 66, 51, 39, 34, 82, 27, 95, 94, 61, 22, 91, 67, 65, 94, 11, 99, 62, 21, 22, 2, 9, 30, 94, 49, 66, 32, 97, 58, 30, 78, 7, 47, 28, 45, 32, 61, 71, 26, 54, 31, 99, 45, 50, 15, 90, 12, 13, 51, 32, 86, 4, 40, 16, 97, 40, 33, 81, 37, 43, 62, 14, 49, 9, 93, 94, 92, 53, 16, 18, 6, 99, 68, 2, 48, 35, 91, 59, 47, 93, 43, 85, 97, 34, 52, 45, 74, 36, 25, 10, 78, 87, 75, 27, 47, 67, 72, 90, 19, 87, 59, 24, 37, 27, 78, 84, 61, 68, 95, 59, 13, 37, 43, 9, 70, 46, 53, 43, 82, 30, 4, 59, 68, 78, 37, 66, 96, 8, 55, 14, 47, 14, 90, 83, 40, 67, 19, 52, 86, 13, 10, 50, 1, 5, 58, 70, 50, 63, 65, 31, 92, 20, 42, 11, 50, 78, 76, 45, 38, 30, 11, 36, 43, 100, 70, 34, 18, 88, 85, 55, 52, 47, 5, 52, 51, 14, 74, 52, 76, 38, 35, 19, 57, 76, 29, 6, 5, 4, 3, 42, 86, 13, 77, 28, 12, 99, 14, 81, 86, 98, 87, 90, 96, 91, 41, 46, 57, 14, 98, 84, 3, 32, 3, 60, 59, 83, 17, 63, 39, 19, 5, 24, 31, 33, 3, 94, 83, 16, 26, 69, 66, 65, 58, 61, 7, 50, 7, 63, 16, 56, 47, 18, 39, 1, 77, 97, 83, 46, 11, 21, 16, 67, 44, 99, 52, 47, 44, 34, 62, 22, 2, 79, 86, 11, 40, 92, 13, 98, 55, 28, 53, 1, 45, 43, 1, 74, 91, 35, 71, 1, 56, 86, 68, 51, 84, 19, 97, 80, 52, 11, 1, 6, 89, 86, 68, 80, 77, 80, 77, 83, 59, 29, 35, 4, 23, 87, 29, 13, 22, 99, 14, 77, 36, 81, 79, 72, 99, 76, 51, 2, 38, 51, 7, 78, 88, 27, 58, 16, 6, 34, 99, 17, 15, 33, 20, 37, 20, 100, 50, 93, 50, 63, 21, 85, 95, 99, 56, 45, 26, 58, 46, 63, 8, 5, 93, 47, 31, 50, 63, 88, 35, 61, 4, 49, 45, 75, 38, 16, 74, 39, 8, 23, 53, 28, 60, 47, 27, 15, 43, 52, 25, 88, 67, 84, 44, 59, 31, 74, 60, 93, 14, 94, 5, 17, 95, 49, 92, 32, 17, 17, 70, 24, 92, 74, 4, 51, 20, 82, 17, 14, 85, 41, 1, 51, 25, 97, 61, 55, 22, 20, 99, 35, 66, 3, 52, 60, 3, 95, 43, 19, 11, 64, 95, 54, 37, 98, 4, 8, 79, 21, 21, 63, 13, 73, 66, 37, 69, 26, 43, 43, 98, 41, 77, 63, 95, 80, 74, 98, 26, 68, 68, 89, 31, 62, 42, 19, 11, 46, 26, 41, 18, 98, 4, 30, 70, 21, 67, 91, 98, 9, 33, 47, 2, 61, 61, 96, 41, 34, 45, 18, 1, 13, 6, 83, 26, 48, 1, 37, 45, 78, 77, 62, 75, 32, 91, 45, 4, 9, 87, 2, 70, 19, 100, 71, 79, 61, 66, 71, 46, 11, 89, 47, 23, 46, 81, 100, 93, 82, 88, 89, 11, 17, 50, 86, 48, 93, 82, 4, 53, 68, 57, 22, 38, 56, 92, 16, 16, 58, 39, 62, 68, 79, 60, 42, 24, 40, 93, 69, 73, 81, 57, 36, 97, 59, 21, 96, 3, 2, 99, 55, 21, 55, 77, 58, 63, 68, 73, 78, 77, 63, 91, 96, 41, 2, 89, 17, 94, 82, 85, 66, 62, 93, 1, 58, 3, 73, 5, 5, 26, 4, 60, 46, 10, 88, 3, 72, 55, 28, 2, 84, 42, 44, 79, 83, 46, 68, 51, 39, 49, 35, 56, 62, 79, 9, 71, 82, 81, 75, 38, 7, 30, 97, 4, 40, 36, 59, 63, 91, 86, 16, 26, 27, 60, 4, 61, 5, 23, 11, 43, 71, 97, 98, 84, 28, 6, 54, 9, 39, 29, 46, 97, 10, 95, 100, 49, 30, 58, 64, 72, 95, 79, 97, 74, 90, 53, 34, 94, 75, 97, 88, 98, 45, 38, 81, 72, 95, 35, 80, 33, 15, 78, 29, 24, 24, 81, 25, 5, 90, 88, 77, 85, 18, 25, 58, 8, 77, 43, 53, 4, 91, 41, 1, 36, 78, 81, 7, 72, 67, 39, 57, 81, 68, 37, 57, 91, 69, 81, 95, 59, 20, 23, 95, 89, 48, 4, 96, 76, 98, 1, 79, 89, 93, 31, 24, 70, 64, 82, 93, 30, 20, 1, 11, 87, 90, 67, 29, 58, 99, 24, 16, 18, 98, 62, 6, 97, 65, 54, 73, 63, 6, 3, 51, 98, 86, 26, 19, 49, 7, 63, 78, 79, 64, 40, 17, 53, 58, 46, 62, 56, 21, 78, 25, 18, 91, 83, 15, 56, 88, 39, 18, 93, 93, 20, 42, 78, 97, 60, 26, 3, 74, 56, 33, 37, 95, 50, 41, 5, 95, 3, 60, 15, 32, 37, 84, 22, 71, 98, 29, 58, 88, 98, 2, 81, 69, 95, 58, 65, 54, 36, 20, 27, 91, 52, 16, 37, 53, 8, 41, 47, 62, 53, 13, 45, 89, 97, 19, 11, 46, 47, 20, 34, 97, 21, 66, 65, 67, 23, 30, 20, 10, 49, 98, 52, 52, 65, 89, 5, 73, 29, 3, 86, 33, 16, 31, 73, 64, 49, 83, 61, 47, 2, 46, 43, 74, 11, 8, 40, 86, 37, 11, 95, 37, 61, 47, 40, 25, 87, 44, 49, 67, 99, 35, 100, 14, 17, 72, 29, 65, 7, 89, 11, 8, 35, 6, 34, 45, 13, 73, 82, 1, 36, 77, 89, 96, 75, 28, 72, 61, 24, 21, 27, 74, 7, 26, 87, 23, 50, 67, 39, 56, 7, 1, 15, 93, 6, 48, 90, 70, 73, 71, 22, 8, 47, 10, 55, 21, 90, 26, 33, 65, 98, 60, 38, 56, 85, 76, 30, 34, 94, 68, 41, 100, 21, 56, 93, 26, 3, 34, 48, 27, 4, 69, 34, 3, 31, 40, 75, 20, 18, 8, 36, 15, 67, 73, 23, 3, 100, 52, 89, 93, 72, 29, 92, 92, 36, 36, 69, 39, 69, 16, 65, 73, 37, 51, 27, 67, 42, 1, 38, 59, 8, 73, 26, 26, 45, 48, 29, 44, 51, 17, 36, 22, 97, 79, 13, 33, 15, 82, 23, 35, 49, 39, 59, 85, 41, 85, 3, 83, 86, 40, 93, 45, 12, 18, 71, 8, 17, 99, 3, 68, 67, 90, 41, 15, 69, 54, 47, 35, 87, 21, 69, 87, 60, 28, 24, 52, 64, 26, 34, 49, 66, 27, 94, 77, 96, 64, 85, 65, 14, 39, 32, 80, 29, 72, 46, 97, 77, 45, 31, 15, 65, 51, 54, 76, 30, 77, 28, 94, 54, 13, 94, 19, 91, 87, 48, 87, 2, 84, 51, 15, 22, 34, 46, 50, 57, 44, 46, 86, 88, 28, 52, 52, 31, 5, 80, 12, 33, 59, 5, 87, 71, 51, 5, 62, 37, 4, 100, 91, 87, 2, 57, 9, 87, 55, 10, 95, 98, 8, 80, 85, 87, 84, 88, 17, 40, 19, 29, 73, 77, 85, 59, 48, 35, 15, 61, 24, 71, 12, 66, 57, 65, 22, 17, 3, 28, 27, 97, 77, 86, 29, 13, 72, 12, 1, 41, 3, 71, 21, 75, 48, 5, 85, 47, 92, 52, 7, 67, 22, 70, 32, 30, 34, 5, 47, 36, 33, 25, 84, 9, 10, 12, 22, 33, 75, 74, 73, 78, 44, 93, 4, 43, 98, 89, 89, 41, 92, 95, 7, 13, 16, 90, 42, 49, 94, 40, 36, 78, 16, 20, 87, 77, 83, 60, 10, 58, 85, 82, 87, 28, 27, 90, 23, 76, 78, 11, 16, 69, 58, 74, 33, 73, 63, 27, 74, 8, 18, 9, 86, 34, 80, 24, 62, 15, 83, 71, 72, 67, 5, 10, 46, 31, 99, 68, 6, 29, 79, 73, 49, 88, 46, 82, 60, 60, 60, 85, 67, 77, 46, 52, 10, 25, 75, 72, 39, 57, 94, 62, 75, 50, 71, 73, 80, 22, 92, 37, 50, 22, 9, 98, 9, 6, 31, 69, 65, 90, 53, 32, 67, 98, 83, 28, 75, 10, 51, 65, 18, 97, 79, 93, 46, 1, 17, 26, 22, 8, 14, 23, 30, 75, 21, 38, 80, 3, 58, 97, 93, 63, 28, 59, 60, 62, 38, 86, 71, 89, 3, 41, 85, 81, 33, 30, 81, 1, 7, 55, 8, 73, 77, 37, 47, 49, 75, 78, 52, 32, 74, 96, 94, 1, 6, 6, 15, 43, 43, 37, 83, 45, 77, 19, 25, 61, 1, 58, 61, 7, 12, 69, 31, 40, 57, 77, 89, 31, 55, 92, 15, 28, 39, 60, 81, 44, 17, 47, 86, 60, 83, 21, 4, 12, 39, 81, 72, 39, 90, 85, 98, 1, 5, 28, 92, 61, 5, 32, 92, 11, 75, 58, 90, 13, 17, 70, 56, 86, 16, 94, 45, 51, 14, 100, 62, 4, 32, 33, 43, 21, 69, 92, 73, 73, 19, 17, 34, 75, 48, 77, 37, 23, 34, 27, 35, 2, 96, 43, 87, 64, 88, 83, 14, 1, 35, 75, 56, 18, 59, 50, 39, 28, 41, 63, 52, 60, 79, 85, 86, 79, 61, 23, 1, 46, 49, 87, 48, 96, 81, 86, 59, 68, 21, 24, 20, 7, 98, 76, 24, 9, 25, 14, 88, 66, 77, 39, 77, 7, 24, 14, 85, 36, 36, 37, 82, 36, 76, 81, 32, 56, 18, 42, 24, 38, 66, 95, 96, 63, 70, 20, 23, 47, 33, 10, 64, 61, 49, 40, 68, 24, 53, 4, 59, 41, 41, 40, 76, 68, 20, 7, 23, 38, 49, 98, 27, 66, 45, 23, 28, 14, 94, 3, 12, 26, 12, 75, 39, 12, 14, 58, 35, 19, 13, 94, 11, 5, 85, 86, 72, 57, 45, 47, 94, 45, 44, 72, 10, 40, 46, 89, 54, 39, 91, 65, 17, 55, 92, 55, 66, 5, 64, 1, 75, 76, 46, 85, 81, 30, 23, 52, 86, 67, 98, 31, 63, 94, 55, 72, 33, 100, 12, 38, 39, 3, 55, 7, 9, 46, 13, 74, 2, 76, 26, 29, 3, 71, 65, 83, 1, 87, 87, 38, 5, 36, 69, 67, 81, 23, 90, 66, 74, 2, 55, 64, 56, 9, 70, 64, 6, 82, 89, 60, 9, 15, 40, 64, 85, 4, 46, 37, 91, 84, 75, 47, 72, 95, 14, 52, 69, 55, 69, 94, 56, 24, 58, 63, 84, 79, 78, 42, 13, 67, 1, 21, 81, 40, 84, 17, 95, 82, 6, 85, 17, 80, 32, 88, 26, 97, 92, 46, 51, 60, 39, 59, 83, 96, 73, 67, 75, 51, 8, 87, 69, 60, 59, 1, 51, 95, 17, 45, 28, 74, 82, 44, 53, 65, 32, 30, 13, 23, 75, 63, 82, 14, 73, 17, 9, 46, 35, 35, 48, 94, 73, 16, 53, 32, 16, 55, 78, 84, 99, 5, 58, 32, 48, 62, 96, 31, 92, 60, 5, 18, 23, 39, 31, 47, 55, 92, 44, 41, 78, 91, 34, 51, 6, 38, 34, 73, 92, 11, 9, 42, 67, 18, 26, 66, 31, 73, 97, 74, 33, 1, 92, 7, 91, 74, 53, 97, 65, 97, 37, 95, 87, 70, 45, 45, 7, 30, 69, 50, 40, 29, 44, 6, 46, 69, 71, 29, 93, 19, 2, 25, 72, 93, 31, 62, 19, 84, 59, 35, 32, 95, 29, 18, 17, 73, 14, 75, 54, 35, 77, 93, 63, 72, 50, 61, 92, 73, 89, 84, 43, 90, 9, 14, 35, 39, 28, 5, 74, 38, 39, 5, 84, 68, 75, 52, 92, 40, 27, 46, 74, 55, 90, 37, 26, 92, 97, 17, 64, 37, 100, 58, 78, 8, 24, 12, 99, 51, 16, 72, 40, 7, 29, 23, 74, 55, 27, 17, 94, 53, 62, 68, 7, 4, 4, 32, 95, 52, 48, 10, 40, 99, 67, 17, 7, 90, 81, 57, 92, 48, 80, 83, 54, 8, 58, 79, 62, 84, 96, 56, 88, 9, 75, 94, 12, 30, 77, 6, 81, 76, 67, 72, 74, 34, 88, 32, 75, 20, 88, 19, 68, 68, 53, 73, 75, 10, 52, 89, 93, 99, 96, 80, 7, 70, 25, 19, 99, 53, 76, 31, 28, 43, 2, 2, 28, 41, 85, 54, 61, 73, 24, 80, 40, 77, 52, 66, 86, 55, 6, 31, 53, 1, 62, 60, 70, 39, 30, 68, 91, 57, 50, 19, 51, 51, 72, 78, 92, 56, 84, 4, 80, 7, 83, 71, 83, 34, 89, 21, 89, 94, 3, 93, 47, 64, 52, 68, 2, 33, 36, 45, 90, 37, 63, 40, 88, 86, 70, 31, 93, 53, 34, 73, 11, 16, 95, 46, 1, 83, 18, 41, 29, 20, 34, 75, 35, 37, 42, 89, 70, 29, 33, 11, 66, 47, 2, 5, 32, 71, 35, 76, 75, 20, 48, 86, 35, 95, 83, 87, 77, 100, 28, 5, 19, 13, 31, 5, 1, 73, 93, 70, 53, 77, 32, 18, 23, 34, 22, 6, 56, 8, 82, 31, 27, 81, 68, 13, 75, 50, 100, 52, 1, 79, 8, 19, 43, 39, 75, 43, 63, 68, 65, 15, 44, 96, 85, 67, 81, 58, 24, 37, 66, 5, 19, 44, 86, 86, 57, 12, 87, 8, 15, 87, 38, 23, 57, 80, 13, 31, 22, 75, 50, 38, 41, 94, 86, 25, 12, 66, 83, 87, 54, 100, 92, 72, 43, 29, 9, 99, 40, 47, 58, 55, 85, 95, 29, 93, 74, 41, 24, 48, 67, 25, 37, 7, 18, 22, 32, 81, 40, 66, 68, 93, 65, 11, 17, 7, 91, 77, 58, 30, 76, 67, 36, 60, 62, 16, 53, 87, 56, 28, 86, 74, 52, 23, 81, 22, 44, 64, 54, 35, 29, 73, 80, 93, 35, 96, 51, 25, 24, 60, 7, 99, 27, 42, 11, 88, 58, 15, 26, 65, 42, 12, 39, 45, 34, 19, 66, 29, 34, 72, 64, 62, 44, 95, 6, 79, 90, 8, 3, 65, 68, 61, 16, 46, 3, 78, 85, 12, 92, 10, 76, 85, 73, 66, 29, 6, 36, 47, 87, 69, 18, 2, 30, 13, 96, 87, 43, 37, 95, 98, 53, 14, 58, 68, 59, 60, 45, 43, 23, 36, 4, 99, 72, 77, 16, 1, 34, 52, 47, 20, 20, 16, 73, 2, 80, 68, 88, 23, 56, 34, 20, 9, 47, 77, 76, 5, 89, 73, 99, 11, 60, 55, 61, 32, 31, 77, 32, 64, 28, 30, 36, 99, 97, 8, 100, 76, 28, 88, 98, 83, 21, 69, 91, 68, 98, 19, 24, 86, 91, 75, 48, 50, 29, 61, 33, 11, 89, 16, 26, 16, 97, 61, 66, 93, 21, 66, 21, 48, 53, 18, 82, 25, 39, 25, 44, 36, 43, 20, 21, 85, 94, 20, 86, 74, 80, 19, 84, 68, 34, 9, 35, 31, 22, 1, 23, 42, 66, 95, 41, 70, 65, 74, 94, 3, 98, 90, 38, 92, 9, 10, 76, 2, 81, 62, 27, 61, 80, 10, 80, 65, 70, 15, 95, 91, 67, 70, 84, 84, 64, 76, 53, 28, 50, 98, 82, 99, 87, 19, 91, 95, 80, 66, 48, 61, 79, 74, 21, 58, 83, 52, 23, 5, 66, 69, 95, 84, 38, 31, 67, 54, 6, 71, 33, 7, 69, 15, 6, 7, 85, 96, 2, 65, 13, 1, 25, 92, 75, 97, 1, 9, 48, 75, 13, 66, 44, 60, 49, 33, 42, 68, 38, 99, 38, 71, 6, 58, 85, 11, 65, 69, 58, 18, 85, 70, 18, 9, 13, 44, 57, 14, 53, 57, 88, 17, 22, 31, 28, 22, 16, 21, 89, 53, 20, 79, 23, 25, 36, 59, 87, 100, 28, 44, 17, 12, 65, 87, 73, 78, 30, 29, 91, 34, 37, 78, 3, 58, 61, 82, 32, 76, 3, 72, 28, 22, 50, 51, 98, 86, 61, 84, 37, 88, 27, 6, 52, 91, 92, 76, 20, 21, 56, 10, 7, 93, 40, 9, 2, 100, 90, 33, 75, 92, 57, 54, 65, 6, 56, 62, 43, 17, 45, 32, 56, 23, 37, 7, 66, 28, 34, 85, 100, 90, 47, 58, 82, 86, 66, 83, 85, 8, 68, 11, 99, 24, 16, 16, 81, 72, 77, 76, 40, 74, 7, 95, 96, 43, 54, 13, 22, 87, 50, 73, 28, 96, 31, 9, 81, 48, 44, 17, 55, 11, 79, 6, 86, 94, 21, 66, 17, 49, 93, 8, 22, 99, 55, 70, 93, 8, 82, 66, 46, 31, 39, 74, 26, 21, 82, 58, 20, 77, 74, 75, 39, 4, 32, 24, 50, 4, 42, 18, 52, 34, 26, 74, 33, 80, 43, 77, 39, 24, 43, 84, 7, 33, 9, 32, 5, 43, 42, 24, 19, 15, 50, 58, 71, 33, 81, 20, 36, 74, 89, 88, 8, 66, 61, 92, 45, 55, 68, 35, 78, 62, 19, 36, 46, 27, 68, 50, 21, 9, 26, 40, 75, 75, 97, 97, 60, 29, 68, 95, 55, 57, 82, 62, 22, 94, 5, 19, 48, 24, 53, 78, 86, 23, 13, 31, 2, 80, 33, 22, 40, 58, 61, 67, 84, 9, 63, 43, 90, 31, 38, 44, 87, 71, 57, 60, 65, 13, 78, 12, 36, 31, 89, 73, 5, 2, 56, 6, 33, 88, 28, 25, 45, 40, 91, 80, 49, 53, 75, 90, 83, 12, 85, 21, 34, 41, 81, 98, 53, 10, 62, 40, 92, 50, 13, 97, 3, 68, 2, 36, 55, 81, 12, 51, 21, 2, 82, 21, 54, 56, 10, 89, 19, 94, 61, 53, 86, 93, 50, 90, 55, 63, 29, 46, 13, 41, 42, 67, 8, 96, 54, 14, 76, 65, 16, 48, 66, 98, 20, 72, 53, 29, 12, 72, 74, 72, 24, 11, 17, 25, 100, 71, 88, 81, 16, 52, 21, 10, 18, 81, 57, 24, 46, 84, 88, 62, 32, 54, 59, 51, 77, 11, 32, 88, 34, 57, 11, 9, 20, 27, 34, 71, 49, 73, 51, 17, 24, 24, 26, 93, 56, 82, 16, 1, 65, 56, 14, 48, 61, 24, 51, 37, 87, 34, 76, 20, 90, 86, 29, 9, 65, 14, 32, 65, 86, 82, 81, 61, 5, 6, 5, 12, 39, 21, 13, 56, 28, 78, 3, 88, 2, 53, 24, 88, 86, 99, 7, 28, 36, 87, 88, 52, 100, 19, 17, 37, 53, 97, 97, 9, 55, 2, 21, 93, 74, 85, 100, 1, 62, 3, 40, 63, 7, 63, 50, 45, 13, 9, 24, 48, 95, 63, 100, 95, 34, 68, 31, 86, 64, 80, 94, 70, 33, 14, 15, 58, 98, 14, 10, 12, 68, 49, 74, 75, 11, 76, 71, 75, 84, 46, 22, 30, 8, 73, 76, 41, 40, 7, 78, 56, 38, 72, 25, 70, 37, 39, 79, 87, 5, 88, 98, 72, 36, 23, 98, 98, 98, 68, 72, 33, 65, 45, 63, 25, 70, 90, 65, 9, 96, 43, 16, 85, 66, 93, 6, 2, 83, 84, 88, 87, 71, 37, 59, 58, 60, 56, 55, 9, 76, 78, 94, 40, 23, 56, 16, 92, 97, 81, 52, 93, 75, 20, 29, 40, 12, 35, 93, 46, 18, 81, 33, 41, 69, 91, 98, 28, 98, 5, 37, 73, 34, 30, 65, 8, 37, 80, 99, 33, 12, 3, 77, 38, 74, 6, 77, 37, 92, 22, 82, 9, 54, 14, 49, 22, 56, 47, 50, 6, 3, 38, 30, 36, 19, 94, 44, 7, 26, 94, 91, 89, 48, 68, 27, 21, 25, 55, 57, 16, 28, 91, 76, 81, 56, 25, 3, 12, 23, 52, 17, 77, 41, 46, 12, 59, 92, 7, 17, 69, 1, 7, 9, 100, 26, 87, 21, 50, 94, 29, 17, 21, 71, 45, 2, 27, 69, 4, 90, 43, 7, 58, 71, 99, 55, 82, 9, 46, 41, 25, 66, 41, 31, 27, 40, 57, 13, 12, 58, 6, 93, 27, 79, 63, 71, 80, 41, 91, 35, 30, 33, 41, 87, 3, 39, 42, 36, 99, 39, 76, 23, 57, 68, 53, 83, 60, 61, 47, 71, 71, 53, 15, 97, 31, 30, 67, 62, 70, 57, 96, 100, 41, 88, 38, 95, 78, 79, 30, 76, 70, 58, 98, 26, 25, 2, 8, 84, 63, 6, 7, 33, 10, 73, 81, 92, 2, 47, 53, 72, 55, 48, 23, 95, 35, 60, 89, 12, 39, 70, 39, 60, 27, 36, 85, 4, 38, 44, 87, 52, 49, 45, 36, 59, 18, 16, 50, 19, 62, 55, 42, 16, 54, 64, 62, 89, 24, 50, 52, 14, 19, 91, 73, 98, 78, 9, 1, 15, 52, 39, 18, 52, 84, 53, 62, 53, 68, 12, 71, 81, 18, 65, 48, 71, 28, 9, 11, 3, 10, 63, 68, 81, 5, 40, 78, 34, 100, 30, 1, 51, 68, 18, 55, 3, 23, 16, 55, 42, 79, 78, 23, 96, 42, 22, 67, 21, 83, 77, 24, 44, 91, 91, 24, 47, 83, 53, 81, 82, 82, 81, 85, 2, 98, 39, 4, 72, 54, 11, 14, 33, 88, 88, 28, 29, 61, 94, 49, 43, 23, 24, 87, 13, 15, 62, 60, 49, 15, 40, 30, 48, 72, 14, 49, 21, 52, 5, 93, 58, 15, 6, 90, 2, 93, 69, 82, 53, 15, 82, 48, 37, 6, 86, 1, 72, 47, 60, 20, 61, 51, 49, 61, 22, 15, 9, 43, 18, 13, 87, 75, 79, 92, 16, 80, 36, 37, 13, 40, 51, 95, 39, 39, 100, 24, 39, 23, 71, 51, 42, 83, 53, 42, 43, 27, 8, 52, 21, 26, 16, 7, 100, 95, 98, 68, 26, 85, 4, 39, 76, 54, 33, 15, 44, 84, 38, 34, 6, 8, 36, 99, 91, 89, 92, 33, 15, 100, 36, 87, 25, 4, 93, 76, 98, 42, 43, 75, 26, 98, 13, 1, 3, 45, 15, 46, 80, 5, 32, 37, 12, 67, 35, 54, 55, 27, 39, 21, 78, 26, 7, 2, 29, 51, 29, 78, 92, 24, 53, 69, 21, 65, 70, 24, 62, 36, 21, 41, 92, 52, 78, 56, 19, 64, 9, 25, 42, 99, 98, 19, 25, 56, 72, 53, 7, 1, 31, 50, 24, 83, 19, 96, 99, 40, 71, 60, 27, 92, 53, 19, 95, 82, 74, 65, 45, 34, 90, 87, 33, 39, 57, 9, 94, 29, 13, 52, 81, 43, 2, 56, 77, 20, 51, 28, 11, 22, 87, 37, 65, 39, 55, 11, 20, 80, 76, 17, 66, 17, 55, 98, 55, 11, 58, 100, 91, 70, 52, 71, 65, 53, 26, 93, 24, 29, 20, 34, 2, 7, 22, 18, 97, 29, 28, 69, 8, 55, 85, 73, 71, 91, 22, 77, 1, 79, 29, 92, 1, 80, 14, 65, 84, 92, 9, 59, 20, 29, 44, 21, 87, 65, 90, 83, 93, 17, 3, 1, 72, 39, 25, 94, 29, 99, 23, 30, 77, 51, 73, 29, 82, 38, 45, 65, 29, 54, 75, 100, 82, 18, 72, 68, 82, 61, 2, 75, 78, 57, 27, 1, 95, 3, 46, 24, 1, 20, 53, 30, 70, 77, 58, 3, 14, 3, 67, 95, 56, 93, 94, 89, 10, 66, 8, 92, 78, 61, 18, 55, 17, 44, 7, 12, 46, 5, 35, 99, 24, 39, 28, 94, 67, 85, 48, 32, 39, 15, 26, 46, 59, 72, 34, 69, 89, 93, 60, 66, 54, 77, 73, 22, 72, 31, 33, 69, 35, 19, 67, 59, 9, 94, 4, 75, 31, 51, 7, 69, 17, 84, 15, 76, 55, 100, 44, 43, 93, 55, 61, 98, 83, 33, 19, 6, 63, 4, 74, 98, 22, 93, 8, 31, 38, 11, 57, 68, 13, 63, 37, 30, 47, 3, 57, 53, 54, 100, 48, 46, 6, 8, 95, 88, 92, 66, 93, 54, 69, 18, 3, 42, 10, 10, 24, 48, 72, 81, 67, 37, 95, 55, 66, 41, 57, 74, 46, 11, 25, 93, 8, 30, 52, 55, 69, 43, 20, 61, 96, 88, 30, 51, 29, 92, 12, 5, 91, 36, 85, 57, 72, 79, 12, 89, 72, 20, 62, 17, 82, 86, 61, 90, 67, 12, 44, 35, 54, 15, 47, 1, 2, 76, 51, 82, 19, 63, 86, 9, 50, 70, 18, 21, 1, 29, 61, 72, 100, 22, 40, 82, 59, 100, 23, 25, 11, 18, 59, 64, 32, 5, 64, 85, 32, 67, 66, 51, 81, 4, 59, 30, 25, 76, 50, 25, 56, 62, 48, 8, 83, 87, 89, 93, 86, 63, 17, 96, 32, 27, 11, 15, 31, 75, 99, 62, 93, 16, 12, 73, 19, 23, 2, 96, 50, 3, 20, 6, 64, 68, 65, 98, 54, 5, 90, 92, 67, 6, 39, 50, 32, 50, 64, 14, 76, 14, 27, 68, 29, 91, 40, 100, 13, 93, 47, 14, 95, 66, 71, 10, 85, 35, 7, 39, 39, 96, 82, 57, 53, 20, 6, 36, 69, 69, 1, 96, 34, 27, 15, 15, 69, 54, 66, 81, 98, 12, 47, 92, 77, 17, 1, 62, 52, 59, 52, 42, 6, 85, 99, 10, 4, 4, 45, 25, 25, 97, 20, 58, 76, 35, 24, 44, 40, 89, 77, 38, 100, 23, 81, 29, 91, 34, 42, 42, 92, 93, 36, 98, 77, 34, 7, 32, 89, 4, 56, 13, 100, 28, 23, 27, 14, 46, 71, 53, 35, 47, 42, 86, 21, 23, 14, 11, 56, 55, 5, 99, 47, 40, 96, 75, 73, 55, 7, 61, 58, 14, 26, 9, 41, 100, 36, 54, 45, 58, 59, 31, 4, 100, 17, 24, 74, 30, 86, 81, 85, 90, 80, 83, 29, 27, 10, 53, 81, 68, 66, 90, 81, 91, 51, 74, 90, 38, 79, 86, 95, 37, 17, 50, 89, 33, 25, 14, 62, 10, 47, 98, 100, 26, 33, 80, 4, 42, 33, 85, 9, 98, 26, 41, 40, 76, 66, 81, 13, 45, 66, 59, 33, 82, 8, 73, 66, 32, 87, 80, 94, 33, 77, 93, 10, 9, 72, 65, 2, 56, 1, 10, 5, 27, 3, 44, 54, 68, 24, 19, 64, 42, 77, 97, 23, 85, 21, 41, 68, 7, 20, 61, 91, 48, 5, 52, 9, 29, 17, 10, 84, 17, 72, 89, 95, 74, 84, 49, 93, 60, 67, 57, 1, 43, 5, 75, 79, 25, 15, 99, 84, 34, 59, 26, 34, 64, 78, 42, 44, 46, 51, 27, 14, 22, 67, 9, 47, 3, 9, 92, 62, 75, 48, 62, 69, 4, 36, 100, 28, 51, 98, 11, 36, 8, 89, 69, 23, 66, 62, 66, 63, 13, 45, 76, 86, 63, 36, 85, 65, 44, 76, 26, 70, 75, 87, 91, 78, 75, 90, 5, 77, 39, 68, 64, 46, 56, 85, 21, 73, 46, 86, 87, 58, 82, 14, 96, 45, 50, 80, 9, 45, 55, 87, 67, 81, 25, 57, 58, 99, 46, 14, 27, 36, 33, 91, 81, 40, 75, 53, 64, 20, 39, 50, 30, 72, 64, 77, 16, 65, 56, 77, 61, 62, 63, 27, 42, 39, 83, 51, 90, 80, 64, 16, 15, 97, 58, 48, 36, 32, 100, 100, 4, 90, 1, 85, 62, 16, 13, 29, 32, 68, 57, 93, 81, 71, 19, 74, 10, 54, 24, 99, 85, 87, 14, 100, 35, 24, 99, 23, 7, 50, 74, 10, 92, 74, 46, 5, 42, 58, 33, 73, 77, 42, 65, 9, 12, 36, 82, 21, 41, 5, 19, 25, 44, 85, 76, 30, 8, 74, 52, 14, 76, 77, 76, 67, 3, 73, 23, 44, 83, 7, 16, 11, 48, 33, 20, 60, 20, 53, 80, 60, 10, 51, 84, 5, 35, 60, 34, 94, 85, 38, 59, 12, 14, 86, 30, 16, 59, 52, 59, 93, 59, 27, 3, 6, 59, 74, 65, 78, 27, 97, 89, 36, 47, 72, 92, 33, 83, 25, 26, 20, 62, 36, 31, 28, 22, 13, 43, 32, 64, 54, 24, 22, 80, 78, 80, 90, 52, 44, 19, 30, 40, 7, 17, 38, 30, 8, 70, 13, 84, 47, 84, 98, 83, 66, 25, 56, 78, 19, 39, 42, 72, 62, 15, 3, 91, 94, 44, 94, 90, 62, 23, 81, 68, 91, 19, 98, 98, 40, 62, 34, 87, 45, 31, 21, 62, 55, 28, 40, 73, 66, 33, 97, 79, 47, 51, 21, 41, 95, 15, 82, 8, 89, 62, 76, 80, 32, 25, 29, 72, 38, 62, 10, 82, 44, 82, 43, 98, 9, 34, 23, 26, 66, 19, 4, 13, 21, 76, 5, 15, 90, 38, 23, 31, 99, 50, 10, 31, 26, 90, 2, 63, 4, 63, 96, 47, 44, 90, 97, 52, 24, 19, 77, 41, 89, 32, 5, 61, 7, 61, 28, 49, 98, 2, 79, 97, 51, 40, 79, 28, 81, 32, 90, 84, 94, 37, 83, 37, 26, 31, 88, 1, 49, 16, 42, 89, 99, 98, 49, 57, 59, 76, 57, 56, 29, 35, 4, 79, 26, 82, 58, 7, 13, 99, 42, 6, 35, 24, 42, 13, 54, 81, 65, 54, 48, 58, 94, 98, 56, 95, 7, 14, 22, 63, 21, 51, 50, 25, 81, 75, 6, 39, 81, 19, 37, 23, 76, 24, 98, 18, 36, 4, 50, 100, 9, 50, 58, 3, 47, 13, 97, 53, 78, 70, 16, 98, 20, 65, 22, 1, 91, 80, 39, 72, 98, 27, 46, 25, 50, 43, 94, 85, 98, 44, 37, 7, 93, 94, 9, 91, 58, 57, 44, 35, 26, 11, 32, 98, 27, 6, 98, 17, 85, 88, 40, 34, 66, 85, 58, 68, 80, 52, 52, 77, 47, 40, 35, 39, 85, 95, 29, 42, 3, 24, 28, 81, 34, 60, 78, 12, 17, 27, 29, 1, 66, 20, 86, 31, 5, 43, 98, 36, 46, 2, 64, 92, 93, 51, 82, 78, 45, 63, 19, 48, 86, 47, 28, 72, 58, 5, 35, 26, 83, 15, 78, 48, 35, 63, 30, 91, 57, 80, 26, 3, 81, 41, 46, 73, 91, 80, 2, 36, 42, 21, 35, 79, 19, 14, 50, 76, 70, 37, 53, 52, 51, 30, 99, 85, 92, 80, 75, 100, 59, 52, 2, 91, 45, 100, 64, 35, 79, 65, 22, 72, 37, 8, 50, 55, 21, 52, 82, 90, 88, 34, 41, 38, 15, 91, 23, 6, 71, 49, 6, 81, 53, 59, 72, 97, 10, 87, 83, 40, 3, 57, 11, 40, 64, 61, 46, 85, 64, 80, 74, 51, 65, 67, 88, 80, 9, 62, 37, 79, 63, 94, 12, 15, 5, 83, 63, 14, 69, 45, 6, 71, 1, 16, 62, 17, 28, 8, 1, 91, 39, 26, 93, 3, 44, 33, 34, 53, 94, 71, 83, 8, 16, 94, 74, 20, 28, 36, 86, 96, 33, 91, 67, 85, 58, 80, 1, 38, 87, 53, 28, 77, 31, 21, 80, 74, 53, 65, 78, 98, 35, 13, 58, 3, 58, 31, 22, 86, 19, 59, 81, 3, 1, 99, 87, 59, 79, 88, 96, 17, 92, 75, 94, 22, 47, 25, 48, 51, 89, 77, 1, 76, 89, 58, 78, 47, 40, 51, 32, 10, 10, 64, 12, 10, 63, 99, 20, 41, 38, 67, 9, 29, 94, 2, 3, 40, 78, 50, 91, 67, 26, 43, 42, 67, 52, 19, 13, 91, 69, 96, 53, 30, 59, 64, 92, 21, 14, 11, 13, 51, 78, 74, 32, 71, 27, 34, 62, 5, 35, 4, 71, 12, 46, 64, 78, 97, 34, 42, 40, 54, 89, 92, 84, 48, 55, 75, 20, 69, 37, 85, 71, 66, 58, 2, 88, 84, 87, 50, 88, 73, 53, 10, 37, 51, 25, 66, 47, 10, 8, 38, 64, 48, 29, 99, 95, 36, 25, 15, 4, 61, 99, 26, 27, 8, 80, 14, 91, 18, 15, 31, 91, 68, 92, 27, 70, 17, 92, 16, 78, 51, 54, 41, 99, 34, 39, 45, 69, 15, 11, 24, 76, 9, 50, 54, 68, 29, 67, 59, 98, 34, 41, 88, 1, 32, 66, 22, 100, 10, 37, 78, 60, 42, 70, 10, 28, 61, 55, 96, 75, 65, 20, 50, 26, 21, 3, 93, 1, 22, 3, 98, 55, 43, 38, 7, 27, 3, 80, 78, 12, 16, 55, 24, 10, 25, 85, 37, 85, 91, 84, 11, 56, 55, 61, 33, 75, 15, 77, 27, 88, 32, 25, 94, 74, 62, 52, 52, 16, 31, 30, 28, 99, 84, 3, 60, 60, 87, 48, 96, 78, 31, 7, 85, 86, 19, 69, 12, 33, 45, 39, 73, 76, 63, 66, 2, 76, 70, 53, 91, 100, 82, 70, 50, 18, 24, 9, 29, 11, 56, 25, 40, 87, 83, 24, 24, 1, 44, 87, 85, 88, 25, 57, 16, 39, 75, 69, 14, 44, 21, 57, 95, 55, 78, 45, 24, 2, 53, 52, 64, 61, 28, 3, 99, 10, 78, 22, 10, 21, 8, 95, 60, 85, 3, 75, 23, 77, 43, 89, 72, 16, 97, 67, 22, 26, 63, 45, 27, 15, 96, 90, 27, 76, 44, 25, 85, 21, 98, 47, 93, 58, 93, 53, 42, 95, 79, 16, 24, 74, 56, 95, 89, 52, 13, 62, 78, 75, 6, 56, 42, 53, 98, 20, 28, 41, 45, 65, 14, 42, 11, 6, 99, 3, 10, 92, 97, 89, 8, 72, 62, 63, 67, 2, 67, 31, 63, 96, 58, 68, 51, 51, 72, 100, 70, 100, 93, 66, 64, 6, 8, 74, 63, 58, 28, 73, 50, 24, 13, 57, 96, 74, 71, 14, 75, 37, 96, 37, 32, 5, 56, 35, 55, 27, 34, 77, 78, 26, 42, 93, 83, 49, 18, 98, 7, 45, 22, 8, 21, 34, 64, 68, 7, 34, 81, 33, 23, 28, 69, 6, 33, 76, 40, 39, 2, 26, 15, 32, 51, 9, 24, 86, 57, 42, 83, 15, 86, 4, 22, 6, 37, 37, 25, 95, 23, 57, 27, 45, 85, 47, 50, 69, 22, 42, 7, 75, 67, 74, 6, 69, 82, 30, 6, 90, 23, 88, 57, 60, 43, 30, 18, 31, 67, 42, 25, 41, 99, 3, 85, 83, 49, 86, 51, 22, 79, 9, 97, 45, 82, 54, 66, 15, 83, 71, 5, 57, 11, 61, 17, 5, 90, 34, 36, 8, 75, 60, 48, 73, 15, 32, 7, 63, 70, 9, 37, 48, 18, 33, 45, 51, 38, 62, 66, 73, 84, 70, 29, 46, 82, 45, 51, 71, 78, 86, 79, 5, 97, 78, 77, 11, 62, 36, 26, 31, 44, 62, 30, 13, 46, 26, 64, 83, 39, 81, 7, 23, 50, 36, 68, 83, 80, 70, 5, 10, 55, 83, 14, 4, 13, 42, 14, 74, 77, 91, 4, 21, 4, 85, 33, 1, 63, 48, 84, 1, 28, 90, 23, 29, 77, 43, 11, 57, 12, 16, 18, 19, 50, 31, 22, 62, 72, 87, 35, 49, 78, 90, 21, 81, 75, 53, 82, 37, 1, 17, 37, 28, 58, 12, 57, 87, 6, 19, 43, 69, 34, 12, 87, 84, 42, 8, 97, 65, 47, 32, 13, 24, 21, 33, 56, 47, 38, 89, 35, 38, 57, 24, 17, 67, 35, 25, 53, 92, 44, 95, 60, 77, 6, 47, 12, 99, 6, 9, 63, 52, 92, 28, 27, 12, 12, 35, 11, 49, 23, 45, 38, 32, 68, 55, 98, 54, 31, 50, 45, 74, 96, 5, 3, 53, 3, 66, 51, 8, 74, 65, 12, 17, 92, 38, 81, 56, 24, 91, 4, 99, 35, 94, 30, 55, 100, 27, 60, 30, 76, 5, 56, 23, 61, 58, 75, 63, 75, 77, 70, 1, 41, 33, 17, 85, 23, 97, 40, 46, 87, 95, 44, 74, 40, 73, 80, 39, 51, 39, 69, 78, 43, 76, 100, 55, 85, 74, 17, 59, 50, 39, 59, 43, 71, 76, 79, 45, 24, 70, 91, 11, 64, 86, 36, 56, 11, 15, 94, 61, 5, 14, 39, 100, 89, 38, 54, 73, 64, 71, 84, 65, 61, 42, 7, 83, 69, 37, 28, 93, 6, 70, 55, 22, 55, 90, 77, 17, 56, 70, 78, 60, 36, 68, 59, 24, 57, 13, 49, 20, 35, 32, 37, 47, 73, 95, 29, 94, 32, 8, 86, 37, 77, 40, 10, 84, 29, 86, 100, 36, 8, 29, 95, 43, 96, 54, 18, 5, 18, 66, 76, 4, 49, 12, 50, 74, 7, 78, 67, 38, 86, 4, 26, 14, 43, 36, 97, 23, 73, 49, 58, 32, 29, 52, 74, 25, 57, 44, 81, 26, 61, 56, 29, 10, 68, 78, 35, 74, 56, 1, 63, 93, 4, 88, 58, 98, 75, 55, 20, 48, 55, 29, 79, 83, 32, 5, 59, 41, 100, 39, 66, 60, 47, 95, 21, 14, 72, 55, 39, 79, 7, 53, 71, 62, 40, 29, 59, 67, 35, 30, 66, 41, 10, 44, 23, 42, 100, 34, 82, 51, 24, 47, 11, 70, 41, 83, 83, 65, 90, 73, 43, 96, 25, 66, 10, 17, 46, 68, 83, 32, 50, 48, 72, 59, 43, 46, 52, 95, 79, 33, 45, 3, 32, 7, 72, 24, 42, 7, 88, 31, 31, 31, 78, 56, 96, 87, 24, 93, 7, 6, 24, 8, 5, 95, 66, 47, 92, 70, 41, 71, 2, 38, 25, 85, 44, 96, 9, 85, 54, 96, 67, 85, 78, 45, 92, 25, 83, 15, 17, 41, 72, 40, 48, 76, 86, 66, 22, 78, 35, 15, 100, 88, 52, 24, 73, 47, 71, 33, 32, 25, 28, 50, 61, 6, 94, 52, 82, 77, 18, 99, 69, 89, 90, 17, 64, 76, 82, 37, 5, 68, 51, 4, 55, 54, 27, 79, 53, 97, 11, 36, 73, 39, 85, 85, 96, 79, 36, 29, 7, 5, 27, 75, 93, 17, 43, 8, 44, 76, 45, 100, 43, 47, 3, 98, 1, 81, 28, 53, 29, 39, 88, 2, 29, 24, 86, 24, 2, 74, 4, 60, 30, 31, 87, 23, 99, 29, 30, 94, 5, 26, 93, 99, 73, 47, 96, 25, 27, 24, 29, 55, 14, 68, 8, 42, 91, 46, 17, 93, 71, 20, 4, 100, 2, 90, 22, 100, 71, 4, 45, 27, 29, 37, 25, 53, 83, 73, 77, 61, 48, 5, 16, 61, 72, 75, 2, 63, 20, 70, 7, 90, 89, 10, 42, 91, 52, 63, 42, 74, 18, 87, 100, 99, 23, 76, 51, 58, 48, 28, 18, 47, 32, 85, 7, 4, 12, 60, 18, 31, 29, 24, 73, 70, 85, 14, 60, 88, 28, 1, 61, 98, 39, 12, 96, 14, 88, 46, 71, 87, 73, 40, 34, 57, 77, 92, 12, 88, 52, 29, 70, 32, 52, 42, 1, 88, 7, 12, 76, 87, 65, 88, 84, 3, 100, 79, 16, 39, 24, 38, 77, 49, 78, 10, 5, 54, 54, 16, 41, 57, 96, 10, 88, 99, 4, 41, 86, 62, 4, 61, 48, 68, 1, 31, 71, 100, 9, 38, 38, 85, 76, 14, 33, 53, 76, 89, 58, 81, 56, 50, 37, 51, 11, 76, 49, 66, 68, 86, 28, 72, 99, 75, 39, 99, 6, 61, 50, 66, 99, 39, 50, 74, 4, 34, 78, 79, 22, 87, 59, 29, 36, 47, 31, 98, 23, 31, 64, 90, 17, 91, 13, 15, 65, 52, 65, 22, 64, 14, 88, 62, 52, 89, 87, 55, 23, 16, 86, 96, 2, 96, 77, 89, 43, 7, 87, 17, 38, 50, 58, 54, 40, 71, 20, 56, 74, 36, 30, 37, 49, 69, 51, 52, 57, 89, 6, 31, 57, 43, 79, 10, 39, 55, 99, 33, 61, 85, 1, 98, 86, 58, 3, 77, 80, 74, 84, 53, 9, 13, 42, 57, 81, 92, 60, 90, 32, 18, 20, 88, 60, 98, 98, 50, 4, 96, 34, 65, 32, 34, 14, 69, 44, 17, 97, 75, 90, 80, 80, 51, 45, 21, 59, 25, 64, 19, 66, 95, 36, 86, 35, 47, 35, 32, 97, 39, 79, 82, 55, 62, 68, 68, 82, 63, 36, 78, 37, 78, 57, 16, 28, 1, 36, 38, 78, 99, 56, 43, 46, 43, 80, 80, 90, 67, 63, 38, 57, 41, 19, 11, 54, 86, 30, 35, 48, 18, 12, 37, 95, 20, 52, 74, 73, 40, 11, 50, 38, 19, 44, 35, 61, 76, 14, 50, 42, 76, 39, 98, 68, 58, 60, 21, 95, 89, 55, 95, 6, 18, 31, 52, 38, 34, 77, 10, 73, 40, 11, 63, 58, 6, 97, 70, 81, 63, 72, 74, 90, 10, 23, 10, 67, 82, 30, 14, 71, 37, 8, 28, 6, 90, 32, 43, 23, 8, 4, 48, 47, 66, 10, 56, 72, 58, 26, 4, 72, 49, 78, 62, 58, 52, 23, 77, 34, 52, 90, 56, 40, 49, 83, 98, 90, 66, 92, 64, 74, 96, 11, 72, 13, 72, 80, 36, 30, 57, 40, 1, 5, 69, 14, 62, 20, 36, 38, 5, 40, 79, 60, 31, 79, 95, 28, 68, 60, 20, 32, 85, 67, 94, 57, 79, 66, 88, 15, 95, 44, 6, 47, 100, 74, 13, 13, 45, 48, 51, 50, 39, 81, 61, 70, 60, 55, 49, 27, 15, 68, 10, 99, 34, 4, 7, 65, 69, 94, 79, 15, 89, 84, 61, 88, 9, 73, 1, 5, 73, 3, 6, 11, 35, 67, 32, 94, 21, 81, 73, 87, 48, 82, 86, 34, 85, 44, 98, 53, 38, 28, 19, 78, 63, 80, 18, 23, 4, 70, 27, 28, 72, 85, 91, 6, 51, 22, 52, 71, 54, 24, 58, 54, 5, 95, 39, 42, 38, 88, 46, 27, 15, 65, 5, 29, 96, 22, 51, 51, 43, 29, 79, 14, 13, 21, 71, 15, 94, 74, 86, 48, 97, 95, 1, 54, 89, 39, 47, 78, 26, 92, 5, 92, 56, 61, 20, 3, 34, 22, 54, 76, 2, 84, 41, 67, 4, 63, 33, 97, 37, 70, 44, 85, 64, 96, 90, 4, 86, 36, 34, 63, 28, 38, 54, 35, 50, 25, 38, 83, 98, 91, 10, 52, 74, 50, 70, 77, 12, 2, 25, 100, 72, 69, 85, 35, 16, 26, 91, 2, 62, 24, 64, 89, 13, 70, 23, 62, 46, 12, 96, 44, 2, 5, 47, 27, 6, 16, 3, 69, 17, 80, 21, 88, 48, 5, 75, 15, 82, 17, 16, 43, 40, 32, 83, 4, 1, 58, 17, 46, 69, 12, 41, 71, 68, 87, 49, 25, 2, 4, 93, 71, 83, 13, 10, 30, 69, 84, 44, 51, 52, 12, 45, 43, 43, 28, 46, 95, 85, 62, 40, 53, 25, 33, 75, 92, 19, 24, 16, 73, 27, 61, 43, 9, 25, 52, 90, 46, 88, 85, 96, 39, 48, 92, 82, 90, 19, 79, 36, 55, 41, 28, 8, 65, 60, 34, 9, 30, 57, 24, 2, 35, 36, 44, 95, 61, 48, 84, 6, 35, 21, 53, 73, 68, 44, 6, 10, 15, 85, 45, 69, 77, 72, 28, 41, 83, 62, 49, 13, 70, 25, 14, 57, 60, 10, 51, 72, 57, 87, 77, 91, 7, 81, 15, 26, 77, 21, 35, 91, 57, 32, 59, 33, 55, 39, 25, 38, 100, 74, 50, 21, 50, 63, 77, 9, 72, 28, 81, 80, 66, 9, 70, 24, 90, 85, 49, 66, 57, 36, 8, 65, 67, 18, 97, 21, 56, 21, 58, 55, 46, 59, 76, 95, 74, 52, 56, 97, 31, 36, 77, 96, 96, 46, 19, 37, 82, 20, 54, 90, 55, 61, 54, 73, 79, 2, 93, 34, 23, 3, 41, 20, 13, 68, 15, 86, 71, 70, 83, 2, 57, 11, 49, 52, 56, 20, 41, 90, 39, 94, 79, 45, 55, 85, 17, 33, 86, 61, 18, 60, 15, 58, 80, 28, 77, 46, 65, 48, 67, 99, 49, 23, 9, 49, 26, 17, 68, 66, 6, 58, 60, 36, 54, 66, 72, 70, 50, 58, 83, 67, 69, 49, 77, 100, 28, 53, 45, 93, 100, 11, 43, 100, 85, 52, 1, 63, 20, 20, 80, 77, 78, 91, 12, 31, 56, 84, 53, 5, 93, 87, 24, 61, 35, 100, 61, 63, 4, 57, 7, 4, 20, 49, 55, 56, 52, 55, 70, 71, 75, 50, 47, 4, 92, 11, 34, 48, 46, 38, 4, 38, 76, 27, 50, 11, 78, 62, 25, 82, 71, 31, 37, 90, 79, 91, 45, 31, 46, 15, 53, 72, 16, 100, 75, 7, 62, 60, 6, 7, 98, 10, 96, 73, 88, 97, 35, 18, 59, 59, 99, 29, 89, 87, 70, 20, 77, 66, 2, 74, 32, 54, 45, 47, 5, 71, 6, 66, 31, 11, 72, 80, 72, 19, 4, 60, 16, 39, 77, 74, 97, 27, 54, 38, 13, 75, 57, 41, 40, 10, 67, 72, 63, 63, 70, 20, 34, 75, 85, 64, 86, 9, 95, 57, 27, 98, 68, 42, 36, 96, 67, 85, 22, 72, 22, 86, 46, 30, 79, 38, 39, 45, 9, 53, 59, 78, 72, 92, 53, 57, 7, 90, 17, 1, 46, 43, 99, 14, 37, 86, 61, 55, 70, 83, 79, 43, 20, 24, 72, 98, 61, 10, 94, 21, 63, 5, 99, 86, 48, 3, 42, 55, 92, 58, 7, 89, 53, 57, 54, 41, 95, 15, 95, 64, 97, 73, 7, 68, 49, 30, 18, 61, 40, 11, 34, 54, 15, 32, 39, 63, 86, 33, 69, 77, 42, 27, 65, 46, 36, 19, 86, 30, 33, 33, 45, 81, 57, 3, 100, 5, 33, 17, 18, 24, 28, 51, 29, 94, 34, 19, 8, 71, 3, 28, 47, 45, 7, 63, 90, 42, 33, 28, 23, 17, 60, 19, 49, 16, 22, 49, 73, 6, 65, 42, 81, 44, 44, 61, 90, 29, 79, 97, 99, 82, 77, 97, 78, 83, 59, 19, 24, 44, 46, 98, 12, 57, 68, 61, 25, 41, 61, 49, 46, 25, 90, 78, 21, 33, 38, 10, 13, 17, 58, 11, 50, 34, 7, 79, 16, 65, 97, 91, 60, 95, 40, 72, 3, 8, 84, 27, 48, 44, 75, 46, 68, 16, 23, 40, 100, 61, 1, 12, 29, 59, 22, 30, 44, 28, 8, 60, 45, 56, 2, 56, 2, 42, 27, 57, 1, 10, 83, 48, 53, 10, 93, 73, 77, 68, 64, 77, 80, 65, 40, 8, 23, 14, 89, 66, 93, 48, 77, 37, 55, 31, 45, 57, 24, 71, 13, 24, 33, 47, 71, 37, 8, 16, 61, 85, 83, 25, 13, 14, 89, 4, 21, 63, 17, 61, 80, 10, 60, 9, 98, 14, 39, 42, 22, 62, 65, 86, 85, 97, 85, 7, 85, 92, 74, 46, 28, 8, 22, 40, 21, 10, 96, 93, 24, 12, 5, 3, 21, 64, 11, 71, 78, 1, 12, 99, 62, 76, 37, 98, 24, 21, 57, 61, 12, 30, 6, 92, 90, 27, 83, 10, 88, 78, 55, 63, 90, 59, 65, 62, 23, 28, 32, 52, 28, 44, 50, 42, 71, 38, 39, 47, 58, 95, 7, 22, 77, 64, 13, 66, 42, 95, 27, 81, 73, 33, 43, 14, 92, 59, 75, 66, 38, 7, 17, 66, 2, 18, 59, 72, 56, 49, 70, 13, 44, 76, 34, 72, 91, 98, 89, 84, 93, 15, 64, 17, 100, 58, 30, 91, 17, 4, 56, 54, 10, 72, 71, 11, 89, 81, 35, 96, 30, 4, 9, 73, 32, 94, 96, 74, 44, 84, 58, 36, 50, 73, 4, 49, 31, 33, 91, 99, 88, 46, 4, 98, 69, 27, 60, 10, 7, 46, 5, 36, 50, 65, 60, 33, 11, 55, 6, 54, 90, 15, 41, 92, 88, 44, 92, 70, 28, 83, 20, 15, 80, 23, 12, 49, 49, 24, 10, 8, 69, 14, 43, 70, 31, 55, 2, 41, 61, 60, 46, 51, 26, 86, 94, 13, 81, 85, 34, 8, 67, 53, 22, 99, 28, 86, 99, 28, 61, 8, 35, 29, 73, 30, 51, 3, 84, 4, 95, 44, 63, 40, 46, 89, 25, 39, 53, 5, 24, 39, 64, 42, 43, 86, 40, 22, 23, 38, 50, 83, 45, 36, 63, 70, 17, 13, 72, 100, 17, 67, 96, 31, 58, 93, 71, 83, 32, 76, 39, 7, 66, 55, 100, 8, 40, 40, 82, 62, 29, 83, 96, 26, 18, 58, 95, 35, 23, 18, 86, 91, 36, 33, 73, 94, 78, 44, 28, 9, 71, 18, 67, 36, 72, 66, 95, 63, 57, 76, 76, 38, 58, 71, 63, 28, 81, 9, 14, 3, 26, 51, 93, 14, 36, 65, 59, 13, 60, 86, 73, 30, 55, 91, 17, 27, 8, 64, 89, 65, 91, 17, 54, 1, 87, 68, 28, 67, 76, 93, 21, 53, 95, 65, 18, 30, 30, 76, 94, 41, 13, 66, 23, 68, 8, 39, 94, 16, 54, 34, 32, 45, 50, 85, 45, 89, 52, 24, 7, 27, 68, 28, 31, 62, 92, 49, 44, 73, 24, 37, 14, 37, 55, 36, 56, 62, 26, 1, 77, 80, 34, 8, 76, 36, 44, 20, 76, 95, 95, 82, 73, 62, 61, 56, 23, 53, 4, 18, 77, 79, 55, 42, 67, 61, 77, 22, 22, 55, 22, 51, 86, 8, 58, 61, 43, 2, 32, 70, 48, 26, 51, 21, 39, 12, 28, 13, 16, 31, 31, 92, 61, 37, 34, 28, 97, 62, 49, 18, 68, 71, 68, 5, 78, 78, 65, 72, 31, 48, 41, 78, 73, 43, 50, 63, 54, 77, 76, 21, 59, 6, 65, 20, 42, 50, 47, 90, 63, 95, 7, 83, 17, 27, 87, 94, 4, 52, 17, 34, 99, 57, 63, 24, 100, 13, 38, 5, 41, 13, 78, 100, 70, 94, 19, 63, 43, 65, 52, 57, 11, 11, 39, 28, 37, 26, 73, 40, 29, 90, 25, 27, 98, 87, 2, 49, 51, 92, 6, 92, 4, 83, 91, 26, 76, 61, 88, 70, 25, 40, 26, 87, 50, 17, 14, 38, 42, 39, 29, 70, 28, 53, 48, 77, 91, 2, 26, 42, 93, 31, 85, 96, 65, 27, 21, 92, 87, 61, 61, 63, 52, 38, 49, 53, 54, 15, 90, 95, 53, 18, 16, 32, 22, 64, 8, 64, 17, 85, 5, 9, 15, 41, 56, 79, 67, 29, 70, 53, 89, 82, 15, 92, 20, 16, 44, 25, 30, 33, 72, 34, 2, 87, 65, 75, 2, 24, 38, 18, 9, 95, 78, 75, 35, 34, 54, 54, 62, 75, 6, 2, 9, 73, 93, 80, 88, 36, 4, 17, 20, 75, 2, 73, 14, 18, 47, 67, 41, 36, 37, 1, 30, 14, 76, 17, 47, 81, 70, 60, 7, 75, 61, 15, 99, 53, 94, 86, 40, 50, 54, 59, 76, 55, 83, 41, 72, 29, 8, 65, 65, 44, 65, 46, 9, 92, 62, 8, 24, 83, 67, 31, 10, 80, 97, 8, 84, 43, 94, 24, 92, 99, 34, 67, 54, 69, 8, 25, 97, 67, 41, 13, 62, 6, 11, 70, 49, 24, 29, 73, 7, 96, 55, 68, 27, 3, 75, 10, 45, 20, 85, 36, 19, 71, 55, 24, 39, 14, 48, 87, 80, 41, 52, 93, 98, 62, 62, 46, 37, 91, 70, 43, 38, 24, 62, 16, 27, 37, 25, 23, 8, 62, 11, 26, 84, 65, 49, 22, 30, 49, 60, 9, 89, 11, 1, 86, 24, 14, 83, 61, 56, 53, 55, 45, 28, 17, 60, 6, 5, 37, 29, 12, 50, 39, 90, 33, 55, 90, 54, 84, 38, 13, 44, 78, 76, 96, 15, 99, 9, 50, 11, 17, 2, 66, 13, 29, 34, 73, 35, 38, 61, 15, 1, 10, 53, 90, 42, 7, 80, 47, 90, 69, 11, 33, 99, 86, 28, 13, 37, 88, 62, 47, 56, 15, 64, 69, 96, 49, 93, 82, 86, 53, 96, 39, 14, 48, 28, 55, 6, 7, 1, 95, 28, 63, 79, 26, 49, 58, 90, 85, 97, 4, 83, 53, 18, 99, 73, 13, 47, 65, 46, 85, 69, 41, 23, 82, 88, 2, 88, 45, 61, 40, 39, 88, 2, 69, 13, 2, 78, 54, 86, 75, 57, 21, 79, 27, 71, 51, 91, 17, 67, 37, 53, 87, 77, 75, 68, 17, 77, 7, 61, 37, 46, 52, 76, 99, 20, 40, 1, 98, 93, 38, 24, 2, 58, 2, 28, 28, 4, 18, 97, 70, 54, 49, 56, 83, 76, 75, 99, 52, 81, 11, 40, 78, 62, 15, 76, 34, 54, 76, 83, 98, 14, 58, 99, 23, 59, 26, 3, 14, 96, 99, 35, 1, 99, 42, 83, 74, 68, 33, 25, 48, 44, 16, 77, 57, 30, 4, 42, 35, 32, 24, 33, 45, 81, 31, 19, 91, 9, 21, 4, 4, 71, 90, 4, 70, 31, 39, 43, 98, 71, 20, 97, 66, 35, 25, 23, 17, 29, 64, 51, 60, 40, 35, 56, 72, 18, 26, 63, 26, 47, 18, 81, 69, 60, 84, 90, 90, 74, 33, 40, 45, 4, 36, 10, 38, 61, 84, 6, 41, 100, 57, 100, 91, 43, 7, 62, 60, 32, 76, 37, 30, 46, 69, 99, 5, 53, 88, 94, 78, 72, 33, 22, 75, 21, 84, 65, 33, 19, 70, 73, 18, 78, 24, 8, 21, 30, 22, 32, 61, 97, 21, 91, 42, 89, 41, 46, 93, 80, 92, 71, 4, 76, 44, 30, 96, 27, 94, 80, 46, 64, 52, 15, 93, 75, 75, 65, 4, 96, 97, 17, 92, 69, 59, 86, 57, 51, 83, 2, 82, 74, 72, 85, 2, 15, 15, 49, 94, 60, 29, 39, 75, 80, 5, 68, 7, 79, 32, 62, 74, 80, 78, 18, 48, 88, 3, 57, 38, 85, 58, 72, 11, 81, 56, 12, 95, 22, 60, 40, 82, 88, 30, 8, 20, 35, 75, 78, 13, 59, 39, 39, 38, 69, 56, 38, 56, 10, 46, 46, 94, 3, 69, 56, 83, 24, 67, 29, 98, 79, 69, 31, 18, 98, 38, 37, 84, 65, 14, 97, 23, 5, 87, 12, 73, 42, 1, 80, 51, 46, 77, 96, 100, 45, 4, 82, 21, 22, 63, 18, 100, 83, 100, 18, 32, 37, 6, 16, 53, 20, 64, 27, 76, 50, 39, 48, 43, 91, 27, 45, 37, 56, 92, 36, 100, 95, 70, 72, 17, 84, 41, 16, 66, 40, 85, 97, 29, 91, 64, 81, 62, 27, 8, 37, 28, 98, 36, 70, 40, 14, 14, 76, 69, 6, 64, 21, 52, 85, 92, 68, 68, 33, 36, 85, 72, 20, 33, 100, 62, 97, 33, 23, 75, 40, 11, 3, 89, 46, 24, 28, 60, 90, 56, 28, 95, 71, 48, 46, 55, 92, 66, 74, 24, 1, 10, 47, 72, 42, 47, 34, 90, 31, 56, 65, 70, 19, 19, 10, 64, 42, 37, 23, 83, 44, 3, 77, 14, 2, 75, 20, 93, 92, 93, 68, 92, 2, 15, 63, 96, 13, 48, 85, 43, 56, 1, 64, 74, 19, 73, 37, 13, 61, 12, 95, 5, 66, 24, 18, 19, 50, 38, 12, 41, 82, 31, 84, 84, 45, 98, 79, 57, 46, 15, 99, 1, 16, 62, 26, 86, 86, 14, 50, 47, 25, 97, 51, 42, 20, 68, 61, 21, 57, 24, 61, 39, 54, 44, 74, 99, 41, 4, 7, 38, 18, 58, 38, 85, 71, 63, 71, 57, 77, 72, 3, 53, 68, 5, 95, 39, 72, 7, 59, 81, 30, 71, 19, 35, 66, 44, 33, 7, 47, 92, 96, 16, 49, 34, 1, 19, 48, 23, 75, 76, 94, 29, 29, 62, 33, 75, 100, 57, 33, 11, 37, 62, 81, 7, 96, 99, 50, 81, 57, 48, 24, 52, 63, 72, 85, 63, 42, 85, 85, 69, 60, 79, 97, 40, 92, 30, 66, 43, 38, 98, 5, 74, 11, 38, 32, 59, 36, 33, 91, 92, 80, 14, 43, 42, 85, 80, 5, 78, 64, 41, 46, 75, 71, 43, 67, 62, 24, 32, 57, 61, 30, 61, 86, 92, 98, 17, 50, 33, 49, 40, 24, 28, 53, 19, 21, 89, 98, 25, 67, 13, 18, 12, 87, 88, 6, 53, 2, 29, 37, 58, 41, 66, 18, 26, 57, 68, 94, 59, 100, 94, 98, 76, 21, 3, 94, 94, 91, 91, 70, 9, 3, 87, 21, 41, 75, 26, 46, 28, 7, 82, 85, 47, 99, 54, 73, 7, 21, 18, 65, 21, 12, 15, 96, 84, 17, 89, 77, 59, 31, 47, 68, 85, 33, 40, 25, 59, 17, 22, 86, 23, 55, 22, 22, 5, 76, 94, 12, 96, 11, 28, 68, 74, 42, 15, 58, 10, 55, 34, 69, 37, 80, 88, 21, 65, 27, 98, 23, 95, 71, 9, 70, 26, 82, 91, 30, 57, 84, 93, 5, 46, 21, 24, 20, 62, 91, 29, 24, 97, 62, 92, 34, 94, 31, 54, 58, 57, 3, 80, 3, 74, 40, 72, 51, 22, 62, 80, 30, 97, 73, 34, 43, 45, 10, 14, 6, 100, 42, 81, 96, 55, 72, 81, 48, 2, 35, 5, 10, 89, 37, 13, 62, 76, 84, 12, 49, 98, 44, 79, 94, 68, 64, 88, 12, 73, 53, 69, 24, 46, 50, 72, 1, 73, 52, 48, 75, 38, 53, 36, 79, 89, 100, 40, 16, 36, 4, 65, 33, 99, 95, 26, 66, 10, 66, 77, 35, 18, 97, 58, 64, 46, 81, 64, 19, 85, 63, 45, 22, 67, 32, 100, 7, 32, 92, 23, 67, 47, 39, 51, 45, 85, 28, 62, 94, 93, 90, 28, 63, 86, 38, 26, 32, 18, 41, 2, 2, 3, 46, 76, 70, 77, 27, 76, 60, 70, 50, 78, 16, 40, 28, 12, 24, 8, 73, 18, 52, 62, 97, 14, 48, 34, 91, 31, 4, 31, 32, 5, 86, 77, 32, 7, 5, 59, 34, 65, 28, 84, 94, 96, 75, 22, 7, 99, 81, 32, 68, 32, 93, 64, 98, 92, 98, 88, 22, 1, 71, 53, 57, 8, 81, 41, 14, 38, 51, 47, 2, 30, 82, 95, 25, 57, 68, 84, 7, 100, 15, 74, 32, 7, 37, 29, 99, 86, 68, 72, 38, 90, 25, 95, 97, 57, 35, 10, 94, 37, 9, 47, 66, 42, 94, 91, 50, 13, 74, 56, 13, 88, 81, 44, 46, 70, 24, 96, 55, 43, 68, 93, 33, 44, 39, 29, 100, 25, 91, 46, 61, 51, 92, 26, 92, 37, 68, 94, 50, 41, 1, 62, 80, 82, 57, 78, 51, 32, 73, 57, 74, 40, 49, 58, 83, 87, 87, 35, 11, 29, 80, 23, 79, 23, 49, 70, 60, 16, 15, 61, 9, 16, 22, 88, 97, 78, 17, 99, 61, 90, 55, 34, 81, 56, 44, 16, 42, 30, 50, 5, 58, 81, 27, 88, 55, 27, 57, 66, 43, 72, 26, 51, 39, 47, 90, 35, 76, 7, 85, 88, 48, 39, 74, 28, 46, 17, 43, 40, 98, 44, 96, 55, 76, 22, 94, 31, 1, 2, 96, 43, 73, 74, 45, 63, 72, 86, 97, 100, 44, 33, 87, 91, 24, 60, 71, 69, 76, 13, 8, 73, 9, 3, 79, 84, 77, 72, 14, 77, 74, 62, 71, 98, 35, 67, 61, 58, 4, 9, 57, 100, 94, 44, 42, 17, 55, 12, 37, 31, 77, 45, 55, 85, 99, 86, 68, 27, 57, 34, 55, 82, 47, 77, 32, 33, 95, 44, 90, 99, 52, 47, 98, 97, 42, 39, 13, 96, 3, 50, 78, 79, 46, 33, 15, 96, 18, 82, 75, 26, 67, 29, 8, 13, 58, 91, 45, 52, 34, 35, 50, 37, 33, 99, 34, 74, 38, 98, 69, 92, 47, 47, 70, 44, 31, 84, 92, 48, 17, 66, 73, 36, 94, 32, 48, 51, 22, 93, 55, 7, 79, 4, 44, 11, 3, 77, 84, 92, 74, 52, 35, 73, 50, 4, 68, 80, 39, 59, 79, 7, 24, 4, 42, 70, 35, 42, 72, 9, 34, 26, 15, 12, 30, 10, 22, 84, 86, 57, 27, 12, 60, 61, 84, 10, 16, 51, 41, 6, 62, 20, 12, 85, 23, 6, 54, 9, 47, 26, 17, 32, 51, 84, 95, 32, 93, 16, 67, 31, 24, 93, 42, 83, 53, 77, 92, 20, 79, 33, 25, 40, 52, 89, 77, 26, 94, 30, 34, 92, 7, 51, 23, 10, 86, 17, 41, 30, 84, 60, 60, 7, 52, 53, 41, 57, 81, 33, 76, 12, 17, 53, 51, 20, 41, 27, 45, 86, 9, 78, 77, 67, 80, 51, 76, 17, 19, 69, 47, 2, 28, 58, 60, 79, 11, 100, 87, 43, 84, 63, 54, 52, 67, 57, 23, 7, 83, 67, 92, 43, 97, 20, 10, 28, 70, 85, 45, 88, 53, 43, 41, 32, 100, 52, 11, 62, 3, 97, 5, 87, 11, 58, 90, 77, 14, 13, 35, 49, 31, 78, 91, 79, 97, 52, 59, 66, 89, 3, 5, 41, 45, 97, 73, 96, 48, 35, 58, 51, 83, 62, 89, 46, 71, 30, 74, 37, 42, 61, 85, 25, 38, 27, 55, 35, 79, 13, 52, 67, 67, 57, 59, 63, 5, 83, 59, 53, 69, 68, 55, 4, 29, 43, 49, 51, 72, 74, 87, 66, 34, 71, 42, 72, 50, 96, 58, 28, 61, 9, 46, 27, 17, 56, 90, 22, 91, 100, 26, 59, 67, 80, 62, 47, 22, 62, 97, 45, 88, 84, 10, 21, 6, 3, 44, 55, 51, 1, 34, 11, 10, 79, 37, 26, 87, 78, 99, 77, 77, 24, 35, 95, 3, 49, 41, 76, 10, 38, 21, 97, 21, 82, 70, 78, 85, 13, 33, 35, 14, 66, 97, 75, 97, 33, 52, 83, 63, 51, 59, 91, 26, 45, 86, 29, 93, 26, 56, 55, 63, 76, 3, 35, 10, 24, 13, 46, 37, 97, 32, 2, 14, 28, 28, 10, 12, 79, 44, 74, 81, 2, 65, 7, 99, 50, 87, 91, 27, 42, 97, 90, 70, 52, 76, 79, 75, 40, 24, 63, 36, 55, 16, 2, 34, 43, 11, 45, 22, 55, 19, 2, 8, 35, 8, 6, 36, 46, 49, 62, 88, 97, 3, 57, 48, 79, 87, 23, 70, 10, 37, 58, 16, 53, 59, 49, 95, 69, 45, 16, 75, 15, 70, 83, 49, 29, 40, 84, 75, 88, 98, 14, 85, 100, 22, 84, 30, 8, 58, 100, 17, 95, 9, 84, 47, 67, 84, 93, 87, 28, 61, 62, 43, 30, 96, 91, 10, 35, 27, 84, 75, 24, 49, 11, 75, 70, 94, 5, 77, 52, 4, 45, 98, 64, 28, 96, 30, 63, 88, 16, 91, 48, 29, 33, 29, 76, 75, 39, 63, 53, 74, 37, 28, 23, 47, 3, 92, 92, 7, 21, 43, 62, 65, 92, 25, 45, 87, 6, 7, 75, 73, 97, 74, 2, 81, 55, 29, 8, 45, 91, 60, 70, 27, 88, 92, 25, 42, 36, 69, 48, 8, 11, 61, 72, 55, 37, 68, 41, 42, 75, 67, 14, 23, 93, 67, 4, 47, 96, 11, 43, 86, 22, 12, 65, 61, 56, 41, 2, 43, 9, 49, 50, 72, 61, 73, 26, 97, 41, 18, 38, 67, 85, 4, 89, 77, 70, 44, 75, 17, 6, 17, 55, 28, 28, 71, 88, 83, 63, 42, 25, 72, 90, 26, 95, 3, 99, 72, 99, 91, 89, 89, 57, 25, 44, 97, 1, 65, 41, 27, 82, 46, 43, 88, 25, 71, 58, 65, 5, 20, 6, 82, 43, 47, 7, 89, 49, 5, 60, 100, 47, 1, 40, 3, 77, 83, 100, 78, 99, 92, 56, 32, 37, 99, 19, 14, 21, 76, 78, 25, 96, 83, 6, 90, 81, 65, 79, 30, 21, 38, 81, 68, 90, 20, 70, 67, 54, 21, 96, 4, 12, 51, 36, 1, 1, 54, 14, 21, 30, 91, 98, 77, 25, 3, 18, 5, 19, 96, 86, 40, 86, 18, 7, 75, 89, 76, 93, 94, 49, 88, 98, 60, 91, 33, 60, 91, 38, 73, 64, 67, 15, 61, 95, 91, 15, 13, 48, 34, 60, 33, 73, 45, 3, 79, 72, 91, 6, 64, 85, 6, 4, 82, 66, 94, 66, 77, 36, 3, 50, 99, 22, 16, 11, 68, 7, 78, 80, 6, 11, 40, 90, 35, 36, 92, 65, 7, 83, 22, 71, 67, 28, 74, 100, 93, 19, 65, 69, 6, 67, 70, 57, 40, 38, 67, 8, 96, 44, 87, 1, 6, 78, 90, 40, 14, 82, 4, 72, 64, 26, 42, 82, 53, 67, 81, 97, 85, 45, 17, 91, 63, 87, 47, 55, 24, 65, 62, 19, 9, 100, 71, 14, 78, 60, 6, 43, 41, 9, 14, 56, 86, 8, 37, 90, 74, 69, 86, 11, 13, 3, 1, 28, 41, 99, 82, 16, 63, 43, 86, 23, 94, 56, 89, 23, 15, 94, 17, 8, 54, 31, 63, 40, 90, 52, 81, 63, 20, 19, 73, 85, 73, 25, 64, 13, 75, 45, 28, 90, 39, 65, 12, 84, 20, 100, 7, 86, 45, 23, 93, 99, 5, 8, 90, 94, 59, 22, 9, 30, 40, 33, 14, 12, 10, 77, 76, 84, 73, 55, 73, 63, 19, 37, 47, 38, 88, 53, 24, 33, 27, 68, 83, 32, 75, 24, 25, 85, 45, 85, 15, 85, 18, 28, 48, 27, 57, 24, 10, 29, 78, 35, 44, 97, 71, 42, 86, 10, 46, 9, 94, 72, 29, 76, 3, 3, 51, 80, 88, 96, 64, 2, 32, 33, 81, 79, 59, 89, 2, 69, 18, 32, 55, 13, 28, 77, 54, 13, 86, 99, 74, 80, 22, 2, 7, 77, 56, 58, 56, 95, 5, 71, 48, 36, 4, 29, 14, 62, 17, 68, 82, 86, 99, 88, 50, 78, 64, 3, 42, 2, 53, 67, 33, 27, 68, 39, 3, 76, 48, 10, 70, 52, 32, 18, 39, 35, 46, 5, 49, 14, 72, 82, 52, 22, 70, 1, 51, 85, 56, 92, 86, 60, 59, 18, 86, 78, 9, 40, 53, 8, 49, 23, 60, 81, 92, 50, 67, 37, 54, 67, 2, 77, 49, 5, 98, 70, 6, 48, 6, 13, 92, 44, 72, 50, 61, 10, 79, 21, 49, 32, 29, 50, 6, 40, 30, 97, 89, 48, 85, 43, 15, 38, 19, 15, 43, 69, 36, 48, 68, 41, 60, 59, 84, 83, 60, 97, 44, 39, 17, 93, 22, 97, 42, 27, 36, 23, 75, 25, 70, 59, 19, 36, 96, 37, 50, 38, 57, 85, 37, 25, 78, 48, 83, 61, 83, 95, 9, 26, 33, 26, 70, 6, 74, 63, 32, 10, 85, 58, 86, 7, 16, 4, 94, 63, 40, 44, 53, 49, 80, 41, 73, 57, 89, 7, 70, 23, 1, 78, 48, 85, 55, 18, 90, 29, 80, 73, 90, 17, 30, 75, 75, 97, 78, 68, 60, 69, 63, 64, 17, 95, 4, 89, 3, 44, 48, 72, 66, 100, 2, 14, 85, 8, 83, 26, 36, 14, 99, 77, 82, 80, 51, 56, 77, 80, 76, 88, 49, 90, 51, 17, 84, 6, 58, 87, 50, 5, 10, 15, 4, 63, 80, 40, 71, 62, 66, 58, 76, 16, 35, 57, 95, 37, 65, 23, 17, 92, 10, 65, 81, 12, 33, 17, 70, 90, 55, 19, 94, 16, 33, 50, 79, 13, 89, 49, 26, 6, 58, 53, 21, 92, 10, 68, 29, 26, 90, 97, 17, 52, 13, 49, 15, 45, 65, 84, 35, 19, 54, 80, 35, 87, 29, 13, 51, 18, 13, 28, 23, 70, 81, 96, 14, 42, 63, 94, 67, 4, 90, 35, 7, 54, 83, 74, 98, 48, 57, 84, 18, 11, 64, 52, 49, 92, 16, 51, 61, 80, 30, 36, 2, 10, 31, 67, 51, 45, 60, 69, 100, 1, 3, 7, 54, 38, 80, 3, 85, 88, 87, 54, 50, 2, 58, 50, 45, 25, 52, 6, 5, 82, 93, 58, 91, 23, 24, 94, 19, 83, 14, 18, 35, 17, 24, 40, 6, 55, 42, 42, 95, 80, 95, 96, 33, 52, 46, 78, 77, 49, 35, 33, 30, 27, 90, 73, 1, 13, 18, 19, 47, 31, 36, 81, 99, 60, 20, 4, 66, 13, 45, 60, 45, 40, 8, 77, 43, 53, 6, 71, 53, 40, 3, 83, 18, 92, 7, 18, 56, 24, 36, 2, 54, 72, 82, 53, 83, 53, 8, 48, 18, 53, 60, 62, 44, 67, 90, 38, 71, 48, 9, 23, 39, 11, 57, 57, 55, 63, 74, 10, 38, 62, 12, 44, 33, 45, 48, 67, 98, 55, 66, 15, 59, 25, 28, 2, 43, 69, 40, 65, 16, 48, 40, 7, 10, 48, 63, 64, 63, 88, 74, 100, 49, 85, 43, 33, 81, 90, 99, 78, 97, 65, 44, 55, 41, 23, 9, 36, 92, 100, 52, 59, 99, 91, 65, 8, 91, 79, 72, 53, 19, 97, 4, 67, 33, 99, 52, 13, 40, 50, 91, 36, 66, 86, 43, 7, 61, 51, 94, 4, 50, 45, 62, 48, 88, 79, 7, 78, 9, 78, 82, 27, 26, 37, 46, 58, 35, 97, 71, 75, 98, 13, 62, 64, 50, 4, 70, 10, 54, 15, 13, 55, 59, 27, 54, 98, 5, 61, 75, 65, 90, 8, 92, 16, 45, 89, 73, 79, 85, 95, 5, 82, 7, 67, 45, 57, 22, 66, 18, 28, 80, 31, 82, 91, 57, 36, 88, 13, 96, 15, 77, 85, 22, 20, 52, 18, 8, 25, 49, 92, 19, 53, 26, 78, 71, 22, 86, 45, 88, 3, 72, 19, 85, 5, 9, 41, 40, 49, 53, 87, 63, 82, 24, 36, 53, 75, 54, 61, 51, 2, 4, 70, 6, 81, 99, 29, 3, 36, 73, 90, 38, 44, 60, 23, 48, 21, 15, 40, 69, 20, 78, 83, 53, 1, 70, 5, 28, 75, 65, 78, 28, 21, 99, 34, 1, 97, 62, 3, 84, 86, 44, 22, 81, 56, 96, 80, 76, 62, 19, 96, 81, 49, 78, 85, 1, 99, 90, 28, 74, 6, 6, 1, 26, 4, 86, 79, 53, 99, 81, 36, 84, 77, 9, 64, 32, 56, 44, 7, 70, 14, 54, 2, 14, 83, 87, 15, 81, 76, 42, 54, 81, 99, 7, 7, 55, 92, 85, 7, 91, 17, 94, 74, 93, 55, 90, 76, 62, 85, 34, 31, 50, 87, 33, 64, 69, 19, 78, 50, 46, 71, 55, 26, 70, 61, 84, 24, 53, 20, 82, 43, 89, 27, 68, 33, 81, 57, 9, 95, 41, 42, 77, 91, 81, 9, 6, 49, 79, 83, 50, 76, 53, 5, 2, 74, 17, 37, 97, 69, 57, 78, 63, 97, 57, 83, 29, 89, 39, 37, 83, 32, 31, 60, 74, 11, 20, 31, 11, 51, 13, 13, 26, 17, 69, 79, 43, 85, 16, 39, 6, 24, 69, 20, 20, 25, 2, 48, 13, 93, 37, 48, 76, 19, 59, 1, 81, 78, 31, 91, 80, 95, 3, 6, 63, 23, 84, 5, 8, 51, 44, 13, 74, 64, 84, 45, 40, 86, 93, 52, 78, 81, 51, 5, 99, 9, 5, 79, 87, 35, 21, 18, 29, 76, 23, 91, 98, 59, 96, 5, 61, 91, 69, 35, 6, 53, 79, 45, 90, 23, 48, 67, 55, 99, 71, 53, 7, 75, 31, 45, 61, 4, 63, 89, 79, 37, 31, 76, 47, 78, 33, 8, 20, 1, 94, 25, 5, 24, 21, 94, 47, 69, 12, 53, 19, 82, 6, 25, 8, 88, 22, 20, 91, 36, 60, 69, 24, 43, 97, 71, 20, 29, 30, 92, 81, 23, 68, 86, 46, 89, 79, 44, 9, 91, 97, 27, 24, 2, 3, 84, 41, 24, 55, 32, 11, 15, 52, 35, 57, 48, 57, 28, 76, 86, 19, 57, 8, 87, 94, 5, 27, 72, 49, 87, 14, 45, 13, 90, 98, 67, 25, 90, 43, 79, 21, 53, 93, 73, 39, 49, 72, 95, 29, 48, 80, 47, 56, 39, 85, 49, 44, 63, 72, 92, 49, 38, 88, 13, 27, 37, 80, 51, 26, 22, 29, 99, 74, 74, 23, 13, 74, 94, 59, 2, 41, 39, 1, 48, 77, 85, 48, 20, 100, 20, 63, 48, 9, 50, 13, 35, 38, 92, 37, 64, 13, 17, 14, 38, 90, 36, 2, 16, 29, 61, 17, 22, 99, 17, 69, 27, 54, 69, 99, 53, 88, 61, 52, 48, 63, 64, 82, 100, 7, 70, 15, 19, 38, 28, 9, 28, 63, 10, 95, 44, 70, 63, 65, 20, 32, 85, 47, 85, 53, 97, 89, 92, 57, 92, 39, 19, 8, 72, 71, 14, 41, 85, 85, 79, 65, 93, 58, 79, 2, 52, 22, 24, 66, 86, 43, 97, 71, 41, 81, 23, 37, 21, 67, 46, 13, 5, 64, 72, 77, 86, 85, 69, 71, 69, 99, 87, 13, 56, 65, 15, 59, 87, 90, 25, 72, 84, 21, 94, 25, 54, 69, 13, 26, 35, 58, 90, 39, 74, 61, 67, 59, 98, 36, 81, 66, 34, 67, 79, 42, 84, 45, 52, 70, 34, 28, 41, 69, 49, 87, 93, 54, 55, 58, 79, 89, 67, 21, 79, 92, 81, 46, 3, 78, 33, 35, 96, 18, 54, 26, 11, 37, 22, 63, 6, 7, 90, 98, 75, 90, 84, 20, 95, 38, 77, 26, 78, 95, 46, 57, 87, 26, 54, 89, 56, 38, 23, 51, 7, 28, 76, 18, 64, 97, 32, 69, 55, 73, 67, 29, 15, 2, 48, 9, 92, 24, 34, 69, 19, 79, 77, 57, 57, 82, 97, 12, 71, 71, 14, 78, 99, 41, 47, 62, 89, 30, 31, 43, 2, 49, 71, 16, 50, 19, 25, 93, 94, 10, 62, 64, 41, 90, 20, 97, 72, 16, 60, 42, 87, 25, 71, 85, 65, 69, 98, 53, 98, 28, 95, 52, 28, 17, 67, 30, 35, 43, 22, 81, 53, 35, 44, 45, 25, 16, 41, 96, 31, 52, 89, 69, 76, 12, 5, 92, 32, 3, 44, 30, 82, 90, 81, 10, 58, 99, 39, 45, 42, 12, 25, 46, 47, 68, 90, 71, 83, 82, 18, 66, 85, 58, 34, 12, 69, 39, 3, 1, 93, 46, 82, 74, 87, 14, 83, 44, 12, 73, 88, 5, 85, 64, 50, 83, 32, 91, 53, 66, 24, 22, 83, 8, 79, 69, 19, 100, 59, 73, 52, 51, 18, 33, 24, 56, 46, 7, 52, 9, 31, 39, 14, 15, 3, 15, 49, 86, 58, 1, 3, 81, 22, 38, 41, 53, 6, 11, 52, 64, 84, 3, 14, 53, 87, 37, 61, 84, 95, 12, 92, 26, 2, 57, 92, 56, 24, 41, 93, 81, 93, 96, 13, 67, 85, 5, 19, 90, 16, 70, 5, 51, 24, 18, 55, 10, 6, 15, 45, 53, 26, 88, 30, 80, 97, 73, 35, 20, 65, 28, 52, 58, 75, 64, 24, 59, 21, 42, 48, 88, 63, 4, 38, 38, 21, 92, 99, 78, 59, 43, 82, 36, 82, 63, 15, 78, 36, 50, 97, 100, 77, 100, 57, 3, 16, 32, 61, 36, 25, 60, 23, 39, 63, 12, 76, 35, 55, 74, 64, 13, 68, 46, 49, 50, 8, 63, 27, 43, 64, 76, 95, 92, 27, 51, 94, 42, 35, 54, 77, 59, 13, 51, 98, 75, 62, 25, 9, 17, 99, 25, 29, 18, 70, 29, 19, 29, 44, 46, 72, 7, 73, 18, 99, 99, 68, 44, 41, 54, 98, 69, 13, 62, 72, 62, 89, 33, 86, 49, 1, 36, 73, 82, 54, 94, 10, 72, 23, 5, 69, 46, 12, 93, 63, 62, 44, 82, 5, 36, 36, 54, 4, 48, 68, 75, 61, 8, 60, 46, 56, 60, 82, 81, 93, 87, 74, 55, 10, 96, 59, 31, 41, 22, 23, 3, 83, 66, 85, 40, 1, 20, 45, 57, 19, 64, 83, 79, 71, 94, 76, 27, 6, 9, 7, 98, 95, 80, 52, 57, 28, 63, 87, 68, 84, 61, 23, 19, 79, 59, 58, 79, 30, 54, 87, 100, 18, 22, 78, 88, 67, 5, 66, 72, 14, 24, 22, 60, 56, 25, 16, 83, 87, 54, 2, 71, 15, 76, 89, 93, 34, 98, 23, 63, 3, 62, 62, 20, 35, 91, 60, 1, 96, 25, 25, 61, 49, 46, 20, 4, 22, 88, 38, 9, 41, 39, 31, 7, 15, 71, 51, 100, 20, 74, 15, 22, 87, 76, 94, 21, 19, 53, 21, 66, 29, 45, 26, 29, 42, 45, 84, 64, 84, 73, 24, 25, 12, 6, 83, 78, 28, 34, 29, 47, 7, 43, 20, 93, 71, 65, 65, 89, 69, 85, 54, 50, 82, 79, 78, 75, 75, 14, 38, 59, 86, 13, 35, 49, 70, 17, 78, 97, 50, 7, 95, 8, 49, 15, 52, 19, 31, 16, 59, 100, 53, 12, 49, 34, 42, 78, 60, 17, 91, 50, 27, 77, 62, 61, 25, 32, 77, 3, 28, 79, 9, 75, 86, 9, 41, 38, 80, 71, 5, 38, 22, 57, 2, 70, 42, 43, 48, 2, 11, 90, 51, 37, 66, 64, 97, 43, 95, 26, 45, 75, 4, 5, 49, 41, 65, 89, 30, 44, 59, 35, 82, 81, 91, 35, 2, 85, 77, 1, 86, 88, 91, 88, 76, 8, 51, 25, 50, 46, 50, 46, 72, 5, 2, 20, 45, 67, 60, 75, 10, 70, 61, 43, 2, 3, 77, 4, 87, 6, 56, 72, 45, 98, 59, 20, 6, 62, 44, 7, 7, 45, 53, 78, 49, 54, 49, 46, 72, 8, 20, 82, 29, 32, 76, 31, 34, 5, 86, 21, 10, 41, 44, 54, 39, 55, 25, 96, 16, 69, 2, 74, 65, 54, 3, 14, 60, 51, 59, 31, 10, 30, 64, 90, 61, 40, 20, 94, 96, 5, 66, 5, 98, 62, 10, 36, 16, 34, 83, 83, 54, 84, 56, 19, 90, 10, 84, 49, 12, 42, 31, 21, 23, 47, 62, 83, 86, 82, 28, 33, 38, 46, 37, 35, 7, 98, 22, 74, 31, 56, 56, 37, 40, 63, 7, 29, 72, 90, 29, 83, 83, 59, 55, 5, 5, 16, 39, 42, 49, 66, 74, 87, 63, 62, 73, 69, 59, 47, 94, 42, 2, 49, 78, 93, 63, 84, 21, 34, 25, 49, 16, 7, 60, 22, 11, 64, 38, 49, 58, 86, 66, 31, 24, 29, 45, 49, 49, 3, 47, 95, 96, 48, 43, 73, 41, 58, 8, 13, 91, 32, 62, 59, 38, 21, 80, 100, 36, 69, 48, 93, 7, 66, 76, 82, 46, 72, 30, 46, 74, 76, 40, 70, 76, 83, 94, 68, 40, 54, 32, 82, 85, 93, 40, 75, 65, 72, 74, 53, 92, 22, 97, 98, 87, 72, 80, 84, 43, 61, 29, 69, 89, 69, 90, 16, 3, 35, 35, 94, 88, 66, 75, 73, 11, 67, 99, 75, 90, 72, 79, 81, 93, 76, 31, 31, 99, 62, 14, 94, 22, 43, 14, 62, 63, 3, 77, 65, 89, 63, 58, 77, 29, 32, 1, 39, 50, 99, 65, 39, 70, 44, 72, 15, 19, 2, 97, 17, 63, 63, 62, 36, 5, 75, 50, 19, 77, 78, 83, 18, 41, 40, 94, 69, 23, 94, 7, 25, 44, 71, 63, 13, 66, 86, 79, 84, 87, 76, 53, 1, 38, 14, 89, 94, 89, 38, 12, 17, 15, 46, 34, 7, 85, 79, 75, 59, 24, 33, 83, 67, 56, 98, 32, 21, 83, 62, 57, 70, 37, 9, 22, 26, 74, 10, 19, 14, 99, 82, 31, 14, 27, 16, 72, 63, 47, 47, 22, 70, 31, 4, 89, 86, 1, 20, 7, 84, 81, 15, 5, 70, 23, 26, 95, 48, 36, 66, 62, 86, 47, 44, 99, 26, 11, 71, 88, 57, 69, 9, 27, 99, 65, 15, 37, 17, 86, 95, 100, 18, 9, 56, 39, 83, 82, 34, 30, 69, 51, 91, 54, 49, 86, 5, 74, 97, 27, 62, 53, 47, 22, 31, 97, 86, 45, 33, 55, 82, 27, 54, 52, 35, 62, 90, 69, 95, 75, 99, 15, 25, 41, 20, 74, 27, 24, 47, 75, 2, 60, 27, 48, 34, 10, 45, 71, 54, 29, 25, 88, 56, 31, 39, 42, 92, 28, 11, 86, 3, 61, 100, 79, 1, 19, 52, 79, 95, 51, 53, 96, 62, 32, 96, 95, 41, 92, 66, 46, 20, 42, 85, 27, 72, 23, 69, 63, 3, 31, 100, 5, 91, 99, 83, 91, 70, 87, 22, 16, 89, 26, 63, 50, 57, 58, 45, 49, 1, 62, 47, 73, 3, 31, 99, 27, 6, 19, 89, 8, 49, 89, 64, 39, 39, 98, 82, 60, 84, 55, 75, 72, 80, 38, 74, 89, 47, 70, 37, 48, 83, 35, 20, 85, 66, 70, 11, 71, 89, 52, 30, 37, 92, 93, 28, 82, 90, 9, 42, 26, 63, 68, 49, 94, 57, 74, 82, 4, 43, 71, 3, 25, 5, 74, 62, 22, 43, 24, 92, 31, 75, 73, 68, 18, 65, 95, 100, 7, 55, 93, 84, 69, 12, 84, 14, 69, 58, 96, 72, 100, 66, 74, 77, 22, 47, 38, 44, 41, 61, 87, 72, 36, 60, 91, 5, 24, 85, 4, 82, 91, 48, 17, 11, 60, 1, 24, 28, 58, 71, 51, 9, 36, 76, 85, 58, 74, 22, 1, 14, 35, 87, 85, 22, 98, 75, 26, 22, 11, 82, 55, 53, 29, 72, 63, 40, 24, 39, 67, 81, 9, 17, 41, 97, 92, 78, 6, 65, 99, 58, 79, 33, 44, 15, 6, 94, 90, 32, 15, 52, 13, 21, 5, 93, 44, 19, 33, 67, 57, 51, 99, 18, 68, 40, 14, 11, 17, 19, 28, 67, 76, 58, 52, 71, 24, 57, 64, 13, 40, 30, 17, 52, 3, 21, 45, 46, 39, 29, 13, 48, 79, 11, 65, 98, 2, 30, 9, 18, 48, 88, 37, 75, 97, 40, 45, 20, 96, 61, 85, 36, 42, 1, 39, 44, 21, 35, 90, 11, 63, 2, 10, 42, 64, 74, 39, 66, 3, 99, 35, 2, 38, 71, 76, 34, 10, 73, 6, 58, 33, 90, 45, 74, 42, 83, 70, 62, 18, 59, 24, 32, 12, 34, 25, 75, 59, 16, 40, 14, 66, 75, 15, 4, 97, 43, 89, 59, 67, 94, 16, 51, 35, 60, 76, 76, 94, 45, 89, 63, 3, 65, 95, 14, 50, 19, 89, 8, 34, 80, 73, 100, 54, 40, 55, 3, 82, 95, 61, 100, 41, 76, 50, 75, 87, 25, 3, 80, 70, 43, 43, 24, 7, 89, 38, 56, 59, 78, 64, 93, 57, 88, 44, 63, 27, 50, 65, 60, 44, 25, 59, 84, 52, 8, 59, 90, 33, 13, 69, 54, 55, 63, 77, 62, 3, 66, 17, 62, 43, 32, 6, 52, 72, 49, 14, 98, 98, 30, 58, 41, 54, 16, 77, 57, 24, 35, 46, 8, 99, 66, 13, 53, 81, 89, 66, 35, 7, 83, 96, 49, 66, 1, 100, 37, 1, 65, 87, 98, 94, 44, 91, 99, 11, 67, 55, 34, 53, 52, 93, 51, 70, 57, 55, 2, 98, 21, 36, 4, 55, 32, 52, 72, 84, 4, 61, 85, 68, 47, 82, 62, 90, 24, 60, 100, 42, 67, 86, 94, 70, 30, 96, 39, 87, 51, 40, 84, 71, 76, 87, 25, 59, 90, 96, 42, 93, 56, 26, 61, 54, 60, 74, 43, 35, 33, 95, 77, 51, 32, 70, 21, 13, 66, 59, 51, 68, 51, 34, 38, 78, 72, 14, 36, 14, 61, 29, 6, 69, 7, 18, 22, 66, 43, 17, 52, 28, 11, 28, 78, 94, 50, 98, 6, 15, 9, 9, 34, 11, 94, 23, 88, 66, 36, 75, 31, 96, 3, 88, 64, 61, 6, 38, 26, 100, 54, 78, 27, 16, 57, 5, 9, 6, 54, 66, 72, 14, 74, 5, 24, 20, 27, 11, 37, 14, 37, 67, 10, 40, 54, 25, 100, 11, 62, 78, 11, 15, 7, 37, 30, 15, 41, 90, 21, 47, 8, 92, 60, 33, 49, 84, 52, 75, 46, 88, 89, 83, 54, 50, 74, 60, 26, 25, 70, 88, 54, 80, 54, 60, 69, 36, 27, 61, 77, 47, 7, 84, 90, 67, 69, 38, 2, 72, 65, 47, 60, 5, 29, 65, 6, 2, 76, 31, 27, 46, 18, 80, 77, 24, 92, 45, 59, 70, 58, 87, 16, 64, 71, 57, 82, 91, 47, 83, 62, 11, 82, 73, 67, 10, 38, 72, 64, 65, 2, 42, 10, 72, 73, 39, 47, 16, 35, 5, 85, 92, 91, 52, 56, 13, 9, 89, 55, 55, 72, 17, 17, 5, 89, 83, 14, 78, 54, 29, 43, 7, 70, 4, 30, 95, 42, 76, 10, 77, 32, 95, 20, 75, 98, 75, 39, 6, 64, 94, 12, 87, 10, 28, 91, 50, 62, 56, 80, 67, 85, 74, 26, 6, 29, 55, 100, 23, 31, 62, 51, 62, 8, 70, 36, 5, 97, 75, 11, 12, 20, 74, 50, 81, 54, 40, 30, 15, 47, 61, 82, 83, 86, 7, 41, 67, 13, 40, 89, 43, 1, 39, 57, 60, 60, 92, 65, 56, 18, 27, 19, 37, 100, 68, 17, 53, 59, 99, 20, 6, 11, 53, 40, 49, 11, 80, 15, 23, 20, 3, 66, 72, 93, 22, 32, 4, 65, 48, 60, 35, 74, 78, 23, 73, 98, 92, 78, 56, 42, 97, 61, 4, 49, 53, 52, 59, 32, 66, 33, 3, 20, 98, 27, 64, 71, 10, 68, 88, 57, 79, 74, 30, 56, 96, 54, 5, 39, 83, 61, 80, 31, 73, 36, 31, 25, 87, 89, 57, 5, 22, 59, 24, 71, 37, 40, 94, 46, 7, 81, 2, 85, 6, 83, 92, 1, 89, 97, 92, 71, 57, 23, 2, 29, 58, 32, 6, 45, 73, 62, 1, 46, 72, 24, 68, 9, 15, 61, 6, 21, 93, 8, 5, 98, 42, 49, 51, 30, 45, 42, 53, 53, 64, 6, 33, 74, 37, 38, 18, 61, 51, 18, 58, 23, 93, 26, 83, 8, 86, 88, 80, 31, 47, 37, 28, 89, 85, 30, 70, 81, 71, 22, 33, 87, 27, 65, 60, 16, 3, 29, 28, 53, 98, 86, 27, 42, 63, 9, 49, 48, 49, 81, 30, 95, 17, 58, 35, 1, 39, 57, 81, 62, 30, 65, 48, 9, 29, 59, 24, 31, 39, 3, 36, 36, 40, 62, 77, 2, 23, 78, 2, 71, 58, 31, 17, 74, 40, 4, 26, 79, 60, 58, 40, 41, 22, 39, 49, 2, 97, 24, 85, 35, 27, 20, 22, 66, 33, 98, 68, 55, 75, 69, 77, 84, 51, 46, 9, 91, 49, 86, 69, 60, 43, 60, 100, 16, 98, 49, 70, 46, 24, 54, 32, 50, 25, 53, 68, 57, 50, 87, 64, 77, 7, 40, 60, 57, 85, 21, 47, 85, 6, 67, 96, 1, 26, 48, 68, 75, 48, 37, 20, 71, 42, 51, 21, 66, 3, 40, 23, 5, 26, 38, 81, 32, 77, 92, 88, 14, 12, 87, 50, 18, 5, 46, 18, 31, 45, 37, 57, 92, 74, 77, 62, 15, 27, 34, 81, 82, 25, 55, 86, 50, 92, 18, 33, 20, 61, 73, 85, 73, 59, 35, 42, 15, 32, 11, 97, 76, 47, 54, 67, 72, 30, 80, 87, 8, 66, 19, 89, 90, 25, 26, 40, 68, 43, 24, 87, 56, 96, 72, 28, 6, 6, 21, 21, 89, 31, 17, 64, 29, 70, 82, 1, 99, 13, 39, 59, 78, 57, 47, 68, 33, 25, 59, 100, 19, 82, 86, 74, 30, 9, 1, 35, 66, 73, 55, 54, 3, 24, 17, 84, 93, 50, 84, 44, 63, 22, 2, 40, 30, 100, 59, 62, 24, 69, 61, 43, 3, 98, 16, 32, 7, 69, 66, 72, 41, 73, 26, 96, 96, 94, 79, 88, 96, 14, 83, 58, 35, 84, 49, 64, 84, 60, 77, 7, 28, 37, 1, 30, 34, 17, 61, 92, 85, 27, 64, 77, 51, 41, 72, 46, 34, 50, 85, 29, 63, 68, 38, 49, 3, 87, 64, 38, 46, 40, 97, 25, 28, 97, 55, 14, 13, 15, 5, 49, 93, 20, 26, 43, 60, 97, 40, 94, 99, 25, 74, 13, 44, 12, 62, 46, 50, 77, 84, 47, 69, 80, 71, 96, 28, 25, 61, 41, 92, 66, 41, 36, 85, 66, 79, 45, 63, 70, 90, 13, 94, 15, 25, 89, 26, 38, 35, 27, 15, 70, 73, 83, 1, 44, 30, 28, 68, 91, 20, 11, 8, 61, 47, 44, 26, 77, 40, 40, 46, 29, 52, 92, 96, 29, 80, 21, 66, 14, 48, 32, 35, 72, 14, 35, 15, 96, 15, 35, 86, 34, 45, 45, 94, 43, 88, 20, 19, 28, 11, 65, 8, 63, 8, 3, 43, 87, 76, 8, 53, 75, 40, 87, 46, 5, 74, 13, 52, 88, 47, 37, 21, 43, 33, 67, 38, 21, 38, 56, 100, 48, 72, 7, 62, 79, 62, 4, 18, 37, 64, 70, 63, 3, 8, 8, 59, 33, 72, 11, 20, 70, 99, 93, 13, 32, 59, 2, 4, 48, 57, 3, 95, 81, 61, 9, 11, 74, 12, 28, 62, 75, 49, 24, 29, 9, 84, 40, 41, 55, 50, 13, 25, 100, 5, 89, 83, 15, 90, 86, 62, 98, 40, 8, 78, 53, 16, 89, 26, 80, 68, 88, 6, 17, 63, 87, 25, 46, 26, 17, 53, 27, 29, 77, 26, 33, 17, 9, 99, 6, 46, 12, 3, 86, 20, 33, 90, 87, 21, 15, 18, 40, 54, 24, 8, 69, 10, 32, 66, 87, 49, 18, 13, 29, 46, 38, 62, 62, 98, 12, 19, 44, 24, 22, 81, 95, 6, 70, 33, 78, 36, 51, 17, 42, 26, 25, 10, 87, 8, 75, 73, 8, 45, 85, 37, 90, 74, 50, 4, 72, 61, 22, 67, 36, 95, 99, 82, 100, 20, 15, 77, 7, 17, 94, 48, 94, 70, 9, 80, 77, 36, 52, 85, 32, 88, 73, 21, 61, 22, 24, 84, 34, 98, 2, 70, 92, 100, 51, 92, 19, 17, 68, 26, 85, 13, 25, 78, 82, 86, 57, 59, 21, 60, 95, 52, 47, 67, 24, 60, 40, 100, 95, 73, 97, 97, 94, 40, 48, 97, 31, 67, 13, 51, 44, 98, 15, 20, 27, 97, 5, 84, 7, 77, 95, 53, 80, 94, 71, 56, 5, 10, 7, 99, 82, 3, 95, 28, 94, 43, 24, 25, 61, 36, 27, 56, 85, 41, 27, 12, 89, 84, 47, 47, 12, 41, 99, 92, 86, 69, 99, 90, 78, 5, 89, 12, 59, 35, 39, 52, 29, 62, 28, 89, 49, 54, 96, 86, 47, 75, 97, 87, 58, 43, 34, 69, 35, 32, 12, 21, 53, 10, 10, 30, 66, 50, 93, 24, 85, 83, 28, 13, 96, 55, 54, 45, 61, 1, 82, 59, 75, 78, 45, 32, 72, 78, 1, 58, 62, 64, 78, 14, 74, 40, 95, 91, 89, 40, 15, 25, 22, 42, 38, 18, 48, 43, 14, 8, 43, 95, 18, 18, 24, 63, 1, 47, 92, 53, 4, 53, 17, 34, 66, 42, 73, 13, 32, 13, 52, 98, 38, 25, 91, 75, 94, 39, 69, 7, 98, 11, 53, 16, 80, 28, 30, 81, 74, 21, 85, 78, 74, 1, 11, 91, 94, 35, 55, 26, 47, 6, 23, 84, 31, 14, 10, 76, 4, 78, 83, 1, 41, 87, 68, 20, 15, 97, 52, 40, 18, 37, 17, 43, 89, 79, 85, 83, 13, 40, 8, 60, 97, 82, 95, 79, 47, 5, 55, 2, 34, 89, 3, 74, 75, 22, 46, 41, 19, 97, 81, 88, 33, 49, 30, 74, 80, 66, 56, 92, 5, 15, 3, 54, 48, 50, 32, 47, 6, 86, 48, 39, 26, 50, 65, 53, 24, 10, 93, 42, 6, 25, 81, 91, 26, 62, 64, 5, 27, 71, 48, 84, 85, 3, 37, 84, 52, 20, 30, 57, 58, 78, 47, 83, 79, 11, 35, 2, 20, 28, 95, 26, 4, 75, 68, 29, 36, 83, 85, 15, 53, 85, 98, 89, 87, 86, 24, 90, 5, 54, 46, 62, 83, 44, 45, 61, 55, 79, 15, 26, 58, 61, 3, 14, 36, 70, 94, 23, 52, 79, 37, 56, 15, 86, 96, 1, 71, 20, 90, 76, 73, 87, 89, 55, 30, 33, 67, 36, 64, 33, 62, 73, 94, 64, 38, 81, 34, 32, 55, 37, 62, 44, 45, 76, 29, 40, 76, 52, 59, 17, 79, 83, 3, 67, 37, 84, 52, 56, 20, 67, 40, 81, 91, 85, 44, 29, 17, 77, 12, 72, 66, 25, 67, 10, 100, 95, 49, 27, 98, 8, 43, 28, 90, 97, 47, 79, 80, 50, 86, 99, 68, 77, 79, 58, 62, 23, 38, 78, 51, 49, 1, 68, 73, 67, 77, 24, 14, 78, 50, 11, 37, 44, 91, 78, 92, 37, 8, 24, 86, 93, 22, 53, 22, 53, 62, 83, 27, 100, 12, 29, 100, 13, 97, 25, 31, 73, 48, 44, 2, 50, 7, 38, 45, 97, 16, 37, 33, 23, 60, 70, 68, 33, 74, 89, 85, 35, 23, 63, 34, 34, 92, 86, 98, 88, 10, 29, 12, 57, 72, 66, 6, 78, 3, 51, 26, 18, 39, 58, 41, 50, 79, 60, 34, 52, 48, 19, 87, 70, 33, 72, 3, 24, 57, 53, 63, 66, 81, 27, 23, 52, 92, 80, 82, 94, 82, 7, 64, 72, 17, 56, 21, 47, 15, 55, 99, 62, 25, 37, 83, 9, 8, 37, 85, 17, 89, 47, 82, 21, 25, 56, 25, 68, 88, 6, 14, 69, 64, 77, 93, 32, 84, 65, 79, 98, 19, 29, 11, 95, 65, 45, 4, 72, 81, 88, 88, 22, 86, 22, 42, 63, 29, 66, 30, 16, 23, 95, 37, 87, 71, 29, 70, 6, 93, 48, 3, 64, 28, 65, 10, 92, 61, 65, 16, 42, 52, 55, 63, 90, 76, 56, 4, 5, 22, 33, 72, 44, 28, 8, 82, 50, 36, 52, 56, 81, 51, 10, 96, 79, 27, 5, 22, 87, 70, 37, 80, 73, 44, 94, 62, 19, 50, 17, 75, 71, 50, 99, 66, 29, 6, 48, 30, 94, 99, 37, 74, 1, 99, 69, 79, 77, 25, 53, 15, 94, 89, 95, 67, 32, 88, 80, 3, 89, 97, 29, 11, 98, 27, 77, 78, 85, 76, 59, 78, 26, 48, 3, 26, 46, 23, 57, 74, 47, 9, 88, 93, 49, 34, 59, 33, 22, 90, 35, 62, 38, 15, 73, 87, 42, 1, 64, 26, 76, 75, 55, 1, 22, 57, 78, 19, 31, 34, 92, 77, 94, 79, 69, 43, 65, 79, 75, 86, 21, 61, 99, 58, 75, 23, 45, 68, 23, 60, 45, 98, 34, 99, 50, 7, 7, 28, 25, 37, 13, 16, 66, 59, 47, 86, 1, 11, 17, 27, 48, 37, 87, 98, 94, 13, 21, 90, 81, 43, 50, 77, 93, 35, 28, 94, 42, 86, 73, 18, 23, 86, 86, 40, 96, 32, 25, 96, 94, 41, 22, 93, 29, 60, 90, 23, 72, 62, 64, 4, 5, 65, 81, 49, 100, 60, 42, 93, 45, 15, 10, 19, 52, 95, 10, 47, 78, 35, 94, 23, 27, 67, 15, 8, 26, 57, 82, 49, 18, 45, 53, 74, 10, 85, 74, 61, 96, 16, 53, 40, 82, 62, 59, 85, 9, 68, 83, 86, 54, 28, 9, 33, 94, 75, 40, 71, 83, 21, 19, 53, 17, 23, 78, 26, 7, 52, 86, 2, 19, 90, 94, 52, 52, 4, 36, 12, 23, 70, 97, 29, 49, 57, 13, 42, 84, 52, 12, 66, 24, 82, 18, 92, 5, 96, 18, 63, 47, 55, 17, 17, 45, 10, 68, 48, 65, 55, 59, 87, 24, 7, 15, 72, 16, 27, 65, 99, 30, 28, 64, 5, 9, 34, 97, 65, 81, 66, 80, 27, 72, 96, 95, 16, 57, 62, 15, 73, 16, 25, 59, 91, 84, 26, 62, 99, 4, 78, 49, 86, 5, 12, 42, 65, 97, 90, 82, 77, 55, 61, 55, 79, 8, 49, 46, 16, 10, 61, 88, 25, 37, 98, 15, 20, 23, 28, 70, 79, 5, 18, 16, 61, 82, 57, 78, 30, 47, 59, 7, 53, 71, 61, 31, 78, 10, 77, 93, 71, 89, 32, 48, 25, 29, 62, 97, 4, 42, 66, 82, 98, 36, 49, 59, 69, 5, 36, 98, 3, 46, 4, 56, 16, 17, 38, 93, 78, 14, 37, 100, 54, 68, 47, 79, 48, 61, 27, 51, 2, 44, 84, 99, 79, 32, 9, 99, 37, 96, 97, 91, 93, 52, 46, 8, 20, 36, 52, 97, 1, 40, 97, 55, 59, 43, 85, 7, 55, 11, 57, 56, 54, 93, 7, 85, 24, 67, 83, 12, 15, 31, 3, 7, 83, 100, 15, 54, 35, 18, 51, 36, 58, 99, 42, 16, 93, 26, 22, 48, 88, 31, 3, 41, 23, 61, 77, 46, 28, 12, 10, 94, 42, 12, 100, 76, 11, 14, 82, 98, 84, 32, 33, 41, 82, 74, 8, 74, 51, 82, 21, 38, 12, 76, 30, 86, 88, 59, 83, 67, 70, 92, 60, 63, 3, 60, 91, 66, 25, 72, 63, 8, 55, 47, 100, 36, 20, 8, 9, 22, 89, 82, 59, 100, 9, 40, 37, 96, 98, 19, 63, 67, 11, 74, 82, 65, 33, 24, 30, 10, 95, 44, 17, 1, 90, 17, 36, 61, 76, 96, 82, 64, 29, 92, 15, 37, 32, 51, 85, 29, 69, 99, 48, 31, 72, 81, 96, 57, 4, 77, 66, 50, 21, 34, 50, 10, 50, 85, 23, 77, 32, 4, 40, 61, 48, 6, 49, 79, 56, 33, 59, 77, 83, 58, 59, 55, 38, 54, 63, 41, 83, 28, 90, 55, 61, 39, 16, 63, 75, 38, 39, 59, 94, 31, 71, 41, 36, 19, 71, 44, 4, 29, 72, 86, 87, 30, 92, 24, 36, 54, 17, 18, 33, 6, 72, 94, 97, 87, 8, 23, 77, 46, 81, 70, 76, 51, 10, 64, 22, 80, 7, 25, 60, 78, 62, 46, 59, 6, 22, 94, 11, 38, 63, 44, 95, 34, 89, 43, 73, 96, 66, 49, 41, 46, 70, 69, 49, 79, 84, 70, 10, 42, 94, 21, 71, 7, 19, 29, 12, 40, 23, 23, 29, 85, 66, 75, 71, 54, 18, 95, 1, 83, 95, 93, 80, 64, 13, 28, 94, 96, 97, 55, 37, 42, 75, 7, 49, 93, 88, 60, 84, 10, 34, 12, 46, 51, 87, 68, 56, 56, 62, 56, 38, 56, 49, 17, 71, 61, 45, 64, 57, 93, 18, 45, 35, 45, 4, 83, 37, 91, 94, 73, 52, 80, 84, 97, 30, 22, 17, 38, 77, 30, 93, 66, 38, 41, 35, 8, 54, 31, 24, 62, 23, 93, 6, 57, 37, 9, 91, 26, 51, 37, 98, 2, 68, 33, 51, 49, 7, 67, 86, 35, 96, 79, 1, 33, 71, 35, 93, 24, 65, 16, 85, 39, 8, 43, 48, 97, 3, 90, 22, 54, 78, 19, 55, 45, 51, 57, 94, 57, 23, 31, 92, 71, 61, 44, 55, 32, 30, 99, 7, 46, 14, 44, 84, 74, 86, 31, 70, 88, 21, 91, 93, 50, 61, 48, 95, 11, 56, 40, 20, 31, 70, 63, 1, 31, 58, 7, 14, 87, 6, 20, 32, 71, 63, 67, 44, 100, 98, 13, 88, 70, 55, 80, 19, 15, 79, 65, 26, 87, 4, 97, 17, 26, 11, 69, 8, 68, 75, 21, 6, 32, 92, 37, 3, 7, 55, 98, 6, 4, 11, 45, 73, 65, 77, 44, 80, 7, 8, 57, 93, 64, 5, 9, 41, 15, 29, 48, 34, 56, 20, 39, 87, 11, 27, 41, 69, 81, 39, 75, 85, 1, 71, 9, 17, 99, 4, 48, 6, 12, 4, 50, 27, 60, 11, 67, 26, 39, 66, 59, 94, 85, 49, 33, 47, 75, 25, 16, 8, 63, 42, 44, 15, 64, 4, 32, 63, 8, 79, 20, 71, 35, 21, 97, 94, 31, 15, 72, 22, 80, 30, 67, 16, 79, 51, 62, 5, 76, 77, 64, 90, 70, 7, 5, 34, 11, 88, 48, 18, 18, 67, 40, 52, 39, 36, 98, 70, 2, 69, 43, 81, 50, 61, 96, 80, 12, 9, 85, 39, 38, 100, 28, 7, 59, 84, 92, 69, 71, 91, 38, 89, 57, 77, 92, 48, 64, 89, 69, 65, 9, 11, 97, 59, 23, 44, 90, 34, 4, 74, 72, 41, 26, 52, 100, 84, 35, 43, 4, 6, 34, 93, 46, 42, 21, 37, 89, 84, 78, 57, 100, 86, 19, 48, 96, 42, 91, 86, 75, 94, 11, 99, 87, 36, 2, 86, 19, 36, 28, 22, 93, 13, 14, 90, 55, 34, 27, 43, 69, 4, 100, 20, 41, 18, 67, 89, 11, 57, 74, 86, 3, 36, 36, 89, 72, 89, 26, 42, 76, 5, 16, 69, 18, 81, 10, 72, 67, 36, 66, 87, 91, 65, 7, 32, 35, 73, 72, 45, 82, 45, 82, 84, 32, 69, 24, 3, 9, 1, 97, 85, 5, 64, 5, 22, 44, 14, 45, 10, 2, 11, 97, 92, 27, 3, 75, 13, 27, 46, 10, 8, 42, 43, 43, 74, 64, 18, 28, 72, 18, 24, 56, 23, 87, 60, 96, 83, 74, 93, 92, 75, 3, 40, 18, 81, 94, 93, 46, 73, 90, 55, 32, 32, 49, 75, 5, 12, 44, 32, 84, 62, 8, 39, 36, 46, 51, 31, 28, 76, 75, 72, 2, 29, 63, 19, 10, 9, 63, 7, 81, 53, 61, 12, 84, 9, 38, 40, 73, 82, 23, 56, 43, 30, 46, 30, 28, 48, 60, 7, 23, 87, 30, 24, 15, 93, 95, 24, 53, 57, 30, 33, 9, 42, 96, 44, 3, 34, 83, 75, 15, 6, 82, 9, 87, 79, 38, 14, 27, 49, 21, 1, 35, 50, 77, 50, 94, 71, 25, 46, 27, 7, 30, 36, 100, 26, 79, 2, 59, 14, 28, 25, 19, 61, 85, 5, 92, 74, 19, 70, 74, 91, 70, 61, 92, 46, 10, 38, 16, 86, 83, 95, 92, 13, 82, 44, 90, 12, 45, 100, 25, 25, 76, 43, 85, 60, 48, 28, 85, 18, 97, 58, 60, 67, 18, 51, 64, 79, 88, 32, 17, 23, 26, 60, 87, 7, 3, 76, 18, 48, 75, 43, 24, 50, 37, 60, 61, 36, 88, 45, 53, 84, 54, 64, 2, 72, 67, 66, 2, 6, 97, 18, 28, 74, 78, 66, 80, 80, 41, 49, 79, 67, 43, 2, 68, 80, 62, 28, 15, 49, 24, 20, 84, 30, 83, 86, 1, 49, 51, 54, 55, 99, 72, 34, 72, 1, 100, 51, 80, 92, 51, 59, 59, 94, 12, 26, 73, 73, 6, 87, 73, 81, 6, 57, 10, 89, 42, 62, 89, 44, 68, 43, 42, 39, 29, 13, 39, 28, 15, 70, 19, 65, 80, 77, 58, 92, 55, 82, 16, 12, 69, 89, 44, 26, 97, 6, 66, 90, 19, 55, 33, 86, 49, 26, 24, 77, 90, 14, 56, 56, 84, 75, 20, 63, 3, 30, 54, 9, 11, 22, 72, 31, 10, 16, 57, 58, 73, 74, 47, 91, 28, 31, 77, 29, 8, 100, 57, 97, 66, 13, 52, 1, 39, 23, 63, 93, 4, 69, 2, 15, 90, 25, 97, 51, 92, 5, 60, 64, 79, 58, 55, 58, 88, 83, 86, 47, 34, 95, 95, 99, 7, 98, 99, 97, 20, 14, 89, 24, 34, 42, 90, 75, 67, 86, 25, 10, 91, 36, 74, 21, 93, 80, 78, 32, 62, 16, 78, 95, 10, 72, 46, 68, 69, 44, 64, 40, 9, 4, 15, 42, 98, 56, 16, 16, 42, 92, 25, 84, 27, 50, 56, 19, 29, 33, 50, 42, 48, 79, 89, 9, 2, 34, 76, 22, 29, 91, 62, 38, 47, 28, 79, 44, 84, 47, 59, 77, 38, 35, 12, 65, 85, 67, 35, 65, 99, 85, 59, 99, 15, 47, 7, 17, 32, 35, 38, 60, 25, 51, 97, 23, 31, 28, 66, 14, 74, 76, 90, 11, 63, 1, 27, 99, 67, 62, 63, 17, 98, 73, 15, 12, 71, 22, 80, 2, 56, 70, 62, 32, 20, 10, 55, 50, 89, 72, 15, 62, 48, 4, 25, 10, 56, 51, 8, 74, 64, 22, 91, 13, 47, 5, 77, 17, 78, 56, 19, 33, 25, 32, 17, 97, 93, 71, 98, 82, 42, 13, 95, 41, 68, 19, 2, 76, 22, 61, 49, 37, 83, 39, 50, 81, 44, 26, 97, 21, 33, 67, 6, 10, 50, 22, 58, 43, 44, 55, 76, 37, 19, 70, 30, 39, 41, 31, 14, 14, 92, 62, 50, 26, 1, 51, 6, 96, 28, 54, 68, 13, 21, 25, 22, 70, 98, 79, 64, 41, 85, 39, 30, 56, 61, 59, 94, 1, 41, 59, 66, 32, 20, 67, 9, 72, 70, 66, 19, 97, 20, 39, 61, 40, 63, 34, 61, 61, 12, 25, 53, 49, 63, 82, 4, 75, 40, 49, 27, 81, 7, 92, 64, 78, 59, 25, 2, 80, 90, 72, 28, 9, 10, 89, 48, 73, 22, 9, 33, 86, 85, 85, 34, 47, 19, 89, 74, 10, 89, 100, 42, 47, 92, 6, 76, 2, 82, 29, 81, 71, 1, 8, 80, 62, 48, 79, 34, 70, 39, 18, 55, 23, 55, 40, 22, 25, 80, 95, 34, 20, 46, 76, 66, 37, 33, 93, 90, 14, 22, 22, 84, 74, 82, 15, 35, 29, 46, 69, 98, 36, 38, 4, 59, 44, 95, 32, 68, 26, 78, 2, 45, 23, 77, 62, 12, 61, 7, 53, 74, 28, 75, 9, 1, 56, 76, 35, 84, 21, 55, 34, 56, 45, 89, 66, 88, 36, 49, 8, 61, 78, 9, 58, 53, 37, 71, 64, 97, 77, 16, 22, 56, 42, 82, 56, 97, 57, 43, 33, 77, 49, 18, 85, 93, 58, 2, 81, 93, 51, 40, 6, 80, 48, 15, 32, 36, 37, 47, 84, 14, 63, 5, 21, 56, 38, 29, 53, 95, 71, 37, 23, 19, 6, 59, 12, 63, 61, 44, 56, 63, 83, 13, 42, 82, 27, 74, 17, 15, 20, 100, 80, 34, 56, 1, 90, 93, 29, 94, 39, 99, 82, 62, 69, 87, 20, 32, 49, 80, 27, 56, 94, 9, 20, 36, 42, 98, 61, 10, 13, 32, 61, 92, 18, 16, 44, 7, 61, 72, 52, 99, 22, 85, 12, 91, 71, 32, 74, 71, 63, 1, 79, 9, 61, 98, 44, 3, 96, 56, 12, 8, 87, 73, 51, 4, 40, 95, 62, 52, 66, 65, 3, 40, 49, 14, 82, 71, 97, 55, 94, 12, 55, 72, 20, 16, 21, 15, 70, 16, 22, 33, 75, 60, 57, 26, 64, 49, 72, 77, 100, 37, 94, 54, 28, 94, 20, 9, 17, 68, 16, 10, 79, 70, 33, 50, 37, 53, 16, 58, 69, 89, 91, 95, 49, 47, 20, 64, 95, 91, 92, 47, 80, 85, 52, 59, 31, 71, 68, 47, 39, 83, 8, 69, 4, 40, 71, 41, 44, 38, 50, 12, 27, 40, 59, 75, 39, 78, 38, 33, 21, 29, 31, 52, 66, 83, 10, 96, 53, 29, 94, 43, 63, 1, 12, 67, 92, 34, 59, 35, 71, 8, 99, 97, 48, 57, 71, 86, 86, 60, 70, 6, 41, 53, 9, 58, 35, 19, 53, 39, 99, 46, 34, 62, 98, 45, 28, 89, 78, 38, 23, 48, 45, 21, 97, 44, 77, 19, 81, 63, 31, 3, 20, 71, 55, 29, 28, 41, 99, 32, 31, 49, 29, 64, 10, 78, 60, 89, 66, 89, 26, 40, 89, 23, 13, 85, 18, 89, 3, 51, 3, 33, 53, 75, 55, 59, 55, 34, 51, 5, 17, 33, 53, 45, 97, 63, 22, 56, 51, 39, 97, 29, 79, 85, 51, 43, 69, 20, 83, 23, 70, 86, 8, 74, 12, 14, 84, 66, 48, 34, 22, 64, 67, 74, 61, 15, 36, 34, 22, 39, 25, 18, 67, 55, 2, 69, 97, 22, 40, 79, 97, 10, 16, 4, 35, 27, 17, 19, 44, 16, 4, 65, 32, 22, 39, 92, 36, 26, 77, 10, 16, 1, 27, 82, 55, 81, 2, 3, 54, 94, 82, 50, 3, 97, 5, 89, 76, 74, 7, 71, 89, 63, 36, 20, 84, 26, 63, 72, 51, 40, 81, 19, 92, 59, 100, 99, 91, 54, 1, 45, 47, 82, 46, 1, 31, 51, 41, 6, 24, 100, 76, 12, 62, 63, 84, 97, 88, 98, 68, 91, 89, 100, 9, 81, 11, 60, 79, 1, 65, 31, 97, 63, 13, 43, 15, 95, 93, 56, 100, 68, 55, 27, 79, 16, 90, 14, 64, 29, 12, 32, 71, 100, 83, 31, 32, 93, 43, 10, 46, 7, 93, 42, 22, 57, 36, 36, 51, 28, 43, 2, 95, 97, 28, 26, 64, 69, 91, 28, 50, 2, 11, 72, 2, 45, 3, 33, 38, 45, 95, 35, 3, 39, 28, 24, 95, 64, 12, 45, 91, 54, 46, 38, 3, 25, 15, 66, 94, 5, 93, 95, 7, 55, 66, 60, 100, 68, 44, 89, 64, 90, 23, 67, 28, 50, 42, 22, 13, 5, 66, 56, 59, 63, 45, 61, 88, 59, 78, 81, 63, 23, 27, 21, 77, 92, 32, 76, 12, 76, 16, 75, 17, 38, 93, 45, 40, 87, 18, 4, 91, 36, 59, 1, 98, 55, 13, 85, 13, 91, 17, 28, 13, 43, 48, 41, 87, 80, 69, 98, 7, 84, 24, 23, 74, 69, 19, 13, 55, 37, 68, 97, 24, 79, 98, 21, 33, 62, 6, 46, 52, 74, 25, 16, 17, 72, 57, 55, 3, 77, 52, 61, 60, 27, 84, 85, 95, 54, 49, 1, 42, 17, 98, 65, 95, 47, 86, 27, 8, 43, 24, 12, 16, 48, 27, 84, 72, 35, 38, 26, 11, 41, 87, 23, 68, 22, 7, 62, 75, 56, 63, 69, 72, 12, 33, 66, 58, 70, 44, 65, 12, 68, 28, 80, 67, 55, 63, 90, 41, 1, 16, 52, 93, 2, 74, 60, 23, 32, 22, 49, 87, 36, 69, 58, 47, 54, 75, 56, 23, 19, 72, 87, 38, 100, 18, 56, 6, 80, 46, 46, 32, 61, 49, 25, 14, 22, 36, 88, 54, 9, 88, 92, 44, 57, 50, 42, 10, 76, 49, 84, 46, 21, 70, 35, 20, 39, 91, 25, 19, 88, 22, 2, 100, 71, 78, 13, 44, 14, 100, 97, 22, 39, 41, 18, 95, 42, 11, 56, 17, 60, 40, 63, 80, 61, 49, 51, 100, 91, 27, 70, 78, 48, 23, 77, 18, 53, 41, 62, 66, 92, 10, 39, 31, 50, 8, 77, 91, 71, 33, 60, 30, 72, 74, 61, 84, 22, 63, 83, 13, 89, 4, 90, 88, 27, 19, 6, 31, 59, 19, 96, 3, 28, 86, 33, 30, 46, 9, 72, 16, 41, 31, 97, 64, 4, 9, 48, 78, 71, 82, 90, 11, 38, 31, 98, 16, 1, 55, 46, 12, 73, 93, 14, 1, 30, 46, 82, 75, 6, 53, 42, 99, 84, 38, 62, 39, 46, 61, 16, 68, 95, 57, 78, 32, 40, 28, 47, 40, 82, 44, 51, 7, 36, 64, 7, 65, 61, 40, 92, 67, 92, 33, 65, 27, 23, 78, 18, 20, 91, 33, 40, 85, 42, 69, 68, 81, 96, 66, 20, 30, 9, 23, 36, 44, 38, 94, 60, 99, 33, 3, 17, 76, 36, 33, 3, 10, 10, 20, 29, 52, 4, 68, 36, 45, 37, 3, 77, 84, 20, 49, 13, 28, 71, 48, 23, 8, 41, 35, 58, 25, 37, 74, 1, 24, 58, 55, 33, 20, 74, 14, 71, 29, 33, 59, 26, 69, 13, 2, 5, 33, 50, 17, 60, 72, 17, 83, 80, 9, 69, 89, 34, 5, 15, 86, 29, 72, 40, 13, 91, 65, 26, 62, 93, 11, 72, 18, 31, 84, 72, 35, 16, 73, 4, 76, 45, 20, 10, 76, 80, 78, 64, 13, 34, 78, 50, 14, 50, 89, 27, 92, 53, 4, 5, 98, 14, 76, 67, 45, 60, 90, 79, 75, 63, 82, 2, 7, 53, 63, 82, 33, 92, 45, 97, 26, 23, 99, 39, 24, 87, 17, 15, 92, 21, 20, 41, 86, 47, 7, 30, 6, 97, 61, 33, 11, 94, 86, 17, 99, 49, 50, 83, 92, 94, 31, 17, 68, 29, 8, 43, 16, 76, 10, 59, 48, 29, 99, 34, 27, 57, 15, 33, 5, 27, 17, 15, 73, 2, 83, 71, 50, 32, 53, 42, 78, 83, 10, 97, 12, 69, 40, 79, 45, 49, 89, 44, 29, 87, 29, 55, 95, 44, 39, 100, 22, 55, 66, 94, 57, 49, 64, 6, 32, 16, 99, 9, 51, 61, 6, 14, 81, 97, 44, 77, 45, 32, 21, 25, 70, 49, 79, 64, 44, 18, 15, 66, 72, 33, 59, 28, 33, 23, 86, 16, 90, 36, 25, 92, 48, 82, 5, 29, 30, 100, 5, 26, 31, 77, 50, 52, 26, 80, 68, 21, 97, 34, 86, 21, 66, 45, 100, 50, 19, 37, 66, 60, 25, 42, 52, 72, 75, 8, 100, 4, 8, 57, 29, 38, 33, 78, 90, 10, 9, 57, 31, 6, 90, 68, 78, 8, 64, 29, 57, 82, 66, 74, 42, 90, 15, 93, 61, 89, 100, 13, 92, 59, 21, 72, 97, 5, 1, 38, 15, 10, 46, 97, 67, 87, 16, 44, 46, 80, 72, 3, 13, 89, 28, 54, 78, 43, 98, 91, 83, 50, 3, 27, 8, 75, 98, 56, 79, 99, 45, 45, 60, 90, 41, 26, 29, 9, 21, 74, 88, 92, 28, 100, 33, 56, 6, 10, 50, 3, 52, 32, 4, 6, 58, 64, 80, 8, 19, 59, 58, 16, 3, 17, 5, 96, 42, 85, 4, 62, 59, 43, 5, 86, 94, 37, 93, 99, 99, 42, 54, 50, 74, 57, 56, 83, 20, 87, 90, 91, 45, 47, 6, 100, 63, 62, 95, 56, 47, 50, 17, 57, 92, 74, 42, 85, 62, 87, 36, 60, 28, 89, 62, 1, 97, 69, 84, 69, 55, 25, 11, 52, 72, 16, 51, 34, 29, 45, 42, 27, 46, 10, 83, 37, 83, 77, 73, 97, 63, 8, 8, 90, 48, 69, 43, 45, 89, 26, 13, 44, 50, 23, 95, 73, 90, 45, 59, 70, 41, 100, 97, 86, 9, 79, 74, 44, 55, 98, 40, 17, 6, 47, 7, 53, 68, 49, 49, 56, 26, 13, 99, 27, 87, 45, 100, 76, 41, 10, 46, 81, 9, 94, 18, 17, 72, 43, 12, 27, 41, 51, 95, 98, 50, 53, 50, 17, 53, 51, 72, 30, 63, 23, 57, 50, 67, 8, 77, 8, 17, 74, 40, 25, 67, 10, 93, 39, 52, 57, 17, 92, 7, 63, 89, 8, 16, 91, 24, 68, 93, 96, 50, 55, 70, 6, 56, 36, 65, 33, 95, 81, 58, 35, 57, 25, 96, 1, 15, 47, 9, 31, 91, 68, 93, 79, 75, 60, 21, 99, 80, 13, 46, 29, 20, 15, 86, 75, 2, 50, 59, 97, 82, 17, 83, 38, 41, 78, 90, 55, 76, 99, 37, 66, 66, 29, 97, 40, 41, 17, 90, 20, 82, 87, 48, 1, 1, 33, 27, 55, 82, 86, 51, 15, 2, 85, 4, 94, 14, 93, 48, 89, 43, 36, 55, 60, 64, 3, 52, 56, 19, 41, 75, 52, 80, 74, 52, 80, 6, 79, 86, 39, 16, 88, 5, 17, 72, 8, 10, 37, 1, 9, 26, 95, 44, 32, 55, 59, 34, 6, 15, 4, 98, 41, 56, 77, 15, 59, 9, 72, 89, 94, 63, 4, 34, 67, 72, 57, 75, 81, 94, 27, 41, 71, 21, 84, 2, 27, 95, 87, 32, 9, 42, 82, 1, 49, 10, 15, 8, 18, 39, 96, 64, 53, 52, 97, 19, 23, 53, 45, 56, 98, 71, 96, 68, 44, 32, 21, 70, 26, 7, 54, 86, 1, 35, 86, 49, 44, 53, 56, 14, 43, 4, 77, 95, 7, 25, 65, 29, 29, 10, 84, 27, 32, 32, 46, 75, 63, 67, 97, 40, 25, 50, 25, 25, 36, 62, 74, 79, 14, 81, 44, 8, 36, 72, 2, 42, 96, 19, 71, 77, 28, 6, 55, 11, 37, 100, 38, 51, 66, 34, 90, 43, 35, 66, 67, 70, 28, 92, 100, 93, 73, 96, 1, 60, 67, 54, 2, 63, 72, 24, 91, 51, 81, 45, 62, 70, 44, 99, 20, 62, 84, 62, 4, 70, 27, 70, 91, 54, 14, 42, 47, 86, 37, 99, 97, 4, 52, 98, 18, 24, 21, 8, 74, 54, 52, 87, 23, 47, 37, 42, 8, 20, 3, 11, 41, 82, 33, 31, 35, 46, 73, 33, 83, 9, 31, 79, 12, 83, 77, 29, 58, 49, 36, 83, 2, 39, 70, 24, 86, 6, 18, 93, 78, 72, 56, 18, 53, 88, 49, 40, 33, 21, 72, 67, 29, 55, 45, 93, 37, 73, 21, 46, 74, 9, 28, 27, 99, 97, 3, 84, 3, 20, 29, 80, 43, 84, 49, 48, 23, 97, 87, 7, 17, 10, 73, 98, 64, 69, 90, 52, 94, 62, 97, 67, 22, 25, 93, 21, 73, 95, 56, 27, 66, 36, 58, 9, 19, 7, 56, 93, 3, 94, 99, 72, 3, 23, 21, 19, 92, 62, 70, 85, 23, 67, 3, 97, 43, 95, 69, 67, 42, 24, 94, 7, 60, 3, 67, 30, 9, 74, 23, 64, 67, 73, 87, 22, 96, 7, 40, 39, 68, 9, 23, 42, 27, 77, 38, 21, 71, 6, 88, 64, 82, 33, 71, 93, 35, 89, 22, 44, 63, 96, 59, 81, 21, 45, 2, 68, 51, 93, 6, 70, 54, 80, 11, 80, 56, 49, 53, 26, 54, 40, 42, 35, 72, 64, 79, 6, 52, 1, 1, 66, 48, 11, 47, 20, 55, 100, 87, 57, 45, 92, 26, 98, 71, 37, 29, 26, 37, 81, 4, 90, 20, 45, 77, 43, 60, 55, 1, 11, 7, 53, 29, 7, 64, 27, 26, 70, 78, 13, 79, 22, 56, 56, 71, 27, 92, 100, 4, 28, 80, 7, 70, 52, 3, 98, 46, 62, 4, 98, 25, 63, 51, 53, 69, 66, 79, 46, 87, 56, 10, 65, 30, 66, 21, 100, 92, 64, 51, 95, 44, 83, 54, 65, 34, 8, 14, 31, 22, 17, 29, 98, 31, 31, 50, 51, 96, 80, 97, 34, 87, 6, 99, 16, 71, 71, 68, 14, 34, 18, 61, 29, 100, 66, 93, 85, 25, 6, 16, 46, 75, 96, 43, 5, 26, 44, 56, 73, 75, 4, 6, 62, 61, 56, 29, 32, 78, 96, 97, 12, 14, 9, 92, 65, 74, 37, 50, 99, 42, 17, 96, 68, 12, 39, 25, 89, 34, 32, 13, 9, 35, 70, 22, 95, 26, 50, 78, 3, 46, 27, 66, 11, 35, 10, 75, 9, 46, 24, 59, 39, 40, 54, 7, 3, 44, 83, 43, 78, 14, 55, 38, 48, 77, 59, 94, 54, 8, 24, 8, 5, 50, 74, 15, 84, 35, 90, 44, 80, 65, 2, 18, 57, 8, 76, 11, 51, 58, 54, 80, 71, 60, 17, 70, 36, 27, 16, 89, 35, 39, 97, 91, 40, 22, 6, 23, 56, 47, 19, 35, 63, 72, 52, 19, 79, 80, 30, 82, 37, 35, 61, 8, 94, 30, 29, 30, 56, 44, 70, 42, 34, 66, 33, 73, 39, 90, 48, 94, 88, 66, 28, 50, 89, 32, 69, 68, 63, 50, 49, 99, 84, 61, 58, 29, 42, 87, 10, 98, 82, 80, 91, 16, 97, 75, 88, 36, 16, 35, 29, 3, 52, 9, 53, 41, 92, 21, 8, 54, 22, 8, 4, 57, 20, 62, 85, 62, 100, 95, 11, 81, 26, 53, 96, 22, 28, 84, 9, 95, 70, 90, 98, 22, 50, 50, 62, 93, 22, 21, 46, 43, 80, 1, 51, 99, 62, 35, 60, 61, 81, 22, 94, 6, 75, 89, 80, 54, 24, 40, 48, 94, 29, 45, 15, 78, 46, 28, 70, 19, 100, 67, 13, 79, 68, 63, 77, 81, 98, 89, 94, 30, 62, 87, 36, 36, 27, 67, 41, 51, 6, 89, 96, 35, 85, 62, 64, 83, 89, 86, 1, 88, 52, 14, 18, 71, 28, 94, 52, 77, 34, 97, 7, 96, 35, 94, 83, 61, 60, 24, 63, 17, 64, 58, 3, 48, 19, 19, 82, 59, 4, 83, 98, 55, 48, 15, 78, 75, 61, 81, 52, 46, 77, 10, 41, 11, 3, 76, 23, 14, 99, 86, 82, 62, 43, 85, 61, 14, 55, 43, 24, 58, 77, 22, 64, 76, 88, 41, 50, 48, 21, 53, 94, 97, 14, 86, 59, 16, 61, 34, 81, 11, 19, 63, 24, 13, 99, 85, 78, 53, 79, 2, 62, 7, 23, 25, 82, 62, 66, 83, 10, 86, 36, 55, 35, 1, 92, 45, 17, 5, 78, 49, 15, 48, 63, 91, 61, 13, 27, 38, 65, 5, 91, 26, 11, 65, 3, 44, 27, 68, 26, 88, 53, 13, 42, 39, 14, 33, 84, 82, 89, 13, 30, 4, 61, 93, 94, 73, 5, 20, 62, 22, 76, 53, 99, 38, 17, 1, 81, 43, 20, 6, 30, 25, 19, 23, 63, 84, 8, 98, 65, 96, 11, 94, 51, 23, 38, 96, 95, 95, 15, 56, 68, 42, 60, 66, 31, 77, 19, 11, 71, 90, 69, 53, 14, 39, 27, 77, 22, 34, 26, 86, 82, 36, 31, 32, 10, 69, 28, 4, 63, 94, 12, 30, 88, 71, 47, 18, 99, 17, 29, 22, 7, 49, 26, 72, 39, 52, 48, 60, 38, 74, 97, 19, 61, 27, 2, 71, 95, 29, 26, 9, 75, 37, 90, 62, 60, 89, 79, 58, 57, 59, 31, 15, 59, 56, 87, 97, 60, 86, 56, 97, 11, 4, 67, 24, 31, 68, 94, 77, 49, 71, 38, 23, 8, 27, 36, 19, 67, 66, 76, 24, 25, 59, 90, 35, 14, 76, 32, 73, 14, 39, 21, 24, 43, 87, 47, 73, 7, 92, 1, 55, 15, 38, 77, 22, 65, 12, 40, 83, 29, 67, 58, 53, 77, 48, 40, 43, 75, 71, 67, 88, 9, 88, 64, 3, 26, 62, 27, 32, 6, 28, 86, 20, 65, 14, 93, 81, 77, 84, 64, 6, 2, 21, 10, 79, 68, 49, 21, 43, 19, 87, 82, 80, 26, 97, 82, 52, 11, 9, 83, 16, 36, 21, 35, 52, 34, 79, 33, 11, 62, 96, 16, 63, 16, 25, 93, 36, 74, 13, 30, 44, 52, 63, 23, 77, 60, 57, 28, 70, 17, 63, 85, 4, 83, 71, 55, 16, 1, 87, 78, 62, 34, 93, 76, 50, 70, 69, 37, 95, 33, 66, 38, 84, 28, 13, 61, 39, 21, 40, 8, 37, 2, 44, 40, 36, 66, 46, 4, 66, 85, 81, 79, 18, 26, 55, 19, 95, 23, 7, 89, 55, 72, 78, 91, 52, 90, 51, 90, 10, 42, 98, 46, 96, 93, 37, 31, 59, 35, 34, 76, 19, 67, 55, 88, 92, 9, 59, 38, 83, 65, 26, 89, 37, 3, 79, 40, 45, 81, 29, 54, 23, 78, 52, 18, 71, 40, 100, 81, 74, 86, 56, 44, 52, 62, 84, 95, 70, 42, 32, 4, 6, 9, 45, 94, 63, 23, 85, 7, 56, 14, 13, 78, 91, 64, 47, 13, 55, 98, 93, 29, 83, 1, 24, 86, 62, 7, 32, 84, 100, 15, 87, 58, 23, 31, 51, 86, 6, 36, 44, 61, 1, 56, 90, 43, 71, 36, 56, 26, 85, 48, 6, 68, 100, 29, 5, 62, 88, 37, 45, 87, 51, 83, 44, 26, 14, 47, 63, 71, 34, 58, 31, 34, 14, 72, 76, 36, 59, 83, 61, 43, 83, 18, 62, 82, 99, 67, 43, 86, 55, 87, 24, 57, 70, 68, 82, 35, 66, 96, 57, 99, 54, 87, 84, 19, 10, 11, 54, 68, 94, 67, 10, 76, 84, 72, 57, 34, 90, 52, 19, 44, 90, 95, 100, 11, 14, 34, 97, 79, 81, 53, 29, 34, 39, 64, 52, 100, 74, 58, 67, 67, 24, 77, 94, 59, 100, 3, 93, 89, 54, 63, 84, 95, 57, 35, 6, 70, 20, 2, 100, 1, 55, 28, 34, 45, 91, 38, 45, 17, 95, 11, 35, 18, 39, 29, 28, 90, 83, 20, 30, 88, 35, 13, 82, 91, 100, 87, 13, 19, 41, 64, 19, 47, 44, 5, 91, 34, 42, 87, 2, 36, 50, 37, 5, 88, 17, 32, 30, 51, 4, 59, 38, 38, 72, 19, 80, 71, 58, 44, 41, 50, 8, 12, 96, 51, 16, 86, 36, 9, 25, 38, 44, 74, 26, 100, 13, 94, 31, 42, 44, 86, 1, 81, 23, 72, 51, 55, 94, 60, 98, 86, 9, 5, 97, 4, 55, 64, 42, 91, 72, 66, 80, 15, 39, 5, 66, 51, 50, 97, 93, 93, 34, 45, 25, 57, 68, 75, 11, 61, 87, 60, 98, 95, 65, 95, 51, 71, 58, 92, 61, 82, 9, 92, 96, 99, 48, 14, 1, 97, 62, 45, 89, 95, 89, 13, 51, 56, 40, 13, 68, 26, 73, 66, 72, 89, 12, 74, 59, 21, 65, 72, 2, 25, 63, 50, 23, 11, 63, 76, 7, 24, 20, 48, 18, 9, 12, 21, 16, 51, 85, 84, 28, 57, 1, 52, 97, 64, 25, 56, 84, 42, 27, 86, 66, 41, 35, 41, 51, 49, 68, 10, 72, 87, 57, 41, 47, 68, 13, 63, 71, 98, 98, 50, 6, 50, 1, 3, 13, 26, 58, 96, 19, 36, 33, 36, 76, 19, 76, 79, 67, 43, 88, 90, 82, 96, 83, 28, 63, 95, 42, 85, 92, 91, 35, 50, 40, 35, 52, 52, 12, 61, 100, 30, 96, 32, 66, 23, 51, 93, 1, 69, 88, 88, 59, 69, 83, 93, 48, 98, 87, 42, 34, 31, 32, 68, 80, 72, 55, 31, 75, 18, 43, 74, 48, 38, 6, 65, 60, 8, 9, 13, 76, 96, 52, 86, 16, 87, 78, 16, 84, 17, 57, 69, 47, 88, 37, 78, 11, 43, 60, 86, 60, 2, 59, 59, 91, 16, 23, 2, 23, 32, 14, 51, 79, 66, 36, 47, 52, 66, 62, 87, 34, 70, 55, 32, 9, 43, 9, 20, 85, 68, 5, 45, 69, 15, 3, 11, 31, 78, 12, 53, 61, 26, 3, 39, 43, 91, 37, 94, 56, 50, 32, 41, 19, 86, 72, 80, 81, 80, 99, 65, 99, 55, 61, 19, 69, 64, 29, 51, 41, 40, 4, 1, 65, 58, 91, 7, 48, 80, 52, 55, 29, 83, 95, 100, 21, 66, 31, 1, 45, 29, 65, 95, 35, 26, 13, 55, 41, 41, 6, 33, 81, 9, 85, 97, 18, 27, 56, 66, 6, 7, 72, 87, 42, 67, 38, 62, 32, 68, 14, 29, 48, 30, 23, 82, 7, 36, 36, 47, 28, 41, 79, 8, 1, 15, 5, 71, 42, 12, 36, 47, 70, 7, 85, 11, 25, 22, 24, 9, 89, 89, 37, 36, 19, 11, 69, 25, 98, 57, 24, 26, 49, 2, 85, 50, 17, 41, 20, 10, 52, 7, 8, 22, 65, 93, 84, 90, 14, 8, 98, 55, 96, 86, 42, 66, 48, 63, 91, 98, 19, 14, 75, 67, 67, 59, 68, 35, 52, 39, 44, 3, 45, 52, 76, 62, 96, 60, 3, 61, 19, 100, 67, 66, 37, 9, 32, 36, 71, 22, 85, 89, 87, 59, 7, 5, 70, 75, 40, 21, 13, 35, 23, 58, 38, 51, 71, 33, 10, 73, 94, 28, 24, 60, 93, 12, 20, 24, 47, 42, 97, 84, 82, 35, 42, 89, 40, 63, 63, 31, 83, 75, 65, 58, 84, 3, 8, 54, 35, 17, 78, 80, 96, 1, 40, 88, 12, 11, 64, 11, 53, 12, 94, 34, 47, 87, 74, 38, 50, 36, 68, 84, 63, 32, 41, 98, 86, 100, 52, 21, 16, 81, 52, 63, 82, 43, 51, 45, 54, 66, 55, 58, 77, 100, 43, 75, 87, 17, 12, 88, 4, 31, 71, 66, 63, 64, 64, 48, 63, 67, 20, 31, 47, 72, 93, 80, 14, 95, 25, 19, 60, 31, 76, 89, 31, 19, 15, 69, 87, 79, 56, 90, 9, 78, 8, 23, 41, 71, 23, 4, 89, 42, 34, 87, 65, 26, 67, 31, 73, 91, 49, 32, 21, 77, 72, 3, 47, 87, 71, 33, 65, 78, 74, 25, 8, 81, 48, 48, 3, 70, 3, 91, 63, 88, 78, 80, 66, 44, 10, 38, 86, 10, 21, 58, 38, 93, 61, 84, 79, 83, 68, 95, 13, 42, 71, 20, 22, 18, 19, 25, 39, 74, 15, 54, 61, 44, 33, 26, 39, 94, 15, 24, 55, 36, 34, 45, 28, 94, 28, 58, 28, 48, 4, 40, 89, 74, 11, 62, 44, 30, 86, 34, 3, 53, 87, 15, 48, 71, 93, 87, 16, 7, 62, 23, 42, 47, 67, 21, 40, 46, 78, 20, 93, 81, 59, 33, 7, 70, 95, 50, 51, 32, 83, 53, 36, 22, 19, 84, 44, 11, 22, 60, 18, 35, 34, 59, 82, 100, 32, 73, 97, 9, 92, 42, 42, 3, 74, 100, 72, 20, 49, 74, 4, 83, 78, 39, 56, 96, 74, 100, 7, 95, 11, 24, 82, 96, 34, 63, 47, 65, 35, 43, 26, 79, 84, 19, 81, 10, 18, 4, 81, 18, 77, 84, 52, 54, 75, 8, 1, 48, 59, 7, 95, 21, 82, 76, 16, 16, 90, 62, 32, 76, 4, 9, 54, 40, 27, 34, 1, 96, 89, 81, 13, 17, 17, 17, 70, 91, 24, 23, 90, 34, 29, 84, 54, 11, 11, 69, 78, 100, 82, 61, 76, 37, 70, 81, 76, 48, 67, 28, 96, 55, 61, 60, 72, 77, 76, 93, 19, 51, 15, 8, 84, 96, 44, 37, 6, 6, 57, 35, 6, 38, 95, 33, 75, 16, 65, 2, 64, 31, 30, 59, 38, 42, 70, 9, 18, 46, 53, 36, 96, 68, 95, 80, 15, 38, 68, 72, 44, 77, 6, 1, 66, 52, 85, 92, 68, 49, 94, 83, 32, 75, 93, 69, 16, 62, 29, 85, 7, 81, 20, 55, 100, 66, 86, 14, 4, 53, 85, 99, 81, 42, 51, 47, 94, 35, 38, 61, 35, 83, 95, 18, 57, 87, 86, 24, 48, 14, 8, 7, 47, 79, 61, 46, 45, 98, 12, 100, 50, 48, 50, 83, 90, 100, 29, 83, 34, 66, 95, 20, 49, 41, 38, 57, 27, 75, 33, 26, 41, 92, 84, 87, 71, 96, 84, 67, 93, 47, 18, 95, 95, 67, 77, 84, 66, 5, 18, 51, 22, 64, 22, 70, 4, 59, 79, 82, 86, 11, 59, 26, 2, 43, 12, 24, 38, 95, 42, 83, 42, 59, 77, 88, 77, 5, 23, 94, 9, 92, 96, 30, 7, 18, 52, 10, 28, 82, 43, 13, 44, 1, 38, 45, 95, 1, 21, 85, 96, 14, 67, 89, 73, 95, 28, 1, 99, 50, 95, 7, 41, 90, 88, 47, 59, 91, 8, 87, 24, 2, 51, 67, 2, 41, 64, 49, 41, 36, 33, 88, 49, 99, 28, 73, 93, 55, 74, 43, 4, 20, 49, 96, 61, 88, 94, 20, 31, 1, 58, 54, 2, 60, 73, 56, 100, 36, 4, 41, 71, 88, 28, 19, 38, 56, 92, 82, 62, 17, 24, 66, 36, 24, 13, 96, 63, 7, 67, 93, 59, 24, 99, 13, 84, 71, 20, 83, 58, 75, 75, 80, 62, 3, 50, 99, 10, 93, 80, 71, 9, 55, 88, 96, 78, 1, 92, 40, 59, 58, 33, 17, 34, 83, 29, 69, 5, 100, 51, 62, 74, 78, 93, 35, 80, 42, 85, 41, 35, 16, 11, 95, 70, 99, 91, 47, 51, 34, 87, 9, 43, 71, 25, 28, 53, 6, 96, 57, 5, 99, 70, 31, 76, 62, 65, 55, 55, 2, 95, 41, 17, 57, 36, 87, 55, 78, 33, 57, 63, 71, 65, 5, 41, 42, 33, 45, 99, 80, 53, 55, 78, 74, 85, 53, 87, 2, 59, 42, 3, 5, 34, 71, 62, 69, 57, 68, 98, 42, 25, 60, 64, 41, 17, 57, 82, 1, 53, 80, 80, 6, 87, 58, 31, 71, 62, 18, 24, 21, 11, 26, 25, 44, 49, 86, 65, 5, 6, 62, 98, 30, 74, 62, 70, 42, 70, 4, 94, 22, 35, 73, 27, 21, 82, 10, 44, 96, 79, 67, 16, 89, 45, 40, 84, 93, 78, 48, 49, 35, 62, 99, 64, 87, 12, 85, 28, 81, 40, 21, 2, 75, 45, 81, 47, 79, 90, 90, 74, 68, 9, 89, 8, 53, 80, 91, 97, 9, 91, 45, 43, 52, 43, 58, 38, 6, 95, 17, 86, 34, 89, 40, 8, 33, 20, 55, 11, 61, 96, 36, 80, 4, 24, 87, 8, 56, 29, 4, 16, 19, 1, 11, 22, 95, 68, 59, 1, 62, 27, 86, 96, 15, 25, 55, 100, 96, 61, 62, 56, 57, 98, 87, 12, 73, 73, 20, 80, 54, 23, 96, 72, 75, 6, 94, 70, 25, 4, 70, 87, 83, 55, 34, 97, 32, 40, 48, 27, 1, 10, 35, 9, 7, 21, 20, 31, 46, 91, 11, 99, 66, 6, 22, 40, 63, 67, 9, 39, 23, 78, 25, 5, 85, 10, 1, 16, 50, 1, 94, 50, 10, 28, 58, 68, 1, 29, 98, 98, 20, 8, 48, 85, 65, 69, 24, 79, 88, 33, 18, 10, 10, 94, 14, 94, 4, 66, 61, 5, 66, 55, 6, 27, 34, 15, 94, 86, 43, 92, 83, 14, 51, 82, 98, 68, 3, 74, 46, 90, 6, 15, 99, 67, 9, 12, 13, 64, 29, 73, 20, 95, 79, 25, 21, 65, 39, 67, 50, 81, 10, 85, 95, 60, 18, 44, 79, 20, 17, 25, 9, 74, 91, 59, 41, 51, 22, 5, 14, 51, 29, 33, 97, 8, 9, 69, 24, 47, 35, 25, 80, 44, 9, 26, 56, 27, 69, 34, 98, 38, 10, 7, 11, 1, 65, 3, 51, 87, 7, 17, 89, 36, 1, 85, 95, 10, 53, 70, 56, 40, 94, 35, 35, 55, 12, 90, 81, 33, 76, 30, 70, 85, 36, 32, 85, 53, 35, 88, 91, 93, 4, 79, 80, 56, 15, 26, 65, 67, 95, 21, 58, 89, 7, 93, 43, 19, 34, 75, 51, 9, 4, 72, 94, 92, 3, 30, 44, 89, 69, 86, 34, 24, 64, 13, 80, 78, 91, 44, 96, 37, 64, 6, 25, 23, 98, 19, 41, 31, 45, 43, 92, 49, 14, 85, 92, 68, 66, 87, 57, 35, 72, 42, 10, 35, 6, 89, 64, 96, 33, 11, 33, 48, 16, 9, 70, 13, 28, 62, 96, 72, 56, 39, 72, 21, 75, 63, 89, 40, 1, 97, 26, 72, 90, 36, 58, 95, 24, 21, 91, 8, 32, 75, 8, 99, 83, 29, 12, 62, 43, 59, 86, 98, 49, 57, 71, 23, 72, 11, 62, 72, 59, 40, 96, 48, 75, 53, 42, 50, 74, 84, 10, 57, 58, 17, 55, 93, 45, 18, 6, 39, 28, 91, 37, 76, 100, 59, 98, 23, 69, 12, 46, 27, 51, 41, 74, 77, 94, 67, 26, 19, 51, 87, 27, 60, 3, 81, 4, 100, 51, 10, 38, 78, 52, 26, 6, 51, 36, 55, 25, 4, 66, 71, 30, 68, 11, 55, 44, 56, 22, 22, 74, 24, 8, 100, 83, 11, 33, 87, 62, 35, 48, 51, 12, 99, 29, 69, 50, 64, 24, 26, 68, 89, 96, 49, 9, 59, 56, 52, 14, 29, 73, 40, 52, 81, 91, 34, 43, 75, 72, 56, 9, 19, 6, 73, 18, 34, 41, 19, 50, 64, 44, 69, 5, 92, 17, 65, 50, 24, 16, 15, 52, 41, 6, 3, 21, 49, 89, 15, 23, 60, 70, 84, 31, 27, 56, 100, 13, 96, 18, 62, 12, 13, 30, 68, 56, 98, 32, 57, 22, 99, 24, 73, 39, 29, 28, 11, 29, 16, 25, 52, 27, 46, 35, 57, 73, 42, 56, 85, 37, 25, 98, 100, 90, 79, 19, 97, 76, 2, 54, 49, 1, 77, 74, 91, 57, 53, 2, 86, 68, 26, 89, 94, 24, 75, 3, 96, 16, 10, 32, 4, 35, 81, 56, 76, 59, 26, 72, 86, 28, 77, 87, 80, 53, 12, 70, 62, 64, 71, 99, 31, 49, 39, 76, 72, 65, 30, 19, 80, 40, 2, 35, 26, 82, 42, 53, 40, 68, 24, 77, 95, 1, 63, 74, 5, 74, 95, 18, 37, 18, 68, 19, 66, 6, 47, 89, 70, 76, 59, 1, 15, 60, 88, 92, 41, 29, 44, 32, 96, 68, 60, 42, 20, 23, 67, 76, 48, 62, 46, 37, 79, 13, 7, 96, 71, 53, 84, 40, 29, 42, 93, 95, 53, 80, 87, 45, 8, 30, 28, 4, 49, 87, 97, 20, 61, 64, 48, 61, 25, 93, 97, 3, 57, 3, 98, 27, 8, 33, 19, 36, 26, 11, 82, 78, 90, 20, 22, 49, 2, 49, 4, 50, 87, 1, 22, 48, 64, 69, 8, 40, 13, 56, 42, 21, 58, 91, 100, 65, 75, 70, 52, 100, 80, 86, 29, 21, 5, 2, 21, 6, 50, 25, 8, 88, 77, 29, 87, 40, 49, 94, 79, 13, 49, 72, 85, 59, 14, 36, 75, 88, 5, 79, 39, 36, 16, 67, 8, 20, 68, 29, 78, 69, 5, 85, 56, 81, 65, 43, 20, 65, 88, 50, 29, 89, 21, 65, 99, 86, 1, 25, 73, 5, 3, 11, 41, 18, 29, 100, 90, 96, 28, 67, 64, 32, 3, 71, 12, 19, 65, 83, 35, 53, 84, 63, 41, 56, 79, 91, 41, 79, 15, 65, 36, 70, 75, 28, 39, 55, 27, 28, 50, 55, 46, 65, 38, 100, 36, 2, 18, 52, 84, 52, 4, 20, 66, 96, 75, 45, 86, 16, 75, 53, 80, 10, 22, 7, 37, 60, 61, 16, 40, 63, 70, 85, 27, 59, 37, 14, 60, 54, 66, 96, 58, 21, 15, 75, 69, 89, 71, 6, 56, 46, 58, 88, 7, 79, 46, 96, 39, 58, 11, 30, 20, 32, 66, 99, 90, 2, 64, 50, 8, 81, 45, 17, 2, 11, 91, 22, 51, 14, 27, 7, 11, 85, 46, 17, 63, 91, 64, 53, 48, 74, 82, 20, 57, 100, 70, 47, 1, 33, 48, 8, 14, 44, 24, 67, 54, 67, 40, 4, 80, 66, 62, 90, 50, 7, 58, 65, 49, 22, 17, 49, 47, 51, 68, 56, 2, 89, 54, 2, 21, 1, 62, 86, 44, 37, 4, 49, 55, 43, 4, 34, 9, 18, 75, 10, 76, 85, 74, 25, 58, 43, 25, 56, 45, 44, 11, 46, 32, 64, 99, 52, 64, 60, 90, 59, 97, 45, 59, 51, 88, 15, 37, 48, 32, 63, 57, 7, 47, 83, 83, 4, 25, 7, 12, 69, 50, 22, 66, 81, 86, 64, 85, 1, 24, 26, 12, 72, 70, 22, 74, 9, 36, 62, 56, 67, 77, 65, 26, 23, 47, 8, 79, 23, 15, 90, 43, 16, 63, 8, 97, 48, 23, 33, 1, 98, 58, 64, 21, 27, 85, 47, 36, 73, 8, 43, 91, 84, 7, 16, 59, 5, 76, 89, 79, 42, 30, 21, 57, 92, 80, 5, 92, 3, 37, 92, 100, 94, 7, 21, 73, 43, 67, 8, 15, 26, 50, 58, 62, 9, 73, 72, 65, 100, 60, 44, 93, 89, 16, 50, 80, 96, 6, 23, 50, 43, 14, 1, 88, 72, 21, 60, 15, 39, 67, 81, 17, 69, 38, 78, 29, 63, 49, 45, 62, 60, 88, 55, 48, 56, 56, 79, 3, 61, 2, 52, 55, 67, 52, 43, 91, 25, 2, 5, 15, 21, 85, 31, 41, 75, 60, 69, 37, 8, 65, 50, 19, 5, 56, 18, 60, 63, 49, 62, 24, 50, 13, 30, 68, 16, 72, 58, 40, 26, 14, 55, 98, 51, 37, 38, 25, 97, 58, 13, 56, 22, 62, 75, 26, 70, 92, 85, 32, 40, 98, 7, 41, 62, 37, 61, 78, 60, 18, 69, 85, 32, 23, 82, 34, 12, 19, 58, 8, 28, 22, 63, 50, 83, 89, 27, 4, 33, 12, 36, 72, 61, 42, 65, 23, 30, 25, 100, 90, 94, 68, 26, 77, 43, 8, 10, 54, 78, 19, 13, 58, 40, 75, 7, 75, 16, 33, 78, 48, 96, 65, 71, 57, 59, 35, 31, 88, 11, 30, 29, 5, 49, 55, 81, 43, 14, 43, 48, 43, 61, 60, 100, 1, 87, 6, 75, 2, 91, 52, 49, 38, 69, 71, 46, 27, 6, 76, 14, 68, 57, 43, 72, 6, 49, 5, 100, 62, 47, 48, 4, 59, 7, 4, 59, 45, 61, 33, 46, 3, 37, 46, 41, 5, 17, 38, 83, 74, 14, 96, 93, 70, 90, 17, 27, 90, 21, 27, 51, 19, 26, 7, 77, 84, 10, 88, 29, 22, 72, 26, 77, 8, 24, 69, 64, 92, 6, 98, 17, 19, 94, 9, 41, 35, 25, 19, 25, 97, 97, 27, 15, 22, 33, 44, 6, 94, 31, 86, 68, 2, 11, 44, 62, 86, 12, 77, 77, 69, 75, 93, 88, 20, 2, 80, 6, 78, 50, 82, 75, 47, 9, 41, 68, 93, 84, 25, 39, 66, 62, 6, 68, 25, 1, 81, 10, 64, 57, 87, 32, 83, 31, 71, 2, 84, 2, 60, 62, 52, 41, 36, 98, 1, 76, 17, 46, 12, 42, 84, 77, 55, 41, 44, 79, 93, 76, 89, 56, 85, 27, 39, 67, 57, 10, 21, 93, 63, 80, 54, 14, 72, 89, 11, 25, 16, 80, 70, 27, 21, 5, 4, 27, 97, 99, 6, 89, 27, 46, 96, 11, 72, 86, 29, 80, 47, 49, 72, 10, 80, 77, 23, 4, 65, 86, 28, 33, 65, 97, 11, 37, 53, 14, 63, 49, 65, 20, 89, 91, 65, 84, 53, 36, 21, 81, 68, 68, 82, 91, 77, 61, 68, 51, 16, 84, 36, 43, 16, 52, 91, 27, 88, 43, 92, 3, 91, 8, 22, 79, 98, 87, 14, 2, 74, 35, 83, 93, 54, 64, 84, 82, 76, 51, 32, 92, 34, 20, 34, 50, 71, 25, 28, 11, 19, 19, 13, 10, 27, 86, 40, 76, 24, 6, 78, 98, 92, 12, 90, 45, 75, 73, 26, 2, 23, 9, 93, 9, 28, 79, 58, 51, 55, 37, 61, 73, 7, 25, 34, 33, 10, 74, 61, 86, 31, 90, 83, 22, 1, 24, 18, 75, 49, 95, 76, 23, 3, 21, 31, 31, 99, 40, 33, 5, 76, 93, 77, 83, 69, 11, 67, 30, 36, 79, 15, 66, 68, 49, 87, 68, 25, 4, 94, 73, 50, 22, 95, 52, 42, 78, 34, 92, 69, 66, 96, 45, 10, 24, 79, 30, 34, 97, 60, 21, 76, 26, 86, 43, 75, 24, 63, 99, 79, 56, 23, 28, 77, 69, 80, 70, 46, 13, 13, 67, 31, 60, 11, 40, 84, 41, 70, 69, 89, 81, 90, 64, 6, 27, 59, 32, 51, 21, 82, 29, 28, 4, 57, 5, 25, 88, 26, 22, 52, 39, 88, 82, 50, 50, 74, 33, 90, 95, 54, 79, 75, 95, 94, 32, 21, 52, 16, 71, 24, 97, 52, 52, 53, 60, 8, 77, 47, 33, 50, 50, 23, 38, 32, 25, 87, 57, 9, 29, 51, 62, 59, 77, 56, 52, 8, 29, 56, 23, 51, 79, 72, 2, 30, 24, 13, 89, 52, 11, 74, 53, 61, 48, 90, 44, 72, 29, 100, 81, 57, 50, 42, 15, 26, 50, 18, 85, 78, 73, 8, 80, 4, 31, 82, 85, 6, 46, 74, 57, 57, 47, 9, 17, 94, 51, 60, 66, 79, 11, 46, 87, 60, 39, 53, 37, 40, 70, 21, 69, 95, 80, 49, 98, 62, 82, 82, 67, 27, 7, 75, 83, 53, 36, 51, 99, 86, 62, 64, 16, 72, 61, 2, 83, 51, 54, 19, 43, 23, 92, 11, 69, 23, 59, 66, 85, 40, 100, 51, 19, 6, 26, 1, 11, 61, 4, 9, 98, 65, 24, 13, 37, 36, 14, 19, 38, 67, 90, 80, 41, 33, 91, 62, 7, 1, 27, 91, 41, 78, 94, 11, 84, 71, 11, 46, 31, 66, 54, 80, 31, 29, 92, 67, 64, 57, 37, 1, 23, 78, 81, 15, 62, 23, 76, 69, 23, 55, 11, 15, 84, 4, 25, 67, 26, 88, 64, 8, 53, 17, 87, 83, 45, 78, 1, 60, 34, 90, 61, 8, 19, 93, 75, 81, 15, 2, 49, 37, 8, 11, 4, 92, 15, 28, 10, 40, 15, 74, 48, 20, 42, 86, 2, 87, 64, 55, 98, 49, 96, 10, 9, 14, 2, 83, 94, 68, 84, 94, 5, 44, 5, 8, 35, 71, 87, 44, 62, 54, 17, 9, 73, 11, 95, 26, 49, 10, 80, 46, 58, 75, 56, 66, 41, 9, 100, 34, 77, 36, 28, 33, 79, 84, 92, 13, 54, 78, 8, 15, 31, 77, 76, 55, 87, 22, 81, 35, 31, 12, 80, 40, 39, 87, 58, 79, 96, 9, 12, 72, 44, 91, 4, 74, 74, 95, 86, 79, 24, 46, 46, 7, 22, 21, 61, 60, 42, 41, 94, 24, 53, 25, 15, 91, 12, 24, 69, 59, 85, 32, 82, 28, 23, 85, 2, 48, 31, 39, 79, 6, 36, 24, 12, 57, 44, 73, 16, 37, 65, 61, 12, 17, 86, 78, 59, 49, 54, 27, 59, 38, 11, 40, 17, 85, 76, 70, 84, 58, 61, 62, 63, 96, 37, 75, 5, 32, 99, 20, 68, 63, 33, 31, 32, 70, 61, 90, 70, 14, 69, 28, 3, 79, 67, 19, 15, 42, 89, 98, 99, 49, 12, 13, 44, 48, 39, 48, 80, 37, 20, 99, 52, 4, 82, 83, 73, 42, 24, 94, 7, 92, 21, 9, 22, 39, 27, 88, 32, 67, 86, 82, 15, 49, 94, 11, 96, 33, 10, 27, 21, 81, 26, 24, 36, 7, 6, 8, 100, 30, 1, 6, 73, 73, 66, 47, 11, 92, 34, 94, 59, 71, 75, 25, 19, 21, 87, 15, 5, 49, 93, 25, 29, 18, 49, 65, 76, 6, 24, 75, 87, 77, 32, 12, 49, 97, 58, 12, 41, 43, 57, 51, 14, 32, 27, 84, 52, 14, 50, 56, 62, 43, 32, 42, 60, 32, 6, 88, 38, 82, 14, 24, 58, 46, 35, 58, 94, 44, 21, 86, 39, 78, 36, 52, 61, 63, 87, 12, 28, 37, 19, 41, 79, 50, 82, 90, 34, 40, 77, 71, 21, 43, 46, 30, 88, 33, 39, 33, 28, 12, 19, 66, 89, 6, 69, 1, 68, 56, 12, 47, 92, 82, 87, 22, 83, 69, 11, 16, 60, 40, 38, 80, 82, 84, 61, 21, 68, 99, 5, 95, 62, 23, 61, 50, 29, 29, 2, 48, 84, 13, 47, 27, 46, 33, 48, 29, 53, 11, 96, 12, 2, 34, 43, 35, 69, 3, 7, 36, 54, 11, 82, 15, 86, 42, 17, 66, 23, 18, 65, 58, 83, 11, 37, 80, 96, 36, 8, 48, 98, 56, 12, 99, 41, 54, 85, 9, 9, 91, 96, 14, 54, 77, 28, 39, 71, 96, 4, 45, 14, 20, 2, 48, 31, 90, 27, 78, 26, 87, 77, 23, 42, 88, 22, 34, 94, 58, 42, 2, 49, 89, 15, 2, 65, 94, 92, 87, 90, 47, 31, 55, 66, 85, 54, 96, 26, 80, 73, 51, 18, 50, 74, 11, 89, 47, 44, 82, 4, 37, 35, 4, 25, 1, 57, 42, 95, 48, 28, 36, 46, 11, 42, 12, 47, 95, 59, 72, 26, 32, 75, 96, 33, 48, 6, 73, 46, 2, 7, 49, 38, 41, 5, 63, 94, 13, 4, 40, 61, 83, 75, 58, 45, 68, 69, 43, 14, 28, 67, 91, 11, 41, 86, 43, 40, 44, 67, 85, 45, 73, 85, 82, 14, 89, 44, 59, 2, 99, 98, 14, 34, 24, 71, 30, 91, 92, 73, 56, 19, 39, 46, 29, 31, 84, 23, 70, 27, 89, 54, 71, 14, 90, 4, 79, 79, 100, 37, 32, 50, 34, 97, 83, 57, 19, 13, 99, 10, 37, 6, 80, 27, 51, 8, 57, 86, 82, 78, 64, 23, 31, 34, 36, 20, 90, 14, 50, 89, 50, 33, 38, 83, 29, 73, 91, 100, 37, 41, 61, 73, 46, 41, 99, 48, 48, 7, 34, 82, 84, 97, 4, 66, 83, 39, 37, 72, 52, 87, 12, 1, 71, 1, 35, 52, 73, 25, 51, 9, 17, 11, 33, 62, 51, 31, 9, 51, 89, 94, 32, 72, 91, 35, 37, 25, 73, 26, 48, 76, 64, 59, 76, 34, 59, 10, 85, 84, 86, 87, 44, 2, 98, 77, 15, 100, 7, 23, 2, 48, 17, 33, 19, 59, 19, 8, 83, 43, 85, 30, 18, 48, 40, 93, 81, 50, 54, 18, 33, 91, 4, 77, 44, 53, 5, 58, 5, 63, 81, 6, 10, 49, 39, 81, 59, 9, 88, 41, 52, 24, 22, 21, 71, 61, 66, 51, 10, 19, 20, 95, 62, 24, 23, 5, 28, 27, 15, 32, 89, 47, 38, 51, 95, 28, 31, 53, 88, 70, 45, 39, 93, 66, 60, 63, 78, 25, 65, 39, 95, 85, 33, 8, 60, 7, 13, 87, 85, 27, 71, 74, 73, 8, 76, 19, 87, 6, 23, 74, 75, 67, 65, 67, 84, 76, 81, 61, 52, 45, 99, 98, 81, 84, 6, 92, 90, 70, 79, 75, 48, 1, 100, 72, 8, 75, 90, 46, 32, 64, 19, 6, 30, 35, 24, 65, 10, 56, 25, 61, 52, 23, 59, 33, 6, 64, 24, 48, 33, 54, 74, 80, 54, 73, 3, 13, 99, 92, 58, 30, 7, 29, 35, 88, 63, 10, 52, 73, 65, 76, 85, 16, 50, 95, 100, 8, 58, 24, 55, 42, 29, 28, 73, 35, 52, 75, 47, 50, 18, 57, 31, 24, 85, 17, 11, 99, 26, 62, 23, 42, 89, 60, 57, 91, 54, 9, 98, 12, 84, 4, 5, 12, 83, 30, 46, 86, 4, 45, 35, 74, 1, 17, 97, 37, 33, 60, 87, 58, 73, 62, 51, 62, 21, 7, 52, 74, 67, 1, 85, 50, 56, 42, 14, 38, 71, 59, 23, 26, 55, 9, 99, 7, 25, 48, 95, 57, 7, 82, 66, 79, 43, 16, 92, 63, 74, 95, 88, 41, 95, 73, 42, 50, 66, 55, 39, 36, 66, 13, 61, 20, 73, 60, 79, 97, 7, 73, 5, 65, 6, 22, 95, 100, 89, 87, 14, 63, 81, 2, 55, 28, 26, 96, 29, 91, 51, 68, 26, 16, 32, 38, 87, 5, 49, 65, 53, 7, 90, 58, 71, 95, 31, 66, 95, 20, 4, 8, 34, 84, 61, 40, 63, 86, 87, 92, 76, 89, 11, 53, 4, 42, 91, 43, 46, 91, 7, 99, 98, 48, 8, 20, 43, 90, 37, 89, 61, 40, 48, 94, 76, 9, 85, 38, 94, 72, 81, 22, 60, 91, 74, 16, 33, 16, 58, 30, 59, 16, 80, 56, 64, 39, 27, 58, 29, 64, 46, 89, 3, 93, 35, 30, 53, 19, 68, 47, 42, 100, 20, 2, 91, 93, 69, 75, 61, 78, 56, 19, 93, 36, 26, 8, 74, 52, 65, 54, 15, 62, 95, 70, 55, 81, 99, 59, 99, 18, 5, 93, 18, 76, 46, 60, 21, 14, 34, 81, 91, 89, 51, 35, 76, 76, 43, 2, 79, 59, 7, 46, 21, 1, 67, 27, 81, 17, 85, 32, 35, 42, 24, 4, 17, 69, 63, 37, 34, 48, 69, 24, 88, 19, 58, 64, 46, 52, 17, 77, 11, 23, 22, 83, 24, 88, 9, 56, 4, 45, 87, 90, 86, 62, 93, 55, 30, 7, 43, 15, 54, 12, 38, 94, 82, 48, 57, 80, 99, 25, 56, 61, 47, 29, 43, 22, 68, 3, 78, 23, 48, 64, 13, 85, 26, 57, 39, 7, 16, 34, 22, 69, 97, 11, 62, 78, 10, 70, 9, 9, 94, 16, 21, 93, 44, 64, 14, 63, 18, 91, 86, 65, 7, 98, 2, 84, 6, 92, 42, 21, 25, 15, 42, 21, 26, 55, 51, 35, 25, 59, 95, 70, 75, 68, 14, 70, 83, 28, 33, 100, 70, 18, 17, 28, 67, 18, 11, 72, 9, 5, 93, 34, 19, 86, 54, 96, 40, 56, 83, 16, 15, 29, 38, 41, 96, 51, 62, 78, 30, 94, 30, 52, 63, 46, 79, 29, 63, 42, 53, 23, 46, 97, 56, 16, 82, 62, 12, 21, 17, 46, 37, 83, 74, 74, 23, 22, 76, 85, 99, 6, 30, 80, 57, 93, 25, 35, 73, 39, 28, 25, 62, 73, 21, 69, 89, 54, 30, 52, 75, 99, 97, 63, 81, 22, 36, 56, 43, 11, 40, 94, 68, 21, 73, 24, 13, 98, 11, 38, 88, 38, 62, 49, 11, 35, 18, 51, 88, 99, 54, 14, 97, 2, 76, 30, 23, 63, 85, 66, 26, 76, 59, 93, 48, 83, 17, 13, 32, 79, 50, 20, 16, 11, 68, 78, 97, 37, 80, 85, 36, 33, 98, 84, 34, 74, 65, 9, 36, 1, 74, 61, 28, 84, 6, 76, 66, 74, 88, 50, 52, 37, 69, 67, 99, 36, 45, 96, 73, 76, 80, 60, 9, 29, 95, 94, 54, 60, 2, 42, 60, 75, 54, 88, 10, 59, 63, 28, 32, 2, 77, 83, 38, 45, 2, 36, 32, 98, 31, 56, 73, 62, 15, 81, 43, 10, 27, 96, 69, 28, 37, 80, 55, 91, 67, 16, 49, 81, 43, 33, 82, 71, 67, 71, 67, 68, 7, 99, 65, 89, 54, 38, 3, 21, 70, 45, 82, 96, 40, 2, 24, 29, 81, 30, 19, 48, 45, 19, 80, 88, 51, 14, 10, 18, 84, 77, 37, 42, 27, 2, 31, 32, 91, 85, 52, 12, 29, 85, 8, 20, 86, 83, 48, 67, 64, 66, 66, 8, 37, 45, 47, 39, 58, 57, 8, 94, 85, 45, 35, 11, 98, 17, 94, 40, 1, 46, 51, 29, 82, 10, 1, 68, 44, 48, 34, 7, 66, 51, 15, 2, 95, 13, 92, 5, 69, 100, 98, 53, 44, 84, 15, 93, 1, 9, 32, 1, 6, 34, 82, 87, 44, 82, 6, 39, 81, 39, 46, 46, 89, 12, 99, 36, 24, 91, 92, 45, 90, 41, 49, 85, 24, 64, 29, 24, 24, 60, 77, 81, 45, 58, 19, 88, 91, 25, 27, 71, 63, 24, 17, 4, 35, 67, 91, 10, 57, 82, 54, 98, 22, 3, 34, 97, 18, 62, 73, 41, 73, 1, 21, 18, 58, 39, 57, 100, 63, 35, 70, 78, 10, 38, 33, 96, 5, 23, 6, 13, 4, 11, 63, 77, 13, 48, 25, 30, 62, 49, 22, 86, 49, 94, 3, 58, 85, 12, 57, 99, 98, 27, 28, 8, 64, 60, 3, 20, 82, 8, 85, 37, 71, 47, 65, 83, 94, 42, 65, 7, 90, 38, 93, 39, 32, 47, 96, 68, 58, 53, 66, 56, 31, 94, 15, 46, 53, 17, 66, 87, 77, 2, 23, 47, 48, 40, 81, 93, 81, 97, 100, 70, 35, 92, 60, 18, 38, 8, 85, 48, 60, 50, 55, 42, 43, 69, 87, 48, 37, 4, 34, 65, 5, 8, 11, 52, 47, 44, 97, 79, 40, 48, 1, 74, 91, 12, 91, 80, 19, 75, 27, 30, 77, 33, 71, 71, 53, 58, 18, 90, 61, 3, 54, 66, 11, 17, 69, 9, 60, 65, 88, 51, 64, 40, 25, 54, 51, 67, 34, 70, 94, 12, 99, 70, 45, 70, 92, 97, 79, 10, 38, 39, 12, 92, 56, 74, 60, 25, 83, 71, 41, 22, 21, 5, 61, 97, 58, 63, 64, 43, 32, 9, 55, 83, 30, 51, 4, 21, 47, 82, 82, 37, 72, 46, 28, 28, 19, 39, 52, 53, 9, 44, 74, 81, 48, 86, 78, 58, 49, 93, 52, 32, 1, 6, 14, 82, 8, 17, 2, 55, 50, 36, 91, 22, 81, 70, 49, 99, 60, 52, 52, 68, 95, 77, 100, 95, 15, 77, 4, 15, 69, 55, 46, 21, 13, 12, 2, 20, 80, 56, 26, 30, 91, 68, 51, 71, 89, 51, 21, 48, 2, 72, 67, 48, 1, 67, 42, 15, 43, 97, 29, 64, 52, 26, 84, 16, 37, 38, 35, 69, 45, 61, 98, 35, 80, 100, 57, 69, 2, 77, 16, 3, 1, 35, 2, 1, 1, 96, 15, 95, 92, 95, 10, 95, 20, 94, 10, 57, 83, 45, 25, 27, 57, 74, 13, 36, 25, 69, 56, 26, 45, 72, 80, 97, 58, 81, 97, 58, 76, 63, 4, 20, 57, 14, 14, 77, 59, 24, 85, 41, 20, 61, 19, 76, 86, 31, 63, 10, 99, 19, 87, 95, 42, 18, 44, 99, 98, 40, 8, 26, 55, 63, 45, 11, 76, 58, 39, 86, 81, 75, 78, 52, 87, 96, 79, 72, 78, 42, 33, 28, 12, 71, 75, 5, 88, 18, 55, 86, 9, 14, 63, 63, 76, 7, 26, 4, 16, 16, 41, 97, 91, 19, 100, 77, 66, 79, 1, 44, 72, 33, 71, 83, 4, 97, 39, 91, 14, 93, 28, 23, 58, 90, 85, 33, 48, 62, 88, 64, 78, 29, 12, 68, 99, 11, 96, 64, 89, 96, 59, 60, 81, 82, 94, 84, 78, 84, 26, 92, 76, 6, 14, 33, 47, 50, 18, 95, 64, 57, 10, 41, 85, 73, 60, 83, 83, 55, 99, 24, 51, 57, 35, 83, 38, 81, 18, 16, 64, 43, 7, 92, 100, 72, 76, 47, 73, 45, 93, 36, 2, 54, 76, 86, 26, 35, 21, 60, 42, 19, 83, 44, 75, 70, 26, 65, 50, 43, 80, 65, 37, 38, 56, 37, 61, 84, 35, 33, 28, 79, 21, 29, 32, 48, 67, 57, 35, 87, 16, 76, 57, 51, 71, 83, 20, 96, 47, 21, 38, 26, 37, 26, 15, 93, 62, 75, 28, 48, 8, 55, 26, 80, 36, 57, 27, 2, 65, 13, 40, 33, 40, 48, 83, 10, 30, 54, 5, 77, 26, 94, 54, 62, 20, 21, 6, 81, 95, 33, 81, 54, 40, 6, 33, 75, 15, 12, 76, 79, 24, 15, 11, 16, 62, 45, 25, 43, 98, 30, 71, 75, 23, 77, 37, 94, 97, 94, 27, 91, 27, 7, 97, 66, 12, 29, 40, 26, 92, 67, 57, 68, 33, 67, 83, 46, 12, 7, 88, 61, 88, 59, 36, 63, 87, 24, 56, 83, 17, 82, 25, 95, 40, 21, 60, 52, 2, 51, 29, 45, 17, 85, 12, 1, 4, 46, 46, 67, 5, 34, 27, 92, 44, 14, 6, 30, 37, 14, 64, 6, 47, 88, 100, 87, 61, 12, 90, 14, 62, 70, 58, 31, 7, 22, 83, 10, 67, 29, 76, 71, 14, 54, 15, 57, 68, 72, 38, 56, 85, 53, 61, 32, 92, 61, 18, 52, 72, 59, 65, 85, 28, 75, 67, 34, 96, 50, 43, 62, 30, 70, 85, 43, 76, 51, 51, 43, 22, 40, 50, 7, 92, 11, 90, 83, 23, 7, 87, 46, 17, 3, 82, 44, 77, 49, 78, 24, 50, 72, 86, 79, 94, 22, 73, 69, 72, 23, 63, 93, 62, 12, 51, 5, 22, 40, 39, 96, 98, 77, 41, 14, 32, 23, 10, 8, 23, 39, 32, 24, 62, 69, 54, 55, 90, 26, 75, 13, 100, 37, 57, 61, 49, 60, 17, 22, 51, 55, 70, 49, 84, 10, 14, 15, 84, 75, 74, 6, 13, 57, 29, 27, 25, 82, 81, 66, 59, 8, 30, 58, 44, 87, 18, 44, 98, 86, 18, 48, 93, 87, 96, 76, 48, 62, 90, 32, 88, 63, 89, 1, 20, 18, 27, 96, 51, 59, 14, 10, 18, 43, 67, 62, 81, 37, 57, 78, 22, 26, 26, 14, 64, 73, 41, 12, 86, 30, 43, 74, 45, 31, 26, 64, 100, 4, 11, 3, 14, 24, 12, 32, 67, 30, 45, 99, 66, 1, 77, 40, 79, 2, 5, 42, 26, 46, 53, 12, 27, 47, 85, 71, 30, 10, 86, 29, 13, 97, 31, 26, 20, 94, 9, 38, 24, 53, 37, 41, 54, 13, 80, 32, 66, 85, 73, 91, 82, 78, 54, 8, 24, 38, 79, 53, 99, 64, 34, 63, 60, 16, 41, 32, 62, 49, 69, 85, 2, 57, 25, 7, 21, 5, 90, 86, 41, 62, 29, 22, 91, 82, 29, 15, 72, 7, 19, 22, 23, 4, 85, 34, 20, 25, 65, 81, 73, 34, 17, 26, 42, 41, 32, 63, 97, 21, 100, 89, 35, 28, 10, 25, 62, 91, 91, 85, 49, 10, 6, 71, 65, 90, 5, 84, 14, 69, 16, 39, 54, 84, 64, 96, 77, 48, 10, 73, 68, 9, 62, 2, 37, 23, 27, 50, 13, 17, 34, 62, 78, 39, 32, 43, 81, 88, 78, 94, 57, 46, 84, 62, 29, 100, 9, 5, 47, 18, 30, 14, 27, 43, 68, 15, 65, 46, 16, 78, 62, 49, 91, 92, 39, 22, 86, 19, 10, 15, 65, 18, 60, 100, 31, 41, 99, 40, 45, 45, 57, 74, 11, 83, 16, 78, 49, 33, 23, 64, 10, 36, 64, 52, 79, 3, 25, 64, 21, 86, 31, 37, 3, 90, 37, 34, 30, 35, 73, 27, 32, 81, 52, 42, 16, 20, 71, 64, 52, 45, 28, 13, 80, 91, 64, 11, 45, 88, 26, 66, 74, 56, 54, 28, 98, 90, 61, 27, 25, 85, 5, 8, 66, 57, 49, 33, 76, 71, 96, 27, 15, 75, 39, 46, 18, 54, 8, 62, 41, 34, 79, 66, 89, 33, 94, 86, 74, 6, 65, 98, 91, 69, 5, 8, 25, 5, 40, 52, 27, 87, 78, 93, 14, 68, 91, 31, 21, 98, 44, 14, 31, 75, 79, 72, 59, 72, 9, 32, 78, 25, 82, 20, 94, 38, 79, 70, 43, 70, 22, 21, 56, 51, 14, 69, 19, 4, 51, 91, 1, 95, 4, 84, 21, 35, 7, 79, 58, 15, 10, 35, 40, 91, 6, 85, 81, 84, 6, 23, 53, 27, 95, 61, 30, 60, 81, 100, 63, 32, 90, 16, 78, 46, 51, 98, 32, 57, 28, 89, 71, 37, 76, 62, 80, 81, 46, 60, 17, 52, 34, 69, 30, 80, 81, 11, 40, 62, 10, 2, 93, 52, 69, 70, 49, 19, 19, 80, 75, 46, 68, 98, 34, 95, 59, 65, 76, 57, 76, 92, 60, 61, 12, 89, 41, 93, 100, 32, 54, 61, 33, 98, 12, 54, 19, 60, 72, 37, 91, 99, 34, 59, 96, 19, 5, 54, 36, 80, 62, 11, 23, 21, 24, 35, 10, 64, 79, 61, 95, 84, 21, 79, 81, 85, 84, 99, 44, 56, 87, 35, 6, 72, 45, 1, 90, 49, 6, 25, 81, 68, 88, 3, 88, 11, 89, 49, 26, 67, 61, 72, 2, 34, 50, 82, 18, 86, 80, 13, 93, 18, 47, 98, 89, 43, 50, 31, 44, 55, 55, 76, 74, 94, 78, 14, 4, 19, 14, 29, 37, 75, 100, 39, 60, 2, 20, 77, 87, 52, 89, 79, 21, 88, 28, 10, 30, 77, 40, 25, 83, 46, 100, 9, 40, 30, 22, 43, 48, 87, 24, 36, 13, 75, 74, 72, 76, 46, 48, 14, 49, 37, 44, 69, 76, 71, 30, 57, 99, 21, 82, 82, 67, 33, 90, 58, 62, 63, 52, 61, 1, 75, 97, 14, 50, 22, 85, 77, 19, 85, 43, 19, 73, 86, 40, 48, 9, 69, 4, 7, 90, 37, 40, 8, 70, 81, 65, 83, 43, 16, 44, 96, 43, 92, 9, 92, 65, 45, 20, 36, 81, 62, 54, 53, 100, 93, 52, 60, 14, 8, 18, 3, 44, 58, 62, 65, 38, 26, 48, 33, 93, 91, 28, 35, 34, 88, 78, 98, 84, 98, 85, 65, 11, 39, 17, 62, 83, 21, 73, 96, 28, 91, 50, 71, 48, 11, 88, 37, 36, 35, 69, 81, 77, 48, 15, 10, 87, 93, 59, 71, 42, 44, 35, 4, 34, 3, 18, 16, 23, 90, 64, 50, 80, 13, 73, 79, 24, 60, 16, 11, 46, 36, 91, 22, 36, 58, 83, 22, 2, 93, 44, 43, 36, 78, 98, 21, 33, 15, 89, 7, 57, 52, 57, 88, 64, 81, 67, 87, 92, 34, 50, 37, 69, 40, 10, 4, 49, 92, 78, 50, 84, 21, 92, 72, 51, 42, 44, 35, 8, 32, 41, 64, 83, 49, 4, 99, 29, 70, 85, 72, 3, 86, 60, 23, 78, 69, 79, 26, 60, 56, 76, 96, 28, 19, 19, 30, 60, 62, 64, 20, 94, 5, 35, 28, 5, 38, 26, 86, 7, 63, 57, 61, 48, 17, 84, 25, 85, 62, 3, 97, 69, 78, 92, 96, 96, 62, 78, 8, 23, 41, 79, 68, 97, 13, 96, 2, 51, 21, 87, 9, 83, 95, 70, 83, 11, 5, 59, 48, 66, 61, 44, 86, 38, 87, 81, 86, 48, 10, 45, 22, 3, 23, 90, 99, 87, 85, 52, 89, 57, 90, 98, 92, 37, 19, 74, 47, 75, 32, 46, 92, 45, 41, 77, 82, 79, 9, 19, 78, 19, 15, 100, 21, 37, 89, 71, 76, 25, 75, 64, 81, 64, 13, 72, 52, 83, 97, 51, 57, 81, 96, 48, 25, 37, 24, 58, 67, 85, 29, 45, 3, 43, 44, 75, 32, 84, 45, 7, 8, 19, 22, 88, 35, 35, 12, 86, 17, 60, 88, 26, 40, 84, 25, 16, 72, 1, 26, 38, 85, 54, 82, 39, 96, 77, 13, 27, 60, 57, 85, 67, 28, 7, 7, 14, 93, 18, 51, 9, 29, 39, 86, 69, 22, 11, 36, 45, 11, 61, 82, 47, 14, 16, 85, 62, 92, 97, 88, 4, 5, 25, 70, 32, 31, 76, 45, 23, 45, 48, 83, 74, 86, 69, 94, 59, 31, 29, 3, 93, 42, 36, 39, 55, 3, 23, 16, 95, 19, 56, 98, 23, 80, 19, 7, 62, 47, 3, 84, 91, 50, 66, 16, 35, 86, 61, 93, 68, 90, 47, 60, 83, 83, 98, 37, 85, 20, 5, 31, 90, 12, 80, 65, 91, 51, 71, 52, 97, 73, 87, 39, 75, 4, 55, 9, 42, 15, 54, 9, 56, 100, 69, 90, 34, 18, 27, 71, 90, 83, 1, 79, 94, 33, 43, 36, 83, 65, 39, 79, 90, 77, 69, 64, 80, 75, 24, 21, 42, 77, 30, 97, 29, 50, 87, 14, 67, 65, 84, 56, 99, 85, 87, 44, 69, 81, 31, 51, 46, 69, 81, 87, 97, 49, 50, 76, 24, 73, 49, 65, 2, 30, 13, 82, 79, 51, 95, 97, 67, 79, 5, 65, 15, 91, 60, 35, 71, 90, 85, 68, 10, 17, 54, 6, 65, 55, 34, 40, 80, 82, 56, 33, 11, 69, 14, 41, 71, 60, 89, 38, 90, 93, 54, 56, 35, 14, 90, 58, 3, 26, 25, 13, 42, 31, 70, 59, 37, 3, 50, 16, 36, 6, 100, 98, 74, 65, 38, 44, 77, 79, 33, 66, 71, 87, 74, 6, 100, 15, 15, 2, 41, 91, 66, 34, 73, 88, 44, 10, 42, 46, 77, 78, 51, 77, 75, 76, 93, 65, 71, 69, 43, 4, 87, 65, 90, 60, 22, 41, 74, 36, 94, 66, 27, 60, 52, 99, 99, 47, 60, 40, 92, 37, 17, 94, 65, 44, 69, 57, 60, 40, 26, 54, 95, 64, 18, 36, 23, 92, 76, 48, 79, 69, 66, 57, 80, 17, 56, 78, 15, 67, 70, 59, 55, 38, 52, 19, 81, 73, 28, 92, 64, 5, 45, 58, 68, 15, 93, 90, 6, 68, 89, 84, 88, 54, 41, 68, 22, 48, 97, 37, 66, 66, 47, 21, 4, 98, 39, 84, 22, 66, 28, 85, 22, 72, 94, 89, 86, 86, 30, 43, 5, 19, 79, 45, 24, 71, 12, 46, 18, 8, 34, 35, 74, 80, 55, 77, 29, 94, 12, 51, 11, 39, 87, 85, 63, 81, 73, 100, 18, 55, 43, 23, 25, 21, 67, 48, 91, 30, 93, 60, 37, 78, 94, 62, 9, 1, 90, 38, 46, 54, 40, 8, 44, 26, 92, 6, 6, 17, 6, 76, 71, 100, 50, 95, 20, 68, 94, 62, 97, 39, 73, 85, 16, 18, 99, 25, 18, 88, 14, 63, 41, 53, 71, 85, 30, 14, 42, 88, 30, 99, 63, 100, 98, 12, 46, 69, 79, 40, 82, 27, 78, 54, 11, 93, 24, 9, 69, 41, 97, 82, 56, 89, 34, 78, 25, 16, 91, 19, 3, 21, 17, 65, 72, 15, 76, 18, 35, 6, 57, 17, 32, 86, 22, 42, 78, 45, 3, 47, 38, 51, 80, 45, 39, 66, 22, 16, 81, 64, 34, 83, 84, 50, 47, 8, 16, 74, 25, 51, 31, 33, 19, 62, 18, 40, 55, 47, 85, 9, 45, 22, 59, 25, 66, 50, 90, 39, 65, 70, 2, 50, 4, 38, 99, 2, 45, 67, 27, 21, 69, 57, 53, 87, 70, 22, 26, 76, 68, 10, 85, 65, 83, 43, 89, 100, 44, 30, 90, 8, 99, 92, 9, 54, 81, 60, 55, 77, 26, 81, 97, 94, 89, 1, 80, 58, 74, 57, 33, 41, 19, 17, 5, 1, 12, 45, 53, 55, 74, 42, 15, 24, 85, 23, 77, 65, 82, 83, 41, 7, 63, 89, 52, 51, 89, 83, 60, 62, 40, 93, 55, 58, 61, 11, 10, 72, 56, 62, 27, 81, 56, 41, 5, 40, 63, 81, 5, 45, 64, 97, 3, 78, 86, 55, 81, 26, 89, 40, 40, 28, 32, 94, 37, 45, 56, 99, 16, 11, 60, 94, 92, 15, 34, 48, 7, 49, 80, 63, 45, 95, 59, 99, 73, 96, 5, 5, 22, 94, 44, 61, 73, 28, 6, 10, 72, 13, 8, 87, 24, 19, 81, 67, 86, 66, 66, 92, 66, 45, 6, 62, 40, 64, 61, 64, 60, 65, 68, 33, 10, 11, 45, 83, 90, 2, 44, 61, 14, 3, 100, 89, 73, 32, 7, 58, 49, 72, 1, 15, 17, 6, 76, 8, 22, 88, 71, 81, 53, 90, 65, 62, 100, 9, 96, 90, 10, 39, 2, 75, 93, 1, 64, 66, 84, 70, 75, 33, 42, 76, 47, 58, 33, 74, 17, 54, 62, 87, 86, 66, 76, 2, 79, 27, 10, 27, 68, 71, 17, 70, 46, 10, 22, 9, 75, 6, 78, 49, 38, 71, 76, 36, 80, 61, 61, 96, 66, 74, 34, 52, 39, 61, 5, 70, 88, 15, 96, 7, 37, 12, 28, 82, 21, 2, 42, 47, 7, 72, 48, 96, 42, 75, 83, 22, 35, 43, 17, 1, 69, 3, 4, 7, 63, 8, 28, 50, 74, 23, 9, 11, 35, 36, 44, 7, 37, 86, 6, 95, 9, 53, 42, 50, 27, 24, 23, 14, 19, 92, 14, 87, 94, 17, 45, 56, 76, 73, 58, 50, 95, 66, 60, 81, 53, 55, 40, 90, 92, 45, 36, 100, 97, 78, 50, 75, 1, 24, 88, 71, 15, 53, 57, 60, 69, 2, 16, 97, 74, 25, 46, 20, 42, 57, 53, 94, 63, 92, 35, 55, 36, 71, 54, 84, 48, 55, 58, 100, 79, 98, 71, 45, 50, 27, 5, 71, 80, 72, 67, 5, 48, 64, 77, 89, 72, 29, 82, 34, 20, 69, 88, 55, 39, 94, 90, 86, 48, 47, 85, 78, 96, 55, 23, 46, 34, 79, 16, 13, 2, 34, 70, 49, 97, 46, 89, 68, 74, 22, 53, 93, 90, 41, 99, 28, 34, 88, 65, 33, 86, 50, 11, 82, 56, 85, 27, 41, 15, 94, 54, 68, 27, 75, 16, 23, 20, 4, 42, 45, 77, 94, 37, 67, 86, 87, 94, 71, 74, 11, 4, 11, 60, 66, 92, 67, 2, 70, 8, 16, 63, 13, 83, 89, 87, 50, 63, 58, 5, 56, 2, 81, 2, 90, 47, 87, 76, 93, 10, 1, 3, 65, 11, 14, 30, 55, 32, 83, 24, 39, 98, 39, 3, 32, 79, 41, 33, 42, 98, 37, 97, 99, 69, 98, 40, 68, 37, 15, 12, 46, 67, 66, 10, 78, 79, 91, 84, 62, 73, 59, 1, 22, 97, 55, 5, 76, 96, 37, 69, 93, 25, 17, 44, 45, 67, 83, 12, 3, 50, 75, 100, 16, 40, 61, 45, 70, 51, 28, 32, 75, 87, 84, 96, 83, 38, 52, 10, 33, 88, 78, 78, 64, 47, 73, 8, 13, 7, 72, 67, 56, 46, 66, 24, 86, 78, 68, 55, 80, 96, 38, 54, 34, 21, 1, 16, 59, 52, 78, 43, 91, 55, 72, 54, 1, 44, 61, 65, 51, 32, 31, 58, 78, 48, 81, 15, 25, 49, 21, 4, 96, 59, 57, 29, 79, 9, 44, 89, 60, 73, 84, 50, 80, 55, 55, 32, 51, 16, 97, 53, 99, 27, 10, 76, 75, 91, 42, 99, 39, 63, 55, 86, 21, 63, 14, 51, 72, 9, 92, 31, 82, 27, 33, 61, 33, 87, 92, 83, 54, 88, 35, 53, 67, 97, 80, 93, 87, 22, 43, 77, 36, 97, 62, 8, 60, 75, 58, 31, 83, 1, 13, 64, 79, 97, 76, 12, 36, 68, 46, 89, 7, 33, 93, 25, 29, 25, 17, 15, 98, 60, 43, 33, 56, 4, 40, 67, 30, 49, 49, 64, 50, 14, 80, 28, 10, 55, 91, 45, 74, 37, 86, 81, 69, 78, 5, 49, 54, 74, 63, 51, 33, 57, 83, 40, 12, 22, 59, 93, 23, 7, 56, 24, 20, 35, 3, 30, 42, 94, 26, 15, 82, 63, 47, 50, 93, 4, 98, 46, 77, 12, 97, 61, 20, 31, 52, 31, 53, 10, 23, 27, 17, 78, 50, 88, 65, 52, 69, 58, 45, 95, 72, 26, 9, 71, 27, 1, 26, 76, 47, 54, 87, 95, 14, 58, 25, 65, 88, 29, 27, 62, 55, 43, 92, 4, 82, 56, 56, 51, 13, 52, 97, 36, 78, 5, 6, 56, 6, 83, 32, 4, 36, 70, 98, 49, 28, 74, 66, 15, 3, 44, 77, 57, 86, 68, 13, 19, 75, 20, 69, 39, 71, 65, 74, 48, 22, 32, 4, 79, 14, 87, 82, 50, 56, 31, 50, 83, 56, 67, 50, 58, 10, 78, 67, 47, 45, 31, 66, 71, 50, 86, 9, 20, 3, 34, 20, 24, 17, 75, 2, 31, 61, 35, 32, 16, 17, 33, 99, 72, 52, 100, 30, 13, 77, 48, 60, 73, 78, 77, 43, 27, 14, 3, 46, 16, 36, 17, 91, 53, 91, 92, 35, 51, 78, 18, 67, 94, 2, 17, 66, 53, 16, 47, 18, 92, 94, 29, 64, 23, 57, 58, 49, 70, 60, 46, 38, 47, 63, 28, 51, 53, 72, 85, 56, 49, 54, 22, 43, 56, 90, 60, 60, 57, 58, 77, 48, 51, 5, 63, 25, 13, 20, 25, 83, 31, 70, 20, 77, 84, 47, 28, 89, 18, 64, 44, 19, 18, 17, 13, 25, 58, 72, 36, 14, 29, 65, 13, 31, 21, 27, 7, 34, 98, 31, 16, 28, 52, 87, 56, 36, 33, 83, 76, 3, 99, 71, 73, 68, 87, 85, 92, 44, 8, 79, 9, 88, 43, 21, 70, 64, 47, 76, 97, 44, 6, 64, 71, 57, 50, 78, 44, 34, 13, 71, 88, 11, 41, 60, 78, 27, 44, 21, 22, 3, 51, 30, 90, 94, 2, 59, 57, 48, 34, 5, 91, 91, 68, 13, 100, 17, 43, 43, 2, 55, 14, 90, 65, 6, 49, 94, 33, 45, 66, 6, 47, 68, 88, 89, 61, 89, 47, 69, 37, 33, 73, 79, 23, 92, 44, 22, 8, 86, 17, 62, 92, 82, 51, 8, 87, 99, 53, 71, 95, 70, 77, 42, 37, 64, 82, 98, 4, 28, 18, 40, 12, 91, 71, 35, 34, 66, 8, 42, 3, 24, 55, 94, 5, 5, 53, 92, 3, 5, 62, 50, 74, 90, 43, 10, 5, 24, 59, 9, 51, 77, 100, 15, 19, 22, 49, 52, 87, 56, 45, 41, 32, 99, 34, 36, 3, 86, 79, 58, 42, 93, 7, 15, 82, 49, 77, 39, 72, 35, 47, 74, 63, 98, 88, 81, 20, 88, 33, 6, 96, 77, 99, 27, 28, 84, 14, 30, 22, 45, 87, 63, 37, 45, 30, 70, 93, 6, 8, 16, 92, 6, 42, 55, 4, 29, 87, 75, 69, 19, 32, 64, 48, 30, 90, 75, 14, 55, 56, 35, 99, 95, 97, 87, 39, 78, 57, 84, 83, 16, 51, 27, 74, 92, 81, 29, 21, 67, 3, 89, 38, 34, 4, 37, 64, 93, 63, 29, 99, 18, 63, 98, 12, 11, 84, 3, 89, 92, 38, 23, 60, 88, 49, 85, 80, 29, 13, 52, 48, 67, 40, 37, 100, 95, 73, 15, 87, 35, 43, 85, 4, 57, 34, 68, 68, 70, 70, 56, 61, 7, 78, 72, 94, 27, 56, 25, 7, 20, 76, 6, 86, 67, 42, 86, 61, 14, 52, 99, 48, 95, 36, 52, 51, 69, 71, 70, 38, 40, 77, 51, 98, 7, 22, 43, 33, 78, 68, 91, 97, 95, 97, 35, 62, 38, 72, 22, 4, 23, 73, 3, 69, 8, 6, 72, 76, 76, 41, 14, 67, 18, 64, 64, 24, 37, 7, 8, 14, 26, 50, 63, 20, 98, 97, 81, 88, 20, 55, 91, 42, 27, 93, 11, 34, 51, 82, 61, 26, 74, 26, 93, 91, 41, 56, 66, 78, 14, 25, 91, 91, 75, 5, 11, 72, 53, 43, 59, 72, 49, 49, 66, 27, 94, 76, 12, 44, 9, 73, 21, 34, 50, 13, 77, 91, 21, 42, 68, 86, 67, 10, 77, 41, 15, 39, 64, 19, 33, 23, 43, 82, 23, 8, 60, 16, 35, 24, 11, 43, 48, 32, 28, 97, 96, 4, 87, 16, 46, 54, 2, 64, 16, 30, 56, 82, 68, 19, 100, 100, 41, 42, 33, 16, 49, 45, 31, 83, 68, 94, 77, 15, 25, 5, 11, 20, 60, 50, 88, 57, 55, 89, 20, 70, 70, 75, 51, 37, 46, 51, 88, 38, 44, 73, 53, 45, 17, 36, 27, 84, 29, 56, 98, 5, 12, 60, 76, 71, 9, 63, 28, 16, 3, 99, 85, 72, 74, 36, 60, 71, 38, 48, 8, 33, 20, 61, 77, 36, 96, 56, 71, 76, 63, 20, 80, 74, 79, 7, 96, 40, 70, 75, 55, 24, 74, 91, 96, 99, 78, 7, 69, 67, 54, 76, 100, 25, 88, 28, 60, 83, 35, 82, 10, 97, 1, 89, 22, 32, 96, 70, 23, 17, 44, 29, 40, 69, 19, 87, 67, 97, 94, 87, 15, 99, 15, 66, 24, 2, 94, 35, 37, 28, 17, 46, 77, 69, 87, 98, 100, 34, 19, 22, 50, 63, 2, 41, 83, 21, 80, 50, 69, 25, 88, 83, 23, 2, 49, 98, 4, 94, 33, 92, 73, 1, 37, 49, 69, 75, 99, 21, 8, 17, 94, 9, 31, 96, 50, 14, 68, 81, 15, 88, 5, 2, 70, 79, 4, 70, 29, 59, 15, 13, 2, 88, 13, 90, 36, 33, 65, 86, 53, 72, 3, 99, 81, 33, 46, 82, 98, 13, 14, 12, 100, 70, 14, 21, 48, 69, 43, 28, 79, 57, 40, 80, 96, 52, 69, 84, 37, 33, 69, 41, 57, 23, 39, 89, 56, 84, 70, 53, 48, 35, 17, 47, 4, 30, 68, 3, 98, 62, 31, 28, 18, 70, 7, 66, 74, 27, 49, 10, 12, 17, 50, 68, 40, 41, 56, 47, 24, 77, 51, 72, 63, 67, 70, 66, 96, 89, 68, 45, 50, 98, 24, 20, 68, 30, 85, 41, 9, 33, 2, 20, 1, 51, 39, 40, 91, 46, 38, 67, 74, 89, 90, 36, 55, 59, 1, 3, 48, 20, 99, 49, 70, 23, 68, 37, 4, 4, 29, 12, 88, 30, 83, 89, 32, 73, 80, 75, 18, 18, 41, 43, 58, 30, 78, 64, 40, 30, 66, 39, 2, 17, 88, 71, 39, 7, 59, 42, 11, 39, 6, 98, 20, 40, 38, 51, 13, 18, 25, 82, 87, 17, 25, 44, 46, 54, 7, 38, 36, 73, 76, 89, 89, 63, 59, 79, 70, 17, 72, 32, 7, 77, 29, 26, 69, 67, 76, 81, 36, 53, 14, 22, 69, 90, 65, 67, 44, 71, 4, 31, 95, 79, 19, 35, 94, 29, 13, 63, 97, 37, 46, 3, 65, 26, 28, 33, 44, 55, 65, 79, 7, 79, 100, 28, 68, 16, 94, 63, 39, 49, 45, 85, 79, 15, 20, 72, 43, 84, 86, 39, 20, 31, 93, 85, 57, 20, 69, 100, 27, 34, 79, 33, 12, 30, 12, 31, 46, 57, 94, 36, 5, 90, 20, 36, 5, 39, 7, 99, 75, 93, 38, 46, 23, 82, 82, 31, 54, 51, 31, 80, 84, 61, 64, 47, 90, 76, 29, 87, 84, 74, 22, 41, 64, 42, 76, 68, 32, 82, 66, 58, 26, 55, 56, 49, 37, 37, 79, 42, 39, 61, 21, 74, 21, 36, 20, 11, 11, 49, 49, 47, 22, 71, 87, 37, 64, 62, 4, 47, 95, 22, 57, 21, 76, 12, 21, 64, 48, 99, 57, 87, 12, 77, 60, 32, 65, 32, 94, 27, 32, 43, 73, 5, 65, 59, 42, 28, 72, 45, 26, 67, 18, 82, 87, 46, 93, 7, 61, 41, 57, 18, 79, 68, 46, 90, 52, 10, 21, 45, 37, 52, 87, 9, 57, 51, 68, 98, 30, 91, 94, 8, 57, 12, 89, 95, 57, 82, 1, 17, 74, 10, 34, 4, 29, 32, 93, 80, 41, 66, 25, 77, 17, 63, 86, 25, 66, 5, 74, 47, 95, 68, 54, 4, 31, 43, 98, 39, 76, 51, 55, 1, 60, 41, 56, 88, 72, 48, 20, 64, 13, 44, 41, 82, 58, 26, 6, 23, 82, 32, 70, 28, 51, 23, 31, 81, 17, 29, 19, 44, 79, 25, 44, 90, 17, 99, 29, 40, 99, 48, 4, 11, 43, 44, 44, 1, 21, 2, 23, 54, 33, 44, 81, 83, 19, 12, 15, 35, 92, 85};
+
+int output_array[NUM_BINS];
+int expected_array[NUM_BINS] = {7079, 7237, 7182, 7228, 7274};
+
+int output_array_accel[NUM_BINS*NUM_ACCELS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise2/solution/bambu.sh b/documentation/tutorial_pact_2022/04-simd/Exercise2/solution/bambu.sh
new file mode 100755
index 000000000..7b57b5af9
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise2/solution/bambu.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)/..
+bambu ${root_dir}/histogram.c \
+ --compiler=I386_GCC49 --experimental-setup=BAMBU-BALANCED-MP \
+ --device-name=5SGXEA7N2F45C1 --clock-period=10 \
+ -fwhole-program -fno-delete-null-pointer-checks -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 \
+ -fopenmp-simd=4 \
+ --simulate \
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise3/bambu.sh b/documentation/tutorial_pact_2022/04-simd/Exercise3/bambu.sh
new file mode 100755
index 000000000..d78d048a4
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise3/bambu.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)
+bambu ${root_dir}/histogram.c \
+ --compiler=I386_GCC49 --experimental-setup=BAMBU-BALANCED-MP \
+ --device-name=5SGXEA7N2F45C1 --clock-period=10 \
+ -fwhole-program -fno-delete-null-pointer-checks -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 \
+ --simulate \
+ "$@" |& tee log.txt
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise3/histogram.c b/documentation/tutorial_pact_2022/04-simd/Exercise3/histogram.c
new file mode 100644
index 000000000..11c9063cc
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise3/histogram.c
@@ -0,0 +1,98 @@
+#define NUM_ACCELS 8
+#define MAX_NUM 100
+#define NUM_BINS 5
+#define BIN_MAX_NUM MAX_NUM/NUM_BINS
+//#define ARRAY_SIZE 60
+//#define ARRAY_SIZE 120
+//#define ARRAY_SIZE 6000
+#define ARRAY_SIZE 36000
+#define OPS_PER_ACCEL ARRAY_SIZE/NUM_ACCELS
+
+#include
+#include "histogram.h"
+
+void histogram (int * input, int * output, int max_idx)
+{
+ int i, num;
+ int temp0 = 0, temp1 = 0, temp2 = 0, temp3 = 0, temp4 = 0, temp5 = 0;
+ //make local variables here instead of reading and writing to global memory each time???
+ for (i = 0; i < max_idx; i++)
+ {
+// printf ("%d\n", input[startidx]);
+ num = input[i];
+ if (num > 0 && num <= BIN_MAX_NUM)
+ {
+// output[0]+=1;
+ temp0 += 1;
+ }
+ else if (num > BIN_MAX_NUM && num <= (BIN_MAX_NUM * 2))
+ {
+// output[1]+=1;
+ temp1 += 1;
+ }
+ else if (num > (BIN_MAX_NUM * 2) && num <= (BIN_MAX_NUM * 3))
+ {
+// output[2]+=1;
+ temp2 += 1;
+ }
+ else if (num > (BIN_MAX_NUM * 3) && num <= (BIN_MAX_NUM * 4))
+ {
+// output[3]+=1;
+ temp3 += 1;
+ }
+ else
+ {
+// output[4]+=1;
+ temp4 += 1;
+ }
+ }
+ printf("%d\n", temp0);
+ output[0] += temp0;
+ output[1] += temp1;
+ output[2] += temp2;
+ output[3] += temp3;
+ output[4] += temp4;
+
+}
+
+int main ()
+{
+
+ int i, j;
+ int main_result = 0;
+
+ #pragma omp simd
+ for (i = 0; i < NUM_ACCELS; i++)
+ {
+ histogram(input_array + OPS_PER_ACCEL * i, output_array_accel + i * NUM_BINS, OPS_PER_ACCEL);
+ }
+
+ //could have been done with locks inside accelerator
+ //combine the results
+ for (i = 0; i < NUM_BINS; i++)
+ {
+ for (j = 0; j < NUM_ACCELS; j++)
+ {
+ output_array[i] += output_array_accel[i + j * NUM_BINS];
+ }
+ }
+
+ //check the results
+ for (i = 0; i < NUM_BINS; i++)
+ {
+ main_result += (output_array[i] == expected_array[i]);
+ }
+
+ //check final result
+ printf ("Result: %d\n", main_result);
+ if (main_result == NUM_BINS)
+ {
+ printf("RESULT: PASS\n");
+ return 0;
+ }
+ else
+ {
+ printf("RESULT: FAIL\n");
+ return 1;
+ }
+}
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise3/histogram.h b/documentation/tutorial_pact_2022/04-simd/Exercise3/histogram.h
new file mode 100644
index 000000000..ff015af91
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise3/histogram.h
@@ -0,0 +1,6 @@
+int input_array[ARRAY_SIZE] = {84, 87, 78, 16, 94, 36, 87, 93, 50, 22, 63, 28, 91, 60, 64, 27, 41, 27, 73, 37, 12, 69, 68, 30, 83, 31, 63, 24, 68, 36, 30, 3, 23, 59, 70, 68, 94, 57, 12, 43, 30, 74, 22, 20, 85, 38, 99, 25, 16, 71, 14, 27, 92, 81, 57, 74, 63, 71, 97, 82, 6, 26, 85, 28, 37, 6, 47, 30, 14, 58, 25, 96, 83, 46, 15, 68, 35, 65, 44, 51, 88, 9, 77, 79, 89, 85, 4, 52, 55, 100, 33, 61, 77, 69, 40, 13, 27, 87, 95, 40, 96, 71, 35, 79, 68, 2, 98, 3, 18, 93, 53, 57, 2, 81, 87, 42, 66, 90, 45, 20, 41, 30, 32, 18, 98, 72, 82, 76, 10, 28, 68, 57, 98, 54, 87, 66, 7, 84, 20, 25, 29, 72, 33, 30, 4, 20, 71, 69, 9, 16, 41, 50, 97, 24, 19, 46, 47, 52, 22, 56, 80, 89, 65, 29, 42, 51, 94, 1, 35, 65, 25, 15, 88, 57, 44, 92, 28, 66, 60, 37, 33, 52, 38, 29, 76, 8, 75, 22, 59, 96, 30, 38, 36, 94, 19, 29, 44, 12, 29, 30, 77, 5, 44, 64, 14, 39, 7, 41, 5, 19, 29, 89, 70, 18, 18, 97, 25, 44, 71, 84, 91, 100, 73, 26, 45, 91, 6, 40, 55, 87, 70, 83, 43, 65, 98, 8, 56, 5, 49, 12, 23, 29, 100, 44, 47, 69, 41, 23, 12, 11, 6, 2, 62, 31, 79, 6, 21, 37, 45, 27, 23, 66, 9, 17, 83, 59, 25, 38, 63, 25, 1, 37, 53, 100, 80, 51, 69, 72, 74, 32, 82, 31, 34, 95, 61, 64, 100, 82, 100, 97, 60, 74, 14, 69, 91, 96, 27, 67, 85, 41, 91, 85, 77, 43, 37, 8, 46, 57, 80, 19, 88, 13, 49, 73, 60, 10, 37, 11, 43, 88, 7, 2, 14, 73, 22, 56, 20, 100, 22, 5, 40, 12, 41, 68, 6, 29, 28, 51, 85, 59, 21, 25, 23, 70, 97, 82, 31, 85, 93, 73, 73, 51, 26, 86, 23, 100, 41, 43, 99, 14, 99, 91, 25, 91, 10, 82, 20, 37, 33, 56, 95, 5, 80, 70, 74, 77, 51, 56, 61, 43, 80, 85, 94, 6, 22, 68, 5, 14, 62, 55, 27, 60, 45, 3, 3, 7, 85, 22, 43, 69, 29, 90, 73, 9, 59, 99, 37, 9, 54, 49, 4, 34, 34, 49, 91, 55, 68, 47, 69, 30, 1, 47, 89, 98, 50, 91, 4, 34, 64, 98, 54, 93, 87, 26, 53, 97, 76, 89, 58, 30, 37, 61, 15, 22, 61, 5, 29, 28, 51, 49, 57, 3, 95, 98, 100, 44, 40, 3, 29, 4, 1, 82, 48, 39, 60, 52, 36, 35, 40, 93, 16, 28, 5, 30, 50, 65, 86, 30, 44, 36, 78, 1, 39, 72, 50, 90, 68, 89, 93, 96, 44, 45, 30, 91, 83, 41, 42, 70, 27, 33, 62, 43, 61, 18, 24, 62, 82, 10, 91, 26, 97, 68, 78, 35, 91, 27, 25, 58, 15, 69, 6, 59, 13, 87, 1, 47, 27, 95, 17, 53, 79, 30, 47, 91, 48, 71, 52, 81, 32, 94, 58, 28, 13, 87, 15, 56, 13, 91, 13, 80, 11, 70, 90, 75, 56, 42, 21, 34, 88, 89, 39, 67, 71, 85, 57, 18, 7, 61, 50, 38, 6, 60, 18, 19, 46, 84, 74, 59, 74, 38, 90, 84, 8, 79, 58, 15, 72, 30, 1, 60, 19, 39, 26, 89, 75, 34, 58, 82, 94, 59, 71, 100, 18, 40, 70, 64, 23, 95, 74, 48, 32, 63, 83, 91, 93, 92, 58, 16, 22, 58, 75, 92, 48, 52, 32, 22, 38, 41, 55, 31, 99, 26, 82, 17, 17, 3, 32, 40, 97, 5, 39, 81, 19, 22, 71, 63, 13, 80, 78, 86, 37, 5, 77, 84, 8, 60, 58, 45, 100, 12, 28, 51, 37, 61, 19, 6, 64, 50, 45, 12, 6, 35, 92, 76, 56, 15, 90, 69, 94, 19, 6, 83, 23, 83, 18, 31, 94, 75, 27, 94, 87, 54, 44, 75, 15, 14, 80, 78, 63, 76, 89, 20, 11, 33, 95, 18, 47, 36, 38, 92, 54, 44, 74, 29, 26, 92, 11, 19, 18, 37, 64, 56, 91, 59, 31, 5, 72, 62, 34, 86, 90, 74, 5, 52, 6, 51, 69, 4, 86, 7, 96, 40, 50, 21, 68, 27, 64, 78, 97, 82, 66, 61, 37, 56, 71, 19, 12, 43, 33, 97, 80, 22, 71, 85, 73, 28, 35, 41, 84, 73, 99, 31, 64, 48, 51, 31, 74, 15, 60, 23, 48, 25, 83, 36, 33, 5, 55, 44, 99, 87, 41, 79, 60, 63, 63, 84, 42, 49, 24, 25, 73, 23, 55, 36, 22, 58, 66, 48, 72, 77, 70, 19, 2, 4, 54, 34, 8, 60, 29, 7, 98, 21, 85, 9, 35, 99, 92, 77, 99, 16, 53, 72, 90, 60, 7, 11, 17, 25, 10, 40, 1, 79, 10, 54, 82, 15, 39, 90, 27, 68, 48, 24, 88, 32, 33, 23, 82, 76, 51, 80, 91, 55, 51, 32, 14, 58, 95, 82, 82, 4, 21, 34, 83, 82, 88, 16, 97, 26, 5, 23, 93, 52, 98, 33, 35, 82, 7, 16, 58, 9, 96, 100, 63, 98, 84, 77, 55, 78, 10, 88, 33, 83, 22, 67, 64, 61, 83, 12, 86, 87, 86, 31, 91, 84, 15, 77, 17, 21, 93, 26, 29, 40, 26, 91, 37, 61, 19, 44, 38, 29, 83, 22, 11, 56, 89, 26, 16, 71, 38, 54, 9, 23, 84, 51, 58, 98, 28, 27, 70, 72, 52, 50, 11, 29, 40, 99, 89, 11, 94, 78, 91, 77, 100, 53, 32, 88, 78, 100, 58, 67, 53, 18, 42, 36, 69, 99, 85, 96, 77, 6, 67, 29, 55, 29, 9, 94, 79, 98, 56, 73, 75, 46, 1, 26, 98, 84, 13, 28, 83, 22, 94, 35, 40, 35, 22, 60, 86, 58, 55, 62, 63, 73, 42, 17, 53, 51, 63, 83, 100, 18, 55, 74, 16, 7, 52, 65, 91, 64, 92, 73, 38, 38, 60, 29, 72, 81, 88, 57, 91, 42, 71, 53, 66, 12, 70, 18, 62, 84, 52, 13, 1, 7, 39, 68, 65, 90, 33, 55, 5, 76, 80, 42, 13, 39, 70, 37, 71, 57, 45, 61, 50, 15, 66, 15, 27, 87, 84, 40, 70, 36, 53, 22, 94, 91, 90, 10, 32, 74, 65, 36, 49, 96, 78, 14, 34, 99, 50, 56, 56, 94, 69, 57, 61, 34, 24, 87, 72, 59, 78, 41, 46, 82, 62, 91, 24, 51, 1, 55, 76, 65, 43, 25, 60, 20, 90, 45, 70, 39, 52, 77, 84, 20, 34, 44, 5, 57, 82, 76, 67, 12, 68, 13, 93, 30, 3, 69, 32, 3, 75, 8, 19, 17, 84, 78, 88, 73, 74, 58, 63, 26, 34, 98, 97, 19, 42, 54, 27, 75, 81, 94, 86, 49, 6, 31, 30, 60, 99, 61, 63, 25, 20, 81, 42, 3, 11, 81, 27, 84, 90, 41, 9, 24, 39, 58, 94, 32, 11, 21, 6, 91, 14, 92, 39, 71, 22, 68, 30, 72, 81, 44, 96, 100, 25, 89, 55, 87, 70, 33, 70, 11, 74, 31, 34, 64, 88, 80, 95, 50, 100, 52, 40, 65, 43, 31, 87, 16, 50, 16, 87, 82, 12, 35, 34, 88, 23, 88, 74, 44, 20, 43, 55, 45, 25, 40, 60, 64, 19, 54, 13, 70, 6, 5, 34, 100, 35, 20, 16, 36, 88, 54, 70, 51, 88, 3, 38, 63, 90, 11, 6, 61, 5, 12, 58, 30, 4, 17, 93, 22, 23, 6, 44, 80, 62, 29, 79, 48, 1, 46, 83, 88, 100, 52, 90, 87, 54, 27, 49, 95, 37, 7, 8, 93, 18, 65, 22, 21, 81, 67, 95, 55, 24, 38, 34, 85, 18, 13, 32, 18, 10, 66, 57, 9, 70, 46, 96, 23, 72, 96, 70, 60, 2, 77, 53, 72, 41, 26, 44, 73, 92, 90, 28, 67, 79, 13, 51, 97, 25, 34, 14, 87, 100, 71, 95, 69, 16, 42, 43, 40, 38, 64, 99, 91, 40, 3, 14, 32, 29, 58, 5, 72, 47, 84, 39, 26, 96, 41, 22, 73, 27, 35, 59, 26, 57, 53, 46, 73, 47, 40, 12, 84, 4, 62, 26, 43, 17, 40, 75, 45, 97, 31, 68, 95, 14, 58, 20, 61, 51, 93, 33, 77, 80, 91, 54, 36, 96, 99, 8, 42, 38, 71, 77, 41, 85, 2, 84, 1, 93, 10, 97, 41, 40, 64, 36, 5, 74, 7, 65, 24, 52, 50, 52, 31, 40, 5, 66, 87, 3, 26, 80, 92, 48, 8, 85, 32, 62, 20, 32, 54, 29, 28, 95, 20, 44, 82, 24, 69, 88, 40, 44, 39, 89, 95, 21, 81, 99, 87, 19, 53, 64, 99, 96, 11, 6, 80, 43, 67, 99, 26, 73, 79, 54, 67, 98, 49, 48, 73, 17, 87, 13, 60, 78, 1, 54, 98, 33, 4, 36, 52, 8, 99, 50, 55, 62, 7, 35, 4, 26, 85, 29, 98, 64, 34, 16, 61, 82, 15, 86, 98, 1, 98, 9, 30, 50, 14, 80, 35, 17, 15, 86, 76, 66, 87, 31, 27, 93, 17, 30, 70, 53, 10, 67, 16, 96, 34, 29, 77, 48, 14, 27, 1, 63, 87, 30, 64, 1, 9, 98, 17, 76, 83, 45, 41, 21, 27, 19, 66, 95, 100, 35, 47, 9, 54, 63, 4, 87, 43, 33, 35, 8, 11, 35, 70, 97, 16, 85, 97, 25, 83, 66, 52, 17, 62, 44, 38, 88, 62, 3, 82, 61, 89, 80, 21, 42, 94, 25, 29, 36, 9, 63, 43, 71, 97, 64, 67, 12, 1, 16, 88, 35, 33, 91, 51, 94, 34, 40, 81, 95, 94, 14, 55, 83, 45, 76, 24, 39, 52, 52, 74, 12, 66, 69, 82, 14, 84, 100, 78, 36, 15, 65, 70, 47, 8, 73, 92, 41, 12, 24, 88, 58, 37, 94, 40, 82, 21, 15, 72, 72, 19, 97, 35, 84, 65, 68, 98, 1, 68, 75, 36, 34, 91, 58, 33, 50, 30, 24, 91, 93, 48, 30, 50, 36, 23, 41, 69, 44, 56, 40, 67, 26, 37, 54, 61, 53, 21, 58, 5, 88, 84, 41, 22, 27, 98, 6, 28, 79, 29, 70, 71, 28, 99, 21, 64, 22, 61, 84, 17, 68, 24, 83, 93, 12, 36, 54, 64, 9, 63, 69, 96, 99, 61, 69, 77, 10, 74, 4, 88, 55, 74, 58, 82, 24, 30, 97, 45, 43, 81, 13, 10, 56, 48, 55, 67, 35, 60, 82, 43, 74, 2, 39, 72, 14, 59, 100, 23, 85, 56, 62, 91, 81, 72, 24, 4, 1, 21, 1, 43, 53, 13, 5, 8, 60, 59, 26, 95, 18, 59, 37, 91, 61, 27, 15, 74, 38, 66, 49, 22, 21, 10, 64, 1, 33, 87, 5, 34, 59, 57, 28, 11, 69, 32, 70, 29, 42, 47, 75, 59, 6, 11, 2, 66, 90, 68, 91, 27, 33, 39, 100, 6, 1, 63, 58, 33, 49, 62, 18, 8, 70, 98, 70, 39, 29, 40, 19, 71, 86, 93, 81, 43, 55, 34, 8, 44, 1, 51, 22, 86, 89, 21, 91, 41, 35, 48, 26, 84, 62, 95, 43, 31, 92, 64, 21, 21, 55, 39, 43, 93, 31, 23, 35, 86, 9, 95, 81, 9, 45, 3, 46, 85, 23, 88, 26, 58, 36, 3, 93, 49, 97, 87, 31, 41, 50, 52, 13, 57, 90, 55, 49, 73, 29, 83, 58, 89, 77, 38, 98, 21, 40, 95, 6, 15, 83, 83, 24, 70, 37, 16, 18, 85, 54, 100, 25, 55, 51, 37, 11, 93, 43, 59, 65, 24, 42, 22, 12, 70, 11, 61, 91, 3, 56, 48, 17, 90, 82, 40, 59, 18, 7, 76, 2, 12, 75, 79, 66, 78, 67, 77, 70, 62, 35, 34, 37, 28, 7, 100, 98, 17, 61, 40, 71, 68, 87, 87, 9, 68, 78, 67, 37, 36, 94, 38, 47, 20, 68, 13, 97, 35, 41, 18, 96, 75, 51, 32, 3, 9, 31, 52, 26, 43, 91, 48, 62, 77, 35, 70, 96, 64, 36, 32, 52, 81, 21, 98, 1, 89, 62, 97, 75, 2, 15, 70, 29, 17, 53, 83, 26, 83, 34, 3, 78, 24, 50, 91, 52, 36, 61, 47, 100, 48, 30, 3, 29, 50, 100, 29, 90, 14, 77, 64, 67, 91, 85, 95, 60, 37, 77, 85, 72, 10, 39, 1, 85, 40, 91, 36, 76, 51, 82, 27, 51, 63, 29, 79, 65, 80, 59, 54, 45, 35, 70, 12, 78, 6, 58, 37, 43, 35, 73, 66, 96, 11, 66, 33, 50, 8, 68, 77, 59, 2, 3, 61, 64, 83, 39, 28, 15, 97, 34, 59, 31, 55, 70, 8, 60, 28, 96, 2, 14, 68, 19, 61, 30, 36, 93, 32, 44, 13, 8, 54, 14, 63, 14, 29, 97, 52, 57, 11, 100, 42, 70, 82, 96, 91, 90, 55, 70, 37, 9, 83, 5, 27, 96, 34, 15, 88, 65, 58, 52, 25, 11, 65, 39, 24, 94, 35, 27, 2, 46, 26, 95, 67, 7, 90, 57, 48, 96, 27, 85, 4, 61, 41, 83, 56, 74, 49, 96, 91, 6, 47, 67, 68, 64, 5, 91, 9, 91, 69, 62, 36, 94, 56, 2, 52, 45, 11, 52, 92, 89, 36, 48, 49, 76, 82, 57, 1, 30, 52, 43, 35, 50, 61, 2, 65, 65, 44, 73, 56, 12, 34, 43, 57, 41, 97, 60, 37, 59, 11, 29, 47, 98, 76, 95, 25, 57, 51, 26, 86, 54, 20, 72, 56, 81, 25, 20, 97, 68, 45, 4, 31, 30, 47, 87, 71, 95, 46, 59, 53, 9, 87, 99, 6, 14, 45, 31, 22, 48, 8, 59, 1, 79, 30, 8, 59, 54, 80, 8, 73, 76, 11, 3, 5, 9, 41, 27, 3, 87, 86, 7, 47, 24, 5, 52, 38, 2, 34, 11, 49, 93, 70, 1, 72, 51, 9, 82, 57, 88, 89, 29, 63, 52, 84, 19, 60, 24, 46, 15, 62, 83, 73, 8, 58, 30, 12, 95, 31, 45, 58, 79, 38, 27, 79, 61, 29, 87, 42, 85, 26, 83, 66, 40, 34, 49, 59, 45, 24, 56, 11, 86, 90, 84, 45, 47, 13, 56, 94, 43, 1, 51, 21, 90, 29, 51, 50, 57, 38, 43, 42, 15, 25, 59, 55, 10, 59, 65, 55, 82, 20, 17, 19, 61, 100, 64, 7, 64, 19, 100, 6, 71, 2, 78, 12, 30, 29, 13, 87, 18, 56, 80, 84, 80, 90, 38, 90, 48, 54, 96, 81, 25, 12, 100, 85, 12, 15, 44, 27, 85, 43, 33, 8, 97, 62, 19, 26, 42, 32, 64, 11, 87, 95, 95, 18, 36, 84, 59, 83, 38, 54, 16, 14, 18, 15, 99, 81, 81, 42, 7, 65, 36, 39, 24, 32, 53, 43, 10, 46, 26, 25, 57, 64, 72, 3, 81, 7, 86, 92, 90, 75, 45, 57, 89, 62, 71, 39, 42, 3, 80, 49, 19, 67, 39, 43, 51, 43, 85, 60, 89, 62, 36, 97, 25, 7, 99, 57, 14, 36, 48, 55, 63, 45, 11, 3, 58, 33, 41, 52, 87, 72, 100, 5, 90, 90, 47, 40, 85, 83, 51, 73, 44, 87, 69, 20, 93, 19, 77, 58, 54, 76, 64, 16, 20, 26, 70, 78, 10, 10, 81, 96, 33, 32, 1, 23, 21, 47, 14, 57, 30, 65, 29, 25, 51, 49, 45, 95, 19, 73, 5, 73, 48, 68, 40, 20, 94, 10, 49, 55, 71, 29, 51, 56, 60, 51, 30, 32, 49, 43, 89, 78, 7, 69, 55, 9, 70, 99, 4, 88, 71, 8, 12, 70, 27, 4, 41, 72, 65, 89, 27, 87, 17, 77, 42, 28, 79, 23, 60, 27, 66, 100, 5, 24, 68, 59, 33, 89, 9, 88, 77, 31, 95, 40, 52, 73, 43, 93, 45, 7, 81, 23, 94, 50, 99, 87, 29, 77, 10, 88, 3, 27, 39, 59, 50, 59, 69, 82, 47, 29, 21, 75, 59, 15, 15, 63, 40, 57, 55, 36, 16, 35, 58, 61, 36, 8, 47, 65, 84, 56, 4, 38, 34, 43, 49, 84, 1, 69, 17, 47, 50, 38, 22, 60, 4, 88, 22, 43, 44, 76, 78, 11, 63, 87, 71, 98, 94, 18, 62, 29, 25, 18, 67, 59, 60, 67, 94, 60, 87, 10, 58, 36, 47, 31, 96, 3, 18, 17, 97, 14, 93, 75, 24, 7, 61, 95, 4, 7, 64, 18, 35, 40, 35, 53, 50, 94, 19, 43, 5, 6, 5, 14, 93, 3, 45, 88, 5, 62, 57, 2, 27, 49, 28, 51, 55, 40, 97, 10, 46, 12, 27, 81, 3, 13, 33, 53, 58, 4, 47, 62, 61, 51, 28, 53, 54, 72, 41, 58, 85, 49, 11, 12, 49, 38, 14, 55, 78, 62, 64, 75, 25, 43, 55, 27, 55, 40, 79, 65, 43, 26, 78, 3, 28, 5, 55, 81, 76, 47, 91, 61, 95, 1, 24, 43, 91, 89, 97, 20, 50, 13, 94, 26, 55, 49, 52, 61, 88, 83, 25, 30, 60, 3, 84, 87, 7, 38, 68, 35, 37, 10, 47, 31, 10, 70, 26, 52, 58, 74, 71, 59, 86, 65, 84, 40, 65, 87, 53, 4, 69, 77, 33, 28, 31, 68, 67, 38, 5, 34, 72, 93, 95, 18, 76, 56, 39, 1, 8, 48, 74, 78, 58, 60, 94, 93, 51, 58, 79, 3, 61, 48, 32, 45, 27, 62, 12, 93, 99, 69, 78, 22, 61, 72, 91, 88, 80, 81, 88, 87, 80, 14, 64, 37, 25, 10, 29, 75, 67, 60, 30, 28, 59, 61, 72, 85, 74, 36, 30, 25, 4, 59, 46, 16, 83, 89, 4, 62, 69, 43, 48, 1, 56, 63, 37, 32, 72, 18, 59, 39, 77, 88, 18, 35, 100, 41, 71, 73, 28, 52, 97, 83, 11, 95, 99, 93, 83, 54, 54, 3, 48, 53, 55, 56, 15, 92, 87, 39, 61, 45, 29, 89, 84, 46, 23, 35, 38, 45, 8, 66, 97, 56, 48, 7, 50, 98, 51, 84, 3, 4, 39, 51, 56, 93, 6, 22, 36, 92, 12, 96, 89, 40, 84, 24, 37, 58, 59, 27, 3, 66, 92, 51, 21, 91, 9, 23, 89, 59, 58, 91, 62, 96, 41, 69, 41, 98, 42, 76, 42, 54, 24, 30, 45, 59, 53, 34, 17, 11, 60, 71, 28, 51, 73, 1, 41, 81, 75, 81, 39, 32, 72, 100, 80, 64, 20, 20, 62, 13, 47, 55, 18, 70, 84, 63, 29, 88, 96, 97, 51, 55, 67, 30, 57, 39, 30, 97, 19, 56, 30, 9, 88, 1, 8, 19, 16, 79, 38, 29, 91, 36, 83, 9, 6, 18, 23, 86, 58, 70, 82, 8, 24, 100, 37, 80, 90, 19, 28, 8, 74, 57, 16, 13, 9, 75, 31, 77, 5, 20, 57, 47, 56, 40, 7, 13, 9, 29, 98, 66, 98, 31, 73, 73, 30, 62, 4, 19, 32, 84, 78, 57, 92, 45, 70, 53, 71, 52, 29, 27, 24, 85, 73, 31, 76, 80, 95, 85, 60, 92, 50, 10, 74, 75, 82, 3, 36, 38, 73, 67, 21, 2, 75, 12, 46, 44, 16, 68, 48, 44, 94, 23, 81, 18, 5, 8, 97, 99, 92, 9, 90, 94, 18, 63, 68, 51, 17, 55, 88, 41, 73, 60, 42, 47, 24, 39, 43, 39, 6, 90, 83, 51, 64, 15, 68, 68, 22, 17, 66, 66, 25, 7, 59, 42, 21, 26, 92, 89, 80, 32, 29, 52, 91, 70, 98, 14, 60, 92, 53, 17, 33, 87, 67, 96, 1, 86, 15, 74, 2, 80, 39, 78, 38, 97, 19, 58, 74, 63, 46, 5, 94, 26, 8, 36, 47, 6, 50, 6, 49, 54, 74, 82, 40, 40, 77, 92, 78, 92, 65, 31, 23, 56, 9, 61, 52, 27, 70, 78, 41, 16, 82, 34, 93, 90, 70, 40, 47, 71, 97, 95, 24, 71, 76, 15, 62, 5, 6, 39, 96, 22, 70, 70, 77, 78, 30, 81, 56, 100, 58, 97, 67, 39, 82, 59, 80, 3, 50, 26, 25, 47, 73, 48, 17, 48, 62, 78, 52, 19, 17, 99, 41, 38, 69, 17, 67, 50, 97, 22, 49, 6, 70, 67, 97, 52, 78, 76, 6, 27, 54, 31, 73, 26, 30, 89, 73, 44, 19, 77, 62, 87, 27, 2, 24, 95, 71, 90, 97, 19, 63, 97, 25, 33, 64, 21, 36, 41, 48, 93, 19, 1, 23, 44, 26, 5, 84, 51, 48, 2, 79, 9, 88, 5, 63, 63, 52, 33, 52, 48, 3, 67, 44, 27, 51, 59, 99, 38, 51, 99, 30, 70, 99, 5, 13, 77, 9, 48, 79, 56, 50, 9, 64, 37, 65, 78, 52, 16, 10, 55, 15, 13, 21, 11, 91, 71, 69, 42, 8, 72, 40, 90, 41, 90, 94, 5, 18, 54, 52, 48, 9, 53, 56, 24, 42, 73, 2, 93, 40, 63, 47, 55, 27, 20, 17, 70, 90, 85, 11, 50, 56, 2, 91, 48, 43, 84, 4, 13, 89, 8, 12, 97, 12, 20, 72, 53, 92, 25, 97, 31, 88, 44, 37, 66, 63, 53, 35, 4, 90, 97, 5, 97, 98, 95, 97, 93, 30, 100, 57, 18, 59, 68, 66, 23, 87, 38, 75, 78, 62, 72, 9, 1, 67, 97, 67, 81, 50, 1, 36, 39, 98, 41, 35, 47, 87, 31, 91, 17, 83, 47, 86, 93, 15, 52, 15, 53, 41, 42, 31, 54, 65, 91, 55, 31, 87, 73, 63, 88, 73, 98, 26, 22, 90, 61, 21, 77, 43, 11, 93, 25, 10, 30, 70, 76, 81, 84, 28, 21, 25, 10, 75, 89, 100, 81, 71, 39, 53, 33, 26, 77, 83, 52, 99, 72, 64, 71, 48, 58, 33, 92, 35, 42, 22, 4, 17, 54, 39, 97, 27, 64, 6, 53, 4, 58, 33, 27, 96, 37, 59, 21, 13, 93, 24, 63, 65, 39, 33, 64, 49, 66, 8, 83, 59, 29, 38, 28, 34, 76, 24, 60, 91, 29, 12, 47, 86, 96, 73, 33, 32, 83, 6, 97, 76, 29, 59, 40, 20, 44, 55, 68, 61, 62, 2, 71, 42, 39, 98, 76, 14, 21, 87, 57, 2, 99, 3, 39, 46, 75, 24, 30, 57, 29, 26, 32, 9, 36, 23, 80, 31, 78, 47, 91, 91, 48, 14, 33, 38, 11, 8, 52, 84, 94, 8, 37, 44, 10, 27, 90, 36, 50, 19, 92, 78, 96, 24, 39, 31, 98, 18, 14, 75, 17, 56, 66, 16, 69, 50, 54, 80, 57, 57, 15, 2, 16, 51, 98, 77, 77, 39, 12, 27, 9, 3, 56, 4, 78, 94, 86, 76, 12, 99, 2, 28, 7, 19, 43, 75, 68, 48, 54, 24, 4, 68, 78, 19, 70, 27, 95, 47, 65, 6, 25, 73, 61, 80, 28, 38, 26, 65, 65, 37, 16, 67, 16, 22, 85, 10, 96, 53, 58, 2, 28, 61, 21, 57, 32, 91, 83, 26, 89, 47, 84, 13, 71, 44, 92, 50, 33, 17, 67, 98, 5, 82, 64, 72, 55, 100, 82, 2, 52, 91, 3, 32, 3, 76, 88, 34, 66, 71, 12, 6, 69, 47, 18, 92, 90, 61, 93, 74, 30, 59, 71, 34, 92, 86, 58, 98, 38, 91, 100, 89, 81, 54, 72, 35, 29, 60, 21, 46, 82, 84, 51, 2, 30, 20, 93, 71, 81, 38, 44, 10, 48, 67, 95, 40, 4, 4, 89, 41, 94, 88, 82, 26, 42, 53, 13, 22, 64, 33, 68, 45, 16, 70, 47, 45, 90, 91, 15, 22, 28, 10, 31, 76, 76, 77, 67, 32, 81, 55, 72, 26, 43, 5, 4, 36, 58, 16, 57, 73, 48, 76, 18, 15, 46, 64, 59, 87, 54, 25, 8, 82, 34, 90, 9, 62, 18, 75, 93, 50, 29, 16, 76, 23, 73, 31, 58, 82, 46, 67, 54, 93, 42, 71, 59, 39, 86, 17, 25, 40, 93, 84, 73, 78, 73, 33, 39, 43, 7, 83, 92, 87, 51, 19, 10, 23, 49, 19, 56, 46, 85, 9, 90, 79, 80, 48, 17, 65, 16, 94, 56, 8, 77, 80, 86, 2, 12, 76, 96, 70, 11, 87, 57, 13, 58, 18, 87, 58, 36, 42, 4, 73, 50, 93, 51, 81, 41, 19, 98, 56, 12, 5, 16, 41, 85, 1, 94, 48, 28, 89, 18, 38, 75, 74, 2, 84, 91, 88, 42, 78, 29, 97, 2, 31, 89, 4, 11, 81, 23, 60, 37, 86, 65, 4, 78, 1, 56, 71, 48, 83, 59, 65, 73, 86, 38, 74, 69, 80, 62, 62, 10, 90, 58, 11, 20, 47, 67, 83, 79, 89, 42, 67, 26, 58, 70, 4, 58, 25, 26, 6, 8, 85, 70, 32, 70, 60, 5, 90, 91, 66, 52, 52, 8, 9, 63, 79, 7, 29, 61, 86, 69, 55, 52, 46, 12, 22, 1, 70, 46, 27, 27, 5, 63, 96, 36, 32, 7, 41, 21, 50, 58, 24, 1, 17, 33, 15, 96, 91, 43, 8, 76, 63, 14, 80, 61, 78, 1, 61, 47, 98, 39, 25, 55, 1, 72, 90, 32, 79, 82, 5, 80, 92, 28, 80, 8, 12, 95, 55, 3, 89, 15, 30, 4, 80, 9, 64, 57, 61, 76, 55, 11, 15, 79, 65, 15, 51, 54, 99, 81, 88, 55, 60, 79, 34, 39, 38, 46, 85, 45, 100, 74, 59, 29, 29, 38, 90, 92, 47, 50, 19, 1, 60, 33, 80, 24, 100, 30, 30, 98, 10, 17, 4, 21, 47, 37, 59, 84, 34, 96, 28, 33, 21, 38, 14, 49, 28, 3, 92, 74, 4, 10, 26, 64, 43, 5, 39, 94, 86, 20, 43, 47, 88, 46, 67, 34, 82, 78, 70, 16, 73, 49, 100, 93, 39, 13, 41, 66, 15, 32, 91, 71, 93, 16, 34, 87, 73, 24, 80, 58, 96, 22, 5, 83, 19, 23, 69, 53, 100, 90, 20, 72, 90, 19, 16, 28, 84, 56, 45, 50, 39, 35, 20, 84, 3, 5, 70, 75, 29, 50, 84, 24, 23, 40, 58, 94, 63, 26, 46, 14, 67, 65, 38, 57, 35, 53, 84, 18, 61, 81, 68, 51, 67, 87, 34, 69, 92, 4, 95, 72, 5, 79, 47, 79, 18, 56, 72, 80, 34, 69, 94, 100, 85, 83, 56, 20, 35, 92, 89, 95, 72, 8, 98, 90, 95, 31, 59, 38, 86, 5, 61, 90, 83, 59, 21, 1, 14, 92, 32, 47, 13, 77, 47, 97, 59, 54, 68, 46, 45, 57, 92, 68, 64, 89, 10, 10, 20, 20, 99, 57, 24, 59, 99, 7, 17, 19, 59, 83, 62, 42, 29, 74, 19, 27, 71, 29, 81, 38, 74, 77, 46, 66, 97, 10, 54, 6, 71, 25, 25, 70, 34, 48, 28, 32, 6, 97, 50, 64, 79, 11, 58, 59, 37, 76, 86, 59, 4, 66, 48, 30, 42, 94, 95, 38, 55, 100, 95, 25, 77, 19, 46, 10, 19, 26, 93, 24, 22, 42, 40, 52, 4, 97, 10, 92, 24, 95, 50, 79, 12, 98, 60, 54, 91, 54, 43, 97, 6, 90, 73, 34, 8, 19, 95, 78, 44, 87, 54, 17, 80, 93, 68, 83, 41, 29, 75, 16, 24, 76, 46, 35, 73, 6, 40, 15, 11, 35, 11, 16, 24, 36, 1, 83, 54, 95, 61, 97, 33, 14, 13, 12, 58, 32, 95, 50, 60, 21, 17, 35, 96, 62, 22, 21, 67, 13, 87, 78, 47, 50, 45, 22, 85, 46, 57, 38, 92, 17, 86, 25, 82, 50, 88, 91, 81, 82, 92, 92, 54, 8, 27, 2, 69, 48, 74, 88, 12, 60, 65, 11, 9, 61, 32, 45, 58, 88, 34, 50, 56, 19, 26, 89, 68, 13, 79, 100, 47, 70, 92, 52, 29, 70, 5, 98, 69, 78, 85, 80, 90, 1, 90, 50, 61, 74, 95, 19, 13, 28, 20, 21, 47, 97, 9, 66, 61, 40, 18, 7, 61, 9, 11, 90, 30, 15, 39, 98, 93, 75, 29, 82, 75, 19, 31, 87, 44, 77, 57, 56, 5, 28, 28, 3, 76, 37, 20, 37, 28, 37, 95, 88, 45, 5, 77, 74, 20, 67, 23, 64, 41, 52, 97, 67, 22, 79, 6, 65, 56, 62, 72, 12, 42, 100, 14, 17, 88, 33, 5, 15, 22, 100, 2, 66, 56, 31, 92, 27, 97, 66, 90, 38, 17, 38, 4, 90, 17, 9, 6, 24, 23, 78, 87, 16, 29, 52, 84, 16, 84, 89, 30, 57, 40, 83, 23, 95, 13, 66, 22, 10, 83, 63, 47, 52, 1, 2, 41, 69, 63, 47, 44, 37, 76, 30, 4, 4, 81, 87, 19, 16, 27, 100, 73, 66, 82, 47, 61, 95, 64, 82, 56, 46, 44, 54, 97, 96, 55, 90, 64, 69, 36, 59, 57, 11, 88, 60, 66, 68, 47, 84, 84, 73, 35, 8, 39, 16, 54, 51, 10, 17, 84, 65, 62, 79, 70, 11, 75, 25, 100, 90, 45, 35, 49, 2, 97, 36, 61, 62, 56, 59, 97, 91, 32, 31, 98, 22, 98, 51, 24, 60, 19, 7, 76, 32, 85, 46, 42, 11, 70, 41, 1, 66, 27, 1, 67, 75, 36, 28, 88, 43, 38, 84, 33, 69, 66, 30, 42, 64, 32, 65, 23, 50, 71, 50, 82, 8, 95, 23, 18, 16, 16, 18, 82, 94, 18, 48, 69, 6, 27, 56, 48, 65, 92, 33, 85, 57, 62, 79, 72, 46, 43, 46, 95, 66, 96, 28, 73, 90, 3, 90, 6, 18, 60, 87, 11, 29, 86, 31, 86, 65, 87, 86, 81, 78, 18, 65, 86, 31, 43, 10, 76, 38, 55, 23, 3, 2, 50, 27, 92, 52, 68, 49, 21, 27, 87, 84, 8, 72, 14, 93, 88, 52, 30, 68, 81, 47, 33, 67, 78, 27, 28, 5, 64, 82, 27, 18, 36, 29, 44, 79, 32, 12, 27, 5, 90, 13, 88, 97, 36, 53, 42, 76, 5, 71, 43, 85, 18, 75, 3, 47, 54, 30, 51, 17, 64, 30, 87, 99, 58, 30, 77, 89, 41, 55, 93, 31, 19, 32, 79, 6, 85, 20, 81, 41, 43, 24, 77, 60, 50, 32, 58, 3, 61, 60, 72, 76, 89, 58, 74, 46, 39, 2, 87, 32, 56, 31, 14, 74, 63, 92, 80, 99, 64, 60, 91, 6, 83, 67, 17, 85, 98, 74, 87, 11, 85, 10, 86, 74, 19, 12, 71, 58, 13, 9, 89, 69, 40, 2, 94, 54, 45, 25, 52, 60, 85, 94, 65, 19, 60, 33, 3, 10, 58, 42, 20, 43, 3, 57, 16, 22, 68, 38, 31, 33, 47, 19, 53, 86, 72, 46, 91, 68, 71, 42, 28, 7, 87, 44, 77, 46, 77, 80, 7, 86, 73, 78, 28, 75, 87, 95, 48, 54, 33, 78, 38, 31, 48, 90, 16, 71, 88, 6, 39, 10, 99, 18, 16, 85, 13, 92, 82, 41, 23, 41, 27, 47, 18, 6, 22, 56, 1, 69, 10, 85, 99, 99, 15, 46, 89, 82, 17, 28, 39, 7, 37, 89, 76, 4, 25, 88, 47, 58, 29, 70, 98, 55, 68, 68, 12, 89, 23, 12, 10, 84, 48, 8, 83, 14, 5, 23, 95, 21, 2, 85, 79, 38, 73, 54, 93, 97, 42, 39, 55, 22, 60, 52, 28, 28, 71, 39, 68, 94, 3, 29, 29, 50, 36, 11, 16, 93, 85, 10, 65, 86, 47, 44, 75, 19, 49, 67, 16, 42, 58, 22, 63, 69, 25, 42, 96, 96, 81, 16, 41, 83, 44, 69, 84, 32, 32, 99, 24, 68, 61, 40, 54, 7, 83, 28, 25, 32, 47, 92, 25, 4, 65, 88, 24, 90, 29, 72, 37, 61, 87, 77, 43, 82, 97, 79, 65, 80, 77, 40, 48, 37, 80, 53, 95, 62, 32, 20, 45, 78, 63, 70, 33, 28, 9, 57, 69, 89, 28, 5, 50, 66, 33, 44, 47, 81, 74, 12, 61, 51, 51, 60, 39, 30, 12, 34, 44, 95, 5, 40, 25, 19, 61, 57, 98, 69, 65, 66, 10, 44, 70, 59, 61, 2, 54, 60, 35, 28, 23, 47, 30, 25, 6, 20, 55, 69, 5, 50, 63, 61, 41, 87, 80, 2, 96, 77, 70, 12, 43, 31, 8, 64, 41, 68, 18, 95, 79, 52, 74, 1, 98, 3, 26, 3, 74, 32, 23, 79, 81, 37, 39, 21, 24, 18, 22, 71, 47, 44, 34, 41, 26, 41, 4, 67, 61, 21, 13, 39, 24, 86, 40, 21, 40, 17, 75, 13, 48, 97, 91, 28, 86, 82, 100, 61, 51, 74, 31, 97, 69, 16, 37, 94, 57, 93, 12, 69, 65, 24, 59, 89, 9, 50, 9, 100, 66, 36, 65, 13, 84, 55, 92, 69, 88, 44, 29, 39, 17, 11, 35, 37, 27, 24, 82, 35, 16, 94, 3, 80, 17, 61, 68, 78, 63, 29, 77, 28, 64, 41, 41, 99, 48, 32, 68, 35, 75, 96, 25, 43, 59, 60, 31, 85, 35, 13, 19, 50, 58, 73, 81, 74, 85, 1, 3, 47, 81, 32, 75, 96, 24, 67, 94, 23, 98, 61, 58, 25, 9, 82, 19, 67, 93, 50, 3, 27, 14, 73, 28, 71, 45, 61, 96, 29, 61, 51, 28, 41, 82, 54, 88, 5, 20, 81, 28, 69, 94, 37, 45, 54, 70, 64, 72, 15, 65, 74, 93, 30, 46, 21, 52, 42, 81, 99, 22, 93, 49, 49, 85, 30, 2, 72, 87, 73, 4, 66, 42, 97, 54, 86, 50, 75, 1, 73, 89, 65, 46, 82, 94, 43, 54, 97, 84, 86, 96, 58, 78, 44, 6, 62, 26, 60, 85, 64, 32, 88, 29, 25, 37, 34, 11, 38, 8, 11, 11, 97, 28, 8, 30, 73, 3, 35, 70, 38, 20, 65, 95, 49, 8, 53, 62, 33, 12, 46, 96, 95, 85, 76, 20, 21, 9, 30, 59, 69, 92, 21, 65, 19, 28, 46, 92, 30, 80, 13, 68, 51, 77, 62, 99, 84, 66, 60, 69, 77, 5, 16, 24, 41, 44, 43, 62, 4, 24, 20, 72, 67, 40, 88, 86, 19, 33, 29, 49, 64, 41, 68, 14, 69, 81, 64, 4, 47, 23, 72, 75, 79, 40, 98, 20, 83, 40, 33, 38, 15, 52, 10, 82, 43, 97, 19, 13, 82, 99, 13, 45, 91, 80, 11, 59, 13, 26, 14, 11, 49, 86, 85, 79, 77, 83, 50, 11, 74, 82, 48, 41, 85, 57, 74, 79, 54, 92, 92, 87, 42, 4, 83, 32, 36, 45, 42, 48, 71, 55, 58, 71, 92, 94, 49, 20, 76, 99, 30, 2, 80, 78, 94, 17, 86, 67, 95, 91, 58, 86, 77, 51, 90, 60, 34, 77, 4, 27, 24, 74, 33, 33, 44, 25, 26, 45, 44, 54, 95, 26, 7, 26, 55, 100, 42, 40, 66, 37, 31, 75, 22, 59, 25, 63, 70, 10, 39, 74, 36, 14, 99, 68, 46, 95, 44, 24, 91, 88, 29, 85, 65, 35, 10, 19, 86, 52, 58, 3, 88, 40, 77, 61, 99, 53, 24, 20, 62, 62, 93, 49, 76, 44, 16, 73, 90, 60, 48, 80, 99, 76, 16, 63, 62, 25, 33, 47, 28, 90, 49, 67, 82, 77, 28, 32, 81, 51, 51, 94, 64, 96, 42, 91, 91, 10, 16, 80, 69, 63, 11, 19, 91, 26, 81, 52, 2, 13, 99, 82, 54, 99, 48, 87, 28, 75, 18, 8, 77, 21, 2, 93, 16, 95, 83, 6, 4, 50, 37, 24, 13, 99, 42, 3, 76, 74, 6, 29, 38, 4, 10, 92, 55, 58, 78, 82, 84, 48, 41, 61, 68, 94, 53, 35, 41, 87, 92, 44, 37, 28, 68, 1, 26, 61, 55, 53, 35, 60, 81, 72, 16, 91, 15, 22, 100, 45, 55, 83, 92, 95, 43, 11, 41, 47, 45, 81, 86, 36, 76, 74, 15, 43, 74, 92, 56, 28, 44, 90, 39, 24, 61, 54, 66, 28, 27, 65, 72, 81, 48, 63, 76, 42, 73, 68, 41, 69, 48, 26, 4, 23, 99, 70, 18, 24, 61, 73, 3, 56, 14, 41, 79, 26, 47, 97, 53, 73, 61, 24, 54, 8, 38, 81, 2, 62, 48, 42, 30, 47, 67, 85, 21, 17, 54, 90, 40, 66, 14, 42, 21, 27, 82, 52, 5, 80, 48, 57, 53, 8, 33, 58, 68, 70, 90, 69, 32, 37, 10, 61, 35, 28, 98, 55, 44, 51, 45, 83, 69, 58, 24, 89, 37, 57, 92, 41, 37, 39, 97, 41, 99, 29, 98, 66, 51, 39, 34, 82, 27, 95, 94, 61, 22, 91, 67, 65, 94, 11, 99, 62, 21, 22, 2, 9, 30, 94, 49, 66, 32, 97, 58, 30, 78, 7, 47, 28, 45, 32, 61, 71, 26, 54, 31, 99, 45, 50, 15, 90, 12, 13, 51, 32, 86, 4, 40, 16, 97, 40, 33, 81, 37, 43, 62, 14, 49, 9, 93, 94, 92, 53, 16, 18, 6, 99, 68, 2, 48, 35, 91, 59, 47, 93, 43, 85, 97, 34, 52, 45, 74, 36, 25, 10, 78, 87, 75, 27, 47, 67, 72, 90, 19, 87, 59, 24, 37, 27, 78, 84, 61, 68, 95, 59, 13, 37, 43, 9, 70, 46, 53, 43, 82, 30, 4, 59, 68, 78, 37, 66, 96, 8, 55, 14, 47, 14, 90, 83, 40, 67, 19, 52, 86, 13, 10, 50, 1, 5, 58, 70, 50, 63, 65, 31, 92, 20, 42, 11, 50, 78, 76, 45, 38, 30, 11, 36, 43, 100, 70, 34, 18, 88, 85, 55, 52, 47, 5, 52, 51, 14, 74, 52, 76, 38, 35, 19, 57, 76, 29, 6, 5, 4, 3, 42, 86, 13, 77, 28, 12, 99, 14, 81, 86, 98, 87, 90, 96, 91, 41, 46, 57, 14, 98, 84, 3, 32, 3, 60, 59, 83, 17, 63, 39, 19, 5, 24, 31, 33, 3, 94, 83, 16, 26, 69, 66, 65, 58, 61, 7, 50, 7, 63, 16, 56, 47, 18, 39, 1, 77, 97, 83, 46, 11, 21, 16, 67, 44, 99, 52, 47, 44, 34, 62, 22, 2, 79, 86, 11, 40, 92, 13, 98, 55, 28, 53, 1, 45, 43, 1, 74, 91, 35, 71, 1, 56, 86, 68, 51, 84, 19, 97, 80, 52, 11, 1, 6, 89, 86, 68, 80, 77, 80, 77, 83, 59, 29, 35, 4, 23, 87, 29, 13, 22, 99, 14, 77, 36, 81, 79, 72, 99, 76, 51, 2, 38, 51, 7, 78, 88, 27, 58, 16, 6, 34, 99, 17, 15, 33, 20, 37, 20, 100, 50, 93, 50, 63, 21, 85, 95, 99, 56, 45, 26, 58, 46, 63, 8, 5, 93, 47, 31, 50, 63, 88, 35, 61, 4, 49, 45, 75, 38, 16, 74, 39, 8, 23, 53, 28, 60, 47, 27, 15, 43, 52, 25, 88, 67, 84, 44, 59, 31, 74, 60, 93, 14, 94, 5, 17, 95, 49, 92, 32, 17, 17, 70, 24, 92, 74, 4, 51, 20, 82, 17, 14, 85, 41, 1, 51, 25, 97, 61, 55, 22, 20, 99, 35, 66, 3, 52, 60, 3, 95, 43, 19, 11, 64, 95, 54, 37, 98, 4, 8, 79, 21, 21, 63, 13, 73, 66, 37, 69, 26, 43, 43, 98, 41, 77, 63, 95, 80, 74, 98, 26, 68, 68, 89, 31, 62, 42, 19, 11, 46, 26, 41, 18, 98, 4, 30, 70, 21, 67, 91, 98, 9, 33, 47, 2, 61, 61, 96, 41, 34, 45, 18, 1, 13, 6, 83, 26, 48, 1, 37, 45, 78, 77, 62, 75, 32, 91, 45, 4, 9, 87, 2, 70, 19, 100, 71, 79, 61, 66, 71, 46, 11, 89, 47, 23, 46, 81, 100, 93, 82, 88, 89, 11, 17, 50, 86, 48, 93, 82, 4, 53, 68, 57, 22, 38, 56, 92, 16, 16, 58, 39, 62, 68, 79, 60, 42, 24, 40, 93, 69, 73, 81, 57, 36, 97, 59, 21, 96, 3, 2, 99, 55, 21, 55, 77, 58, 63, 68, 73, 78, 77, 63, 91, 96, 41, 2, 89, 17, 94, 82, 85, 66, 62, 93, 1, 58, 3, 73, 5, 5, 26, 4, 60, 46, 10, 88, 3, 72, 55, 28, 2, 84, 42, 44, 79, 83, 46, 68, 51, 39, 49, 35, 56, 62, 79, 9, 71, 82, 81, 75, 38, 7, 30, 97, 4, 40, 36, 59, 63, 91, 86, 16, 26, 27, 60, 4, 61, 5, 23, 11, 43, 71, 97, 98, 84, 28, 6, 54, 9, 39, 29, 46, 97, 10, 95, 100, 49, 30, 58, 64, 72, 95, 79, 97, 74, 90, 53, 34, 94, 75, 97, 88, 98, 45, 38, 81, 72, 95, 35, 80, 33, 15, 78, 29, 24, 24, 81, 25, 5, 90, 88, 77, 85, 18, 25, 58, 8, 77, 43, 53, 4, 91, 41, 1, 36, 78, 81, 7, 72, 67, 39, 57, 81, 68, 37, 57, 91, 69, 81, 95, 59, 20, 23, 95, 89, 48, 4, 96, 76, 98, 1, 79, 89, 93, 31, 24, 70, 64, 82, 93, 30, 20, 1, 11, 87, 90, 67, 29, 58, 99, 24, 16, 18, 98, 62, 6, 97, 65, 54, 73, 63, 6, 3, 51, 98, 86, 26, 19, 49, 7, 63, 78, 79, 64, 40, 17, 53, 58, 46, 62, 56, 21, 78, 25, 18, 91, 83, 15, 56, 88, 39, 18, 93, 93, 20, 42, 78, 97, 60, 26, 3, 74, 56, 33, 37, 95, 50, 41, 5, 95, 3, 60, 15, 32, 37, 84, 22, 71, 98, 29, 58, 88, 98, 2, 81, 69, 95, 58, 65, 54, 36, 20, 27, 91, 52, 16, 37, 53, 8, 41, 47, 62, 53, 13, 45, 89, 97, 19, 11, 46, 47, 20, 34, 97, 21, 66, 65, 67, 23, 30, 20, 10, 49, 98, 52, 52, 65, 89, 5, 73, 29, 3, 86, 33, 16, 31, 73, 64, 49, 83, 61, 47, 2, 46, 43, 74, 11, 8, 40, 86, 37, 11, 95, 37, 61, 47, 40, 25, 87, 44, 49, 67, 99, 35, 100, 14, 17, 72, 29, 65, 7, 89, 11, 8, 35, 6, 34, 45, 13, 73, 82, 1, 36, 77, 89, 96, 75, 28, 72, 61, 24, 21, 27, 74, 7, 26, 87, 23, 50, 67, 39, 56, 7, 1, 15, 93, 6, 48, 90, 70, 73, 71, 22, 8, 47, 10, 55, 21, 90, 26, 33, 65, 98, 60, 38, 56, 85, 76, 30, 34, 94, 68, 41, 100, 21, 56, 93, 26, 3, 34, 48, 27, 4, 69, 34, 3, 31, 40, 75, 20, 18, 8, 36, 15, 67, 73, 23, 3, 100, 52, 89, 93, 72, 29, 92, 92, 36, 36, 69, 39, 69, 16, 65, 73, 37, 51, 27, 67, 42, 1, 38, 59, 8, 73, 26, 26, 45, 48, 29, 44, 51, 17, 36, 22, 97, 79, 13, 33, 15, 82, 23, 35, 49, 39, 59, 85, 41, 85, 3, 83, 86, 40, 93, 45, 12, 18, 71, 8, 17, 99, 3, 68, 67, 90, 41, 15, 69, 54, 47, 35, 87, 21, 69, 87, 60, 28, 24, 52, 64, 26, 34, 49, 66, 27, 94, 77, 96, 64, 85, 65, 14, 39, 32, 80, 29, 72, 46, 97, 77, 45, 31, 15, 65, 51, 54, 76, 30, 77, 28, 94, 54, 13, 94, 19, 91, 87, 48, 87, 2, 84, 51, 15, 22, 34, 46, 50, 57, 44, 46, 86, 88, 28, 52, 52, 31, 5, 80, 12, 33, 59, 5, 87, 71, 51, 5, 62, 37, 4, 100, 91, 87, 2, 57, 9, 87, 55, 10, 95, 98, 8, 80, 85, 87, 84, 88, 17, 40, 19, 29, 73, 77, 85, 59, 48, 35, 15, 61, 24, 71, 12, 66, 57, 65, 22, 17, 3, 28, 27, 97, 77, 86, 29, 13, 72, 12, 1, 41, 3, 71, 21, 75, 48, 5, 85, 47, 92, 52, 7, 67, 22, 70, 32, 30, 34, 5, 47, 36, 33, 25, 84, 9, 10, 12, 22, 33, 75, 74, 73, 78, 44, 93, 4, 43, 98, 89, 89, 41, 92, 95, 7, 13, 16, 90, 42, 49, 94, 40, 36, 78, 16, 20, 87, 77, 83, 60, 10, 58, 85, 82, 87, 28, 27, 90, 23, 76, 78, 11, 16, 69, 58, 74, 33, 73, 63, 27, 74, 8, 18, 9, 86, 34, 80, 24, 62, 15, 83, 71, 72, 67, 5, 10, 46, 31, 99, 68, 6, 29, 79, 73, 49, 88, 46, 82, 60, 60, 60, 85, 67, 77, 46, 52, 10, 25, 75, 72, 39, 57, 94, 62, 75, 50, 71, 73, 80, 22, 92, 37, 50, 22, 9, 98, 9, 6, 31, 69, 65, 90, 53, 32, 67, 98, 83, 28, 75, 10, 51, 65, 18, 97, 79, 93, 46, 1, 17, 26, 22, 8, 14, 23, 30, 75, 21, 38, 80, 3, 58, 97, 93, 63, 28, 59, 60, 62, 38, 86, 71, 89, 3, 41, 85, 81, 33, 30, 81, 1, 7, 55, 8, 73, 77, 37, 47, 49, 75, 78, 52, 32, 74, 96, 94, 1, 6, 6, 15, 43, 43, 37, 83, 45, 77, 19, 25, 61, 1, 58, 61, 7, 12, 69, 31, 40, 57, 77, 89, 31, 55, 92, 15, 28, 39, 60, 81, 44, 17, 47, 86, 60, 83, 21, 4, 12, 39, 81, 72, 39, 90, 85, 98, 1, 5, 28, 92, 61, 5, 32, 92, 11, 75, 58, 90, 13, 17, 70, 56, 86, 16, 94, 45, 51, 14, 100, 62, 4, 32, 33, 43, 21, 69, 92, 73, 73, 19, 17, 34, 75, 48, 77, 37, 23, 34, 27, 35, 2, 96, 43, 87, 64, 88, 83, 14, 1, 35, 75, 56, 18, 59, 50, 39, 28, 41, 63, 52, 60, 79, 85, 86, 79, 61, 23, 1, 46, 49, 87, 48, 96, 81, 86, 59, 68, 21, 24, 20, 7, 98, 76, 24, 9, 25, 14, 88, 66, 77, 39, 77, 7, 24, 14, 85, 36, 36, 37, 82, 36, 76, 81, 32, 56, 18, 42, 24, 38, 66, 95, 96, 63, 70, 20, 23, 47, 33, 10, 64, 61, 49, 40, 68, 24, 53, 4, 59, 41, 41, 40, 76, 68, 20, 7, 23, 38, 49, 98, 27, 66, 45, 23, 28, 14, 94, 3, 12, 26, 12, 75, 39, 12, 14, 58, 35, 19, 13, 94, 11, 5, 85, 86, 72, 57, 45, 47, 94, 45, 44, 72, 10, 40, 46, 89, 54, 39, 91, 65, 17, 55, 92, 55, 66, 5, 64, 1, 75, 76, 46, 85, 81, 30, 23, 52, 86, 67, 98, 31, 63, 94, 55, 72, 33, 100, 12, 38, 39, 3, 55, 7, 9, 46, 13, 74, 2, 76, 26, 29, 3, 71, 65, 83, 1, 87, 87, 38, 5, 36, 69, 67, 81, 23, 90, 66, 74, 2, 55, 64, 56, 9, 70, 64, 6, 82, 89, 60, 9, 15, 40, 64, 85, 4, 46, 37, 91, 84, 75, 47, 72, 95, 14, 52, 69, 55, 69, 94, 56, 24, 58, 63, 84, 79, 78, 42, 13, 67, 1, 21, 81, 40, 84, 17, 95, 82, 6, 85, 17, 80, 32, 88, 26, 97, 92, 46, 51, 60, 39, 59, 83, 96, 73, 67, 75, 51, 8, 87, 69, 60, 59, 1, 51, 95, 17, 45, 28, 74, 82, 44, 53, 65, 32, 30, 13, 23, 75, 63, 82, 14, 73, 17, 9, 46, 35, 35, 48, 94, 73, 16, 53, 32, 16, 55, 78, 84, 99, 5, 58, 32, 48, 62, 96, 31, 92, 60, 5, 18, 23, 39, 31, 47, 55, 92, 44, 41, 78, 91, 34, 51, 6, 38, 34, 73, 92, 11, 9, 42, 67, 18, 26, 66, 31, 73, 97, 74, 33, 1, 92, 7, 91, 74, 53, 97, 65, 97, 37, 95, 87, 70, 45, 45, 7, 30, 69, 50, 40, 29, 44, 6, 46, 69, 71, 29, 93, 19, 2, 25, 72, 93, 31, 62, 19, 84, 59, 35, 32, 95, 29, 18, 17, 73, 14, 75, 54, 35, 77, 93, 63, 72, 50, 61, 92, 73, 89, 84, 43, 90, 9, 14, 35, 39, 28, 5, 74, 38, 39, 5, 84, 68, 75, 52, 92, 40, 27, 46, 74, 55, 90, 37, 26, 92, 97, 17, 64, 37, 100, 58, 78, 8, 24, 12, 99, 51, 16, 72, 40, 7, 29, 23, 74, 55, 27, 17, 94, 53, 62, 68, 7, 4, 4, 32, 95, 52, 48, 10, 40, 99, 67, 17, 7, 90, 81, 57, 92, 48, 80, 83, 54, 8, 58, 79, 62, 84, 96, 56, 88, 9, 75, 94, 12, 30, 77, 6, 81, 76, 67, 72, 74, 34, 88, 32, 75, 20, 88, 19, 68, 68, 53, 73, 75, 10, 52, 89, 93, 99, 96, 80, 7, 70, 25, 19, 99, 53, 76, 31, 28, 43, 2, 2, 28, 41, 85, 54, 61, 73, 24, 80, 40, 77, 52, 66, 86, 55, 6, 31, 53, 1, 62, 60, 70, 39, 30, 68, 91, 57, 50, 19, 51, 51, 72, 78, 92, 56, 84, 4, 80, 7, 83, 71, 83, 34, 89, 21, 89, 94, 3, 93, 47, 64, 52, 68, 2, 33, 36, 45, 90, 37, 63, 40, 88, 86, 70, 31, 93, 53, 34, 73, 11, 16, 95, 46, 1, 83, 18, 41, 29, 20, 34, 75, 35, 37, 42, 89, 70, 29, 33, 11, 66, 47, 2, 5, 32, 71, 35, 76, 75, 20, 48, 86, 35, 95, 83, 87, 77, 100, 28, 5, 19, 13, 31, 5, 1, 73, 93, 70, 53, 77, 32, 18, 23, 34, 22, 6, 56, 8, 82, 31, 27, 81, 68, 13, 75, 50, 100, 52, 1, 79, 8, 19, 43, 39, 75, 43, 63, 68, 65, 15, 44, 96, 85, 67, 81, 58, 24, 37, 66, 5, 19, 44, 86, 86, 57, 12, 87, 8, 15, 87, 38, 23, 57, 80, 13, 31, 22, 75, 50, 38, 41, 94, 86, 25, 12, 66, 83, 87, 54, 100, 92, 72, 43, 29, 9, 99, 40, 47, 58, 55, 85, 95, 29, 93, 74, 41, 24, 48, 67, 25, 37, 7, 18, 22, 32, 81, 40, 66, 68, 93, 65, 11, 17, 7, 91, 77, 58, 30, 76, 67, 36, 60, 62, 16, 53, 87, 56, 28, 86, 74, 52, 23, 81, 22, 44, 64, 54, 35, 29, 73, 80, 93, 35, 96, 51, 25, 24, 60, 7, 99, 27, 42, 11, 88, 58, 15, 26, 65, 42, 12, 39, 45, 34, 19, 66, 29, 34, 72, 64, 62, 44, 95, 6, 79, 90, 8, 3, 65, 68, 61, 16, 46, 3, 78, 85, 12, 92, 10, 76, 85, 73, 66, 29, 6, 36, 47, 87, 69, 18, 2, 30, 13, 96, 87, 43, 37, 95, 98, 53, 14, 58, 68, 59, 60, 45, 43, 23, 36, 4, 99, 72, 77, 16, 1, 34, 52, 47, 20, 20, 16, 73, 2, 80, 68, 88, 23, 56, 34, 20, 9, 47, 77, 76, 5, 89, 73, 99, 11, 60, 55, 61, 32, 31, 77, 32, 64, 28, 30, 36, 99, 97, 8, 100, 76, 28, 88, 98, 83, 21, 69, 91, 68, 98, 19, 24, 86, 91, 75, 48, 50, 29, 61, 33, 11, 89, 16, 26, 16, 97, 61, 66, 93, 21, 66, 21, 48, 53, 18, 82, 25, 39, 25, 44, 36, 43, 20, 21, 85, 94, 20, 86, 74, 80, 19, 84, 68, 34, 9, 35, 31, 22, 1, 23, 42, 66, 95, 41, 70, 65, 74, 94, 3, 98, 90, 38, 92, 9, 10, 76, 2, 81, 62, 27, 61, 80, 10, 80, 65, 70, 15, 95, 91, 67, 70, 84, 84, 64, 76, 53, 28, 50, 98, 82, 99, 87, 19, 91, 95, 80, 66, 48, 61, 79, 74, 21, 58, 83, 52, 23, 5, 66, 69, 95, 84, 38, 31, 67, 54, 6, 71, 33, 7, 69, 15, 6, 7, 85, 96, 2, 65, 13, 1, 25, 92, 75, 97, 1, 9, 48, 75, 13, 66, 44, 60, 49, 33, 42, 68, 38, 99, 38, 71, 6, 58, 85, 11, 65, 69, 58, 18, 85, 70, 18, 9, 13, 44, 57, 14, 53, 57, 88, 17, 22, 31, 28, 22, 16, 21, 89, 53, 20, 79, 23, 25, 36, 59, 87, 100, 28, 44, 17, 12, 65, 87, 73, 78, 30, 29, 91, 34, 37, 78, 3, 58, 61, 82, 32, 76, 3, 72, 28, 22, 50, 51, 98, 86, 61, 84, 37, 88, 27, 6, 52, 91, 92, 76, 20, 21, 56, 10, 7, 93, 40, 9, 2, 100, 90, 33, 75, 92, 57, 54, 65, 6, 56, 62, 43, 17, 45, 32, 56, 23, 37, 7, 66, 28, 34, 85, 100, 90, 47, 58, 82, 86, 66, 83, 85, 8, 68, 11, 99, 24, 16, 16, 81, 72, 77, 76, 40, 74, 7, 95, 96, 43, 54, 13, 22, 87, 50, 73, 28, 96, 31, 9, 81, 48, 44, 17, 55, 11, 79, 6, 86, 94, 21, 66, 17, 49, 93, 8, 22, 99, 55, 70, 93, 8, 82, 66, 46, 31, 39, 74, 26, 21, 82, 58, 20, 77, 74, 75, 39, 4, 32, 24, 50, 4, 42, 18, 52, 34, 26, 74, 33, 80, 43, 77, 39, 24, 43, 84, 7, 33, 9, 32, 5, 43, 42, 24, 19, 15, 50, 58, 71, 33, 81, 20, 36, 74, 89, 88, 8, 66, 61, 92, 45, 55, 68, 35, 78, 62, 19, 36, 46, 27, 68, 50, 21, 9, 26, 40, 75, 75, 97, 97, 60, 29, 68, 95, 55, 57, 82, 62, 22, 94, 5, 19, 48, 24, 53, 78, 86, 23, 13, 31, 2, 80, 33, 22, 40, 58, 61, 67, 84, 9, 63, 43, 90, 31, 38, 44, 87, 71, 57, 60, 65, 13, 78, 12, 36, 31, 89, 73, 5, 2, 56, 6, 33, 88, 28, 25, 45, 40, 91, 80, 49, 53, 75, 90, 83, 12, 85, 21, 34, 41, 81, 98, 53, 10, 62, 40, 92, 50, 13, 97, 3, 68, 2, 36, 55, 81, 12, 51, 21, 2, 82, 21, 54, 56, 10, 89, 19, 94, 61, 53, 86, 93, 50, 90, 55, 63, 29, 46, 13, 41, 42, 67, 8, 96, 54, 14, 76, 65, 16, 48, 66, 98, 20, 72, 53, 29, 12, 72, 74, 72, 24, 11, 17, 25, 100, 71, 88, 81, 16, 52, 21, 10, 18, 81, 57, 24, 46, 84, 88, 62, 32, 54, 59, 51, 77, 11, 32, 88, 34, 57, 11, 9, 20, 27, 34, 71, 49, 73, 51, 17, 24, 24, 26, 93, 56, 82, 16, 1, 65, 56, 14, 48, 61, 24, 51, 37, 87, 34, 76, 20, 90, 86, 29, 9, 65, 14, 32, 65, 86, 82, 81, 61, 5, 6, 5, 12, 39, 21, 13, 56, 28, 78, 3, 88, 2, 53, 24, 88, 86, 99, 7, 28, 36, 87, 88, 52, 100, 19, 17, 37, 53, 97, 97, 9, 55, 2, 21, 93, 74, 85, 100, 1, 62, 3, 40, 63, 7, 63, 50, 45, 13, 9, 24, 48, 95, 63, 100, 95, 34, 68, 31, 86, 64, 80, 94, 70, 33, 14, 15, 58, 98, 14, 10, 12, 68, 49, 74, 75, 11, 76, 71, 75, 84, 46, 22, 30, 8, 73, 76, 41, 40, 7, 78, 56, 38, 72, 25, 70, 37, 39, 79, 87, 5, 88, 98, 72, 36, 23, 98, 98, 98, 68, 72, 33, 65, 45, 63, 25, 70, 90, 65, 9, 96, 43, 16, 85, 66, 93, 6, 2, 83, 84, 88, 87, 71, 37, 59, 58, 60, 56, 55, 9, 76, 78, 94, 40, 23, 56, 16, 92, 97, 81, 52, 93, 75, 20, 29, 40, 12, 35, 93, 46, 18, 81, 33, 41, 69, 91, 98, 28, 98, 5, 37, 73, 34, 30, 65, 8, 37, 80, 99, 33, 12, 3, 77, 38, 74, 6, 77, 37, 92, 22, 82, 9, 54, 14, 49, 22, 56, 47, 50, 6, 3, 38, 30, 36, 19, 94, 44, 7, 26, 94, 91, 89, 48, 68, 27, 21, 25, 55, 57, 16, 28, 91, 76, 81, 56, 25, 3, 12, 23, 52, 17, 77, 41, 46, 12, 59, 92, 7, 17, 69, 1, 7, 9, 100, 26, 87, 21, 50, 94, 29, 17, 21, 71, 45, 2, 27, 69, 4, 90, 43, 7, 58, 71, 99, 55, 82, 9, 46, 41, 25, 66, 41, 31, 27, 40, 57, 13, 12, 58, 6, 93, 27, 79, 63, 71, 80, 41, 91, 35, 30, 33, 41, 87, 3, 39, 42, 36, 99, 39, 76, 23, 57, 68, 53, 83, 60, 61, 47, 71, 71, 53, 15, 97, 31, 30, 67, 62, 70, 57, 96, 100, 41, 88, 38, 95, 78, 79, 30, 76, 70, 58, 98, 26, 25, 2, 8, 84, 63, 6, 7, 33, 10, 73, 81, 92, 2, 47, 53, 72, 55, 48, 23, 95, 35, 60, 89, 12, 39, 70, 39, 60, 27, 36, 85, 4, 38, 44, 87, 52, 49, 45, 36, 59, 18, 16, 50, 19, 62, 55, 42, 16, 54, 64, 62, 89, 24, 50, 52, 14, 19, 91, 73, 98, 78, 9, 1, 15, 52, 39, 18, 52, 84, 53, 62, 53, 68, 12, 71, 81, 18, 65, 48, 71, 28, 9, 11, 3, 10, 63, 68, 81, 5, 40, 78, 34, 100, 30, 1, 51, 68, 18, 55, 3, 23, 16, 55, 42, 79, 78, 23, 96, 42, 22, 67, 21, 83, 77, 24, 44, 91, 91, 24, 47, 83, 53, 81, 82, 82, 81, 85, 2, 98, 39, 4, 72, 54, 11, 14, 33, 88, 88, 28, 29, 61, 94, 49, 43, 23, 24, 87, 13, 15, 62, 60, 49, 15, 40, 30, 48, 72, 14, 49, 21, 52, 5, 93, 58, 15, 6, 90, 2, 93, 69, 82, 53, 15, 82, 48, 37, 6, 86, 1, 72, 47, 60, 20, 61, 51, 49, 61, 22, 15, 9, 43, 18, 13, 87, 75, 79, 92, 16, 80, 36, 37, 13, 40, 51, 95, 39, 39, 100, 24, 39, 23, 71, 51, 42, 83, 53, 42, 43, 27, 8, 52, 21, 26, 16, 7, 100, 95, 98, 68, 26, 85, 4, 39, 76, 54, 33, 15, 44, 84, 38, 34, 6, 8, 36, 99, 91, 89, 92, 33, 15, 100, 36, 87, 25, 4, 93, 76, 98, 42, 43, 75, 26, 98, 13, 1, 3, 45, 15, 46, 80, 5, 32, 37, 12, 67, 35, 54, 55, 27, 39, 21, 78, 26, 7, 2, 29, 51, 29, 78, 92, 24, 53, 69, 21, 65, 70, 24, 62, 36, 21, 41, 92, 52, 78, 56, 19, 64, 9, 25, 42, 99, 98, 19, 25, 56, 72, 53, 7, 1, 31, 50, 24, 83, 19, 96, 99, 40, 71, 60, 27, 92, 53, 19, 95, 82, 74, 65, 45, 34, 90, 87, 33, 39, 57, 9, 94, 29, 13, 52, 81, 43, 2, 56, 77, 20, 51, 28, 11, 22, 87, 37, 65, 39, 55, 11, 20, 80, 76, 17, 66, 17, 55, 98, 55, 11, 58, 100, 91, 70, 52, 71, 65, 53, 26, 93, 24, 29, 20, 34, 2, 7, 22, 18, 97, 29, 28, 69, 8, 55, 85, 73, 71, 91, 22, 77, 1, 79, 29, 92, 1, 80, 14, 65, 84, 92, 9, 59, 20, 29, 44, 21, 87, 65, 90, 83, 93, 17, 3, 1, 72, 39, 25, 94, 29, 99, 23, 30, 77, 51, 73, 29, 82, 38, 45, 65, 29, 54, 75, 100, 82, 18, 72, 68, 82, 61, 2, 75, 78, 57, 27, 1, 95, 3, 46, 24, 1, 20, 53, 30, 70, 77, 58, 3, 14, 3, 67, 95, 56, 93, 94, 89, 10, 66, 8, 92, 78, 61, 18, 55, 17, 44, 7, 12, 46, 5, 35, 99, 24, 39, 28, 94, 67, 85, 48, 32, 39, 15, 26, 46, 59, 72, 34, 69, 89, 93, 60, 66, 54, 77, 73, 22, 72, 31, 33, 69, 35, 19, 67, 59, 9, 94, 4, 75, 31, 51, 7, 69, 17, 84, 15, 76, 55, 100, 44, 43, 93, 55, 61, 98, 83, 33, 19, 6, 63, 4, 74, 98, 22, 93, 8, 31, 38, 11, 57, 68, 13, 63, 37, 30, 47, 3, 57, 53, 54, 100, 48, 46, 6, 8, 95, 88, 92, 66, 93, 54, 69, 18, 3, 42, 10, 10, 24, 48, 72, 81, 67, 37, 95, 55, 66, 41, 57, 74, 46, 11, 25, 93, 8, 30, 52, 55, 69, 43, 20, 61, 96, 88, 30, 51, 29, 92, 12, 5, 91, 36, 85, 57, 72, 79, 12, 89, 72, 20, 62, 17, 82, 86, 61, 90, 67, 12, 44, 35, 54, 15, 47, 1, 2, 76, 51, 82, 19, 63, 86, 9, 50, 70, 18, 21, 1, 29, 61, 72, 100, 22, 40, 82, 59, 100, 23, 25, 11, 18, 59, 64, 32, 5, 64, 85, 32, 67, 66, 51, 81, 4, 59, 30, 25, 76, 50, 25, 56, 62, 48, 8, 83, 87, 89, 93, 86, 63, 17, 96, 32, 27, 11, 15, 31, 75, 99, 62, 93, 16, 12, 73, 19, 23, 2, 96, 50, 3, 20, 6, 64, 68, 65, 98, 54, 5, 90, 92, 67, 6, 39, 50, 32, 50, 64, 14, 76, 14, 27, 68, 29, 91, 40, 100, 13, 93, 47, 14, 95, 66, 71, 10, 85, 35, 7, 39, 39, 96, 82, 57, 53, 20, 6, 36, 69, 69, 1, 96, 34, 27, 15, 15, 69, 54, 66, 81, 98, 12, 47, 92, 77, 17, 1, 62, 52, 59, 52, 42, 6, 85, 99, 10, 4, 4, 45, 25, 25, 97, 20, 58, 76, 35, 24, 44, 40, 89, 77, 38, 100, 23, 81, 29, 91, 34, 42, 42, 92, 93, 36, 98, 77, 34, 7, 32, 89, 4, 56, 13, 100, 28, 23, 27, 14, 46, 71, 53, 35, 47, 42, 86, 21, 23, 14, 11, 56, 55, 5, 99, 47, 40, 96, 75, 73, 55, 7, 61, 58, 14, 26, 9, 41, 100, 36, 54, 45, 58, 59, 31, 4, 100, 17, 24, 74, 30, 86, 81, 85, 90, 80, 83, 29, 27, 10, 53, 81, 68, 66, 90, 81, 91, 51, 74, 90, 38, 79, 86, 95, 37, 17, 50, 89, 33, 25, 14, 62, 10, 47, 98, 100, 26, 33, 80, 4, 42, 33, 85, 9, 98, 26, 41, 40, 76, 66, 81, 13, 45, 66, 59, 33, 82, 8, 73, 66, 32, 87, 80, 94, 33, 77, 93, 10, 9, 72, 65, 2, 56, 1, 10, 5, 27, 3, 44, 54, 68, 24, 19, 64, 42, 77, 97, 23, 85, 21, 41, 68, 7, 20, 61, 91, 48, 5, 52, 9, 29, 17, 10, 84, 17, 72, 89, 95, 74, 84, 49, 93, 60, 67, 57, 1, 43, 5, 75, 79, 25, 15, 99, 84, 34, 59, 26, 34, 64, 78, 42, 44, 46, 51, 27, 14, 22, 67, 9, 47, 3, 9, 92, 62, 75, 48, 62, 69, 4, 36, 100, 28, 51, 98, 11, 36, 8, 89, 69, 23, 66, 62, 66, 63, 13, 45, 76, 86, 63, 36, 85, 65, 44, 76, 26, 70, 75, 87, 91, 78, 75, 90, 5, 77, 39, 68, 64, 46, 56, 85, 21, 73, 46, 86, 87, 58, 82, 14, 96, 45, 50, 80, 9, 45, 55, 87, 67, 81, 25, 57, 58, 99, 46, 14, 27, 36, 33, 91, 81, 40, 75, 53, 64, 20, 39, 50, 30, 72, 64, 77, 16, 65, 56, 77, 61, 62, 63, 27, 42, 39, 83, 51, 90, 80, 64, 16, 15, 97, 58, 48, 36, 32, 100, 100, 4, 90, 1, 85, 62, 16, 13, 29, 32, 68, 57, 93, 81, 71, 19, 74, 10, 54, 24, 99, 85, 87, 14, 100, 35, 24, 99, 23, 7, 50, 74, 10, 92, 74, 46, 5, 42, 58, 33, 73, 77, 42, 65, 9, 12, 36, 82, 21, 41, 5, 19, 25, 44, 85, 76, 30, 8, 74, 52, 14, 76, 77, 76, 67, 3, 73, 23, 44, 83, 7, 16, 11, 48, 33, 20, 60, 20, 53, 80, 60, 10, 51, 84, 5, 35, 60, 34, 94, 85, 38, 59, 12, 14, 86, 30, 16, 59, 52, 59, 93, 59, 27, 3, 6, 59, 74, 65, 78, 27, 97, 89, 36, 47, 72, 92, 33, 83, 25, 26, 20, 62, 36, 31, 28, 22, 13, 43, 32, 64, 54, 24, 22, 80, 78, 80, 90, 52, 44, 19, 30, 40, 7, 17, 38, 30, 8, 70, 13, 84, 47, 84, 98, 83, 66, 25, 56, 78, 19, 39, 42, 72, 62, 15, 3, 91, 94, 44, 94, 90, 62, 23, 81, 68, 91, 19, 98, 98, 40, 62, 34, 87, 45, 31, 21, 62, 55, 28, 40, 73, 66, 33, 97, 79, 47, 51, 21, 41, 95, 15, 82, 8, 89, 62, 76, 80, 32, 25, 29, 72, 38, 62, 10, 82, 44, 82, 43, 98, 9, 34, 23, 26, 66, 19, 4, 13, 21, 76, 5, 15, 90, 38, 23, 31, 99, 50, 10, 31, 26, 90, 2, 63, 4, 63, 96, 47, 44, 90, 97, 52, 24, 19, 77, 41, 89, 32, 5, 61, 7, 61, 28, 49, 98, 2, 79, 97, 51, 40, 79, 28, 81, 32, 90, 84, 94, 37, 83, 37, 26, 31, 88, 1, 49, 16, 42, 89, 99, 98, 49, 57, 59, 76, 57, 56, 29, 35, 4, 79, 26, 82, 58, 7, 13, 99, 42, 6, 35, 24, 42, 13, 54, 81, 65, 54, 48, 58, 94, 98, 56, 95, 7, 14, 22, 63, 21, 51, 50, 25, 81, 75, 6, 39, 81, 19, 37, 23, 76, 24, 98, 18, 36, 4, 50, 100, 9, 50, 58, 3, 47, 13, 97, 53, 78, 70, 16, 98, 20, 65, 22, 1, 91, 80, 39, 72, 98, 27, 46, 25, 50, 43, 94, 85, 98, 44, 37, 7, 93, 94, 9, 91, 58, 57, 44, 35, 26, 11, 32, 98, 27, 6, 98, 17, 85, 88, 40, 34, 66, 85, 58, 68, 80, 52, 52, 77, 47, 40, 35, 39, 85, 95, 29, 42, 3, 24, 28, 81, 34, 60, 78, 12, 17, 27, 29, 1, 66, 20, 86, 31, 5, 43, 98, 36, 46, 2, 64, 92, 93, 51, 82, 78, 45, 63, 19, 48, 86, 47, 28, 72, 58, 5, 35, 26, 83, 15, 78, 48, 35, 63, 30, 91, 57, 80, 26, 3, 81, 41, 46, 73, 91, 80, 2, 36, 42, 21, 35, 79, 19, 14, 50, 76, 70, 37, 53, 52, 51, 30, 99, 85, 92, 80, 75, 100, 59, 52, 2, 91, 45, 100, 64, 35, 79, 65, 22, 72, 37, 8, 50, 55, 21, 52, 82, 90, 88, 34, 41, 38, 15, 91, 23, 6, 71, 49, 6, 81, 53, 59, 72, 97, 10, 87, 83, 40, 3, 57, 11, 40, 64, 61, 46, 85, 64, 80, 74, 51, 65, 67, 88, 80, 9, 62, 37, 79, 63, 94, 12, 15, 5, 83, 63, 14, 69, 45, 6, 71, 1, 16, 62, 17, 28, 8, 1, 91, 39, 26, 93, 3, 44, 33, 34, 53, 94, 71, 83, 8, 16, 94, 74, 20, 28, 36, 86, 96, 33, 91, 67, 85, 58, 80, 1, 38, 87, 53, 28, 77, 31, 21, 80, 74, 53, 65, 78, 98, 35, 13, 58, 3, 58, 31, 22, 86, 19, 59, 81, 3, 1, 99, 87, 59, 79, 88, 96, 17, 92, 75, 94, 22, 47, 25, 48, 51, 89, 77, 1, 76, 89, 58, 78, 47, 40, 51, 32, 10, 10, 64, 12, 10, 63, 99, 20, 41, 38, 67, 9, 29, 94, 2, 3, 40, 78, 50, 91, 67, 26, 43, 42, 67, 52, 19, 13, 91, 69, 96, 53, 30, 59, 64, 92, 21, 14, 11, 13, 51, 78, 74, 32, 71, 27, 34, 62, 5, 35, 4, 71, 12, 46, 64, 78, 97, 34, 42, 40, 54, 89, 92, 84, 48, 55, 75, 20, 69, 37, 85, 71, 66, 58, 2, 88, 84, 87, 50, 88, 73, 53, 10, 37, 51, 25, 66, 47, 10, 8, 38, 64, 48, 29, 99, 95, 36, 25, 15, 4, 61, 99, 26, 27, 8, 80, 14, 91, 18, 15, 31, 91, 68, 92, 27, 70, 17, 92, 16, 78, 51, 54, 41, 99, 34, 39, 45, 69, 15, 11, 24, 76, 9, 50, 54, 68, 29, 67, 59, 98, 34, 41, 88, 1, 32, 66, 22, 100, 10, 37, 78, 60, 42, 70, 10, 28, 61, 55, 96, 75, 65, 20, 50, 26, 21, 3, 93, 1, 22, 3, 98, 55, 43, 38, 7, 27, 3, 80, 78, 12, 16, 55, 24, 10, 25, 85, 37, 85, 91, 84, 11, 56, 55, 61, 33, 75, 15, 77, 27, 88, 32, 25, 94, 74, 62, 52, 52, 16, 31, 30, 28, 99, 84, 3, 60, 60, 87, 48, 96, 78, 31, 7, 85, 86, 19, 69, 12, 33, 45, 39, 73, 76, 63, 66, 2, 76, 70, 53, 91, 100, 82, 70, 50, 18, 24, 9, 29, 11, 56, 25, 40, 87, 83, 24, 24, 1, 44, 87, 85, 88, 25, 57, 16, 39, 75, 69, 14, 44, 21, 57, 95, 55, 78, 45, 24, 2, 53, 52, 64, 61, 28, 3, 99, 10, 78, 22, 10, 21, 8, 95, 60, 85, 3, 75, 23, 77, 43, 89, 72, 16, 97, 67, 22, 26, 63, 45, 27, 15, 96, 90, 27, 76, 44, 25, 85, 21, 98, 47, 93, 58, 93, 53, 42, 95, 79, 16, 24, 74, 56, 95, 89, 52, 13, 62, 78, 75, 6, 56, 42, 53, 98, 20, 28, 41, 45, 65, 14, 42, 11, 6, 99, 3, 10, 92, 97, 89, 8, 72, 62, 63, 67, 2, 67, 31, 63, 96, 58, 68, 51, 51, 72, 100, 70, 100, 93, 66, 64, 6, 8, 74, 63, 58, 28, 73, 50, 24, 13, 57, 96, 74, 71, 14, 75, 37, 96, 37, 32, 5, 56, 35, 55, 27, 34, 77, 78, 26, 42, 93, 83, 49, 18, 98, 7, 45, 22, 8, 21, 34, 64, 68, 7, 34, 81, 33, 23, 28, 69, 6, 33, 76, 40, 39, 2, 26, 15, 32, 51, 9, 24, 86, 57, 42, 83, 15, 86, 4, 22, 6, 37, 37, 25, 95, 23, 57, 27, 45, 85, 47, 50, 69, 22, 42, 7, 75, 67, 74, 6, 69, 82, 30, 6, 90, 23, 88, 57, 60, 43, 30, 18, 31, 67, 42, 25, 41, 99, 3, 85, 83, 49, 86, 51, 22, 79, 9, 97, 45, 82, 54, 66, 15, 83, 71, 5, 57, 11, 61, 17, 5, 90, 34, 36, 8, 75, 60, 48, 73, 15, 32, 7, 63, 70, 9, 37, 48, 18, 33, 45, 51, 38, 62, 66, 73, 84, 70, 29, 46, 82, 45, 51, 71, 78, 86, 79, 5, 97, 78, 77, 11, 62, 36, 26, 31, 44, 62, 30, 13, 46, 26, 64, 83, 39, 81, 7, 23, 50, 36, 68, 83, 80, 70, 5, 10, 55, 83, 14, 4, 13, 42, 14, 74, 77, 91, 4, 21, 4, 85, 33, 1, 63, 48, 84, 1, 28, 90, 23, 29, 77, 43, 11, 57, 12, 16, 18, 19, 50, 31, 22, 62, 72, 87, 35, 49, 78, 90, 21, 81, 75, 53, 82, 37, 1, 17, 37, 28, 58, 12, 57, 87, 6, 19, 43, 69, 34, 12, 87, 84, 42, 8, 97, 65, 47, 32, 13, 24, 21, 33, 56, 47, 38, 89, 35, 38, 57, 24, 17, 67, 35, 25, 53, 92, 44, 95, 60, 77, 6, 47, 12, 99, 6, 9, 63, 52, 92, 28, 27, 12, 12, 35, 11, 49, 23, 45, 38, 32, 68, 55, 98, 54, 31, 50, 45, 74, 96, 5, 3, 53, 3, 66, 51, 8, 74, 65, 12, 17, 92, 38, 81, 56, 24, 91, 4, 99, 35, 94, 30, 55, 100, 27, 60, 30, 76, 5, 56, 23, 61, 58, 75, 63, 75, 77, 70, 1, 41, 33, 17, 85, 23, 97, 40, 46, 87, 95, 44, 74, 40, 73, 80, 39, 51, 39, 69, 78, 43, 76, 100, 55, 85, 74, 17, 59, 50, 39, 59, 43, 71, 76, 79, 45, 24, 70, 91, 11, 64, 86, 36, 56, 11, 15, 94, 61, 5, 14, 39, 100, 89, 38, 54, 73, 64, 71, 84, 65, 61, 42, 7, 83, 69, 37, 28, 93, 6, 70, 55, 22, 55, 90, 77, 17, 56, 70, 78, 60, 36, 68, 59, 24, 57, 13, 49, 20, 35, 32, 37, 47, 73, 95, 29, 94, 32, 8, 86, 37, 77, 40, 10, 84, 29, 86, 100, 36, 8, 29, 95, 43, 96, 54, 18, 5, 18, 66, 76, 4, 49, 12, 50, 74, 7, 78, 67, 38, 86, 4, 26, 14, 43, 36, 97, 23, 73, 49, 58, 32, 29, 52, 74, 25, 57, 44, 81, 26, 61, 56, 29, 10, 68, 78, 35, 74, 56, 1, 63, 93, 4, 88, 58, 98, 75, 55, 20, 48, 55, 29, 79, 83, 32, 5, 59, 41, 100, 39, 66, 60, 47, 95, 21, 14, 72, 55, 39, 79, 7, 53, 71, 62, 40, 29, 59, 67, 35, 30, 66, 41, 10, 44, 23, 42, 100, 34, 82, 51, 24, 47, 11, 70, 41, 83, 83, 65, 90, 73, 43, 96, 25, 66, 10, 17, 46, 68, 83, 32, 50, 48, 72, 59, 43, 46, 52, 95, 79, 33, 45, 3, 32, 7, 72, 24, 42, 7, 88, 31, 31, 31, 78, 56, 96, 87, 24, 93, 7, 6, 24, 8, 5, 95, 66, 47, 92, 70, 41, 71, 2, 38, 25, 85, 44, 96, 9, 85, 54, 96, 67, 85, 78, 45, 92, 25, 83, 15, 17, 41, 72, 40, 48, 76, 86, 66, 22, 78, 35, 15, 100, 88, 52, 24, 73, 47, 71, 33, 32, 25, 28, 50, 61, 6, 94, 52, 82, 77, 18, 99, 69, 89, 90, 17, 64, 76, 82, 37, 5, 68, 51, 4, 55, 54, 27, 79, 53, 97, 11, 36, 73, 39, 85, 85, 96, 79, 36, 29, 7, 5, 27, 75, 93, 17, 43, 8, 44, 76, 45, 100, 43, 47, 3, 98, 1, 81, 28, 53, 29, 39, 88, 2, 29, 24, 86, 24, 2, 74, 4, 60, 30, 31, 87, 23, 99, 29, 30, 94, 5, 26, 93, 99, 73, 47, 96, 25, 27, 24, 29, 55, 14, 68, 8, 42, 91, 46, 17, 93, 71, 20, 4, 100, 2, 90, 22, 100, 71, 4, 45, 27, 29, 37, 25, 53, 83, 73, 77, 61, 48, 5, 16, 61, 72, 75, 2, 63, 20, 70, 7, 90, 89, 10, 42, 91, 52, 63, 42, 74, 18, 87, 100, 99, 23, 76, 51, 58, 48, 28, 18, 47, 32, 85, 7, 4, 12, 60, 18, 31, 29, 24, 73, 70, 85, 14, 60, 88, 28, 1, 61, 98, 39, 12, 96, 14, 88, 46, 71, 87, 73, 40, 34, 57, 77, 92, 12, 88, 52, 29, 70, 32, 52, 42, 1, 88, 7, 12, 76, 87, 65, 88, 84, 3, 100, 79, 16, 39, 24, 38, 77, 49, 78, 10, 5, 54, 54, 16, 41, 57, 96, 10, 88, 99, 4, 41, 86, 62, 4, 61, 48, 68, 1, 31, 71, 100, 9, 38, 38, 85, 76, 14, 33, 53, 76, 89, 58, 81, 56, 50, 37, 51, 11, 76, 49, 66, 68, 86, 28, 72, 99, 75, 39, 99, 6, 61, 50, 66, 99, 39, 50, 74, 4, 34, 78, 79, 22, 87, 59, 29, 36, 47, 31, 98, 23, 31, 64, 90, 17, 91, 13, 15, 65, 52, 65, 22, 64, 14, 88, 62, 52, 89, 87, 55, 23, 16, 86, 96, 2, 96, 77, 89, 43, 7, 87, 17, 38, 50, 58, 54, 40, 71, 20, 56, 74, 36, 30, 37, 49, 69, 51, 52, 57, 89, 6, 31, 57, 43, 79, 10, 39, 55, 99, 33, 61, 85, 1, 98, 86, 58, 3, 77, 80, 74, 84, 53, 9, 13, 42, 57, 81, 92, 60, 90, 32, 18, 20, 88, 60, 98, 98, 50, 4, 96, 34, 65, 32, 34, 14, 69, 44, 17, 97, 75, 90, 80, 80, 51, 45, 21, 59, 25, 64, 19, 66, 95, 36, 86, 35, 47, 35, 32, 97, 39, 79, 82, 55, 62, 68, 68, 82, 63, 36, 78, 37, 78, 57, 16, 28, 1, 36, 38, 78, 99, 56, 43, 46, 43, 80, 80, 90, 67, 63, 38, 57, 41, 19, 11, 54, 86, 30, 35, 48, 18, 12, 37, 95, 20, 52, 74, 73, 40, 11, 50, 38, 19, 44, 35, 61, 76, 14, 50, 42, 76, 39, 98, 68, 58, 60, 21, 95, 89, 55, 95, 6, 18, 31, 52, 38, 34, 77, 10, 73, 40, 11, 63, 58, 6, 97, 70, 81, 63, 72, 74, 90, 10, 23, 10, 67, 82, 30, 14, 71, 37, 8, 28, 6, 90, 32, 43, 23, 8, 4, 48, 47, 66, 10, 56, 72, 58, 26, 4, 72, 49, 78, 62, 58, 52, 23, 77, 34, 52, 90, 56, 40, 49, 83, 98, 90, 66, 92, 64, 74, 96, 11, 72, 13, 72, 80, 36, 30, 57, 40, 1, 5, 69, 14, 62, 20, 36, 38, 5, 40, 79, 60, 31, 79, 95, 28, 68, 60, 20, 32, 85, 67, 94, 57, 79, 66, 88, 15, 95, 44, 6, 47, 100, 74, 13, 13, 45, 48, 51, 50, 39, 81, 61, 70, 60, 55, 49, 27, 15, 68, 10, 99, 34, 4, 7, 65, 69, 94, 79, 15, 89, 84, 61, 88, 9, 73, 1, 5, 73, 3, 6, 11, 35, 67, 32, 94, 21, 81, 73, 87, 48, 82, 86, 34, 85, 44, 98, 53, 38, 28, 19, 78, 63, 80, 18, 23, 4, 70, 27, 28, 72, 85, 91, 6, 51, 22, 52, 71, 54, 24, 58, 54, 5, 95, 39, 42, 38, 88, 46, 27, 15, 65, 5, 29, 96, 22, 51, 51, 43, 29, 79, 14, 13, 21, 71, 15, 94, 74, 86, 48, 97, 95, 1, 54, 89, 39, 47, 78, 26, 92, 5, 92, 56, 61, 20, 3, 34, 22, 54, 76, 2, 84, 41, 67, 4, 63, 33, 97, 37, 70, 44, 85, 64, 96, 90, 4, 86, 36, 34, 63, 28, 38, 54, 35, 50, 25, 38, 83, 98, 91, 10, 52, 74, 50, 70, 77, 12, 2, 25, 100, 72, 69, 85, 35, 16, 26, 91, 2, 62, 24, 64, 89, 13, 70, 23, 62, 46, 12, 96, 44, 2, 5, 47, 27, 6, 16, 3, 69, 17, 80, 21, 88, 48, 5, 75, 15, 82, 17, 16, 43, 40, 32, 83, 4, 1, 58, 17, 46, 69, 12, 41, 71, 68, 87, 49, 25, 2, 4, 93, 71, 83, 13, 10, 30, 69, 84, 44, 51, 52, 12, 45, 43, 43, 28, 46, 95, 85, 62, 40, 53, 25, 33, 75, 92, 19, 24, 16, 73, 27, 61, 43, 9, 25, 52, 90, 46, 88, 85, 96, 39, 48, 92, 82, 90, 19, 79, 36, 55, 41, 28, 8, 65, 60, 34, 9, 30, 57, 24, 2, 35, 36, 44, 95, 61, 48, 84, 6, 35, 21, 53, 73, 68, 44, 6, 10, 15, 85, 45, 69, 77, 72, 28, 41, 83, 62, 49, 13, 70, 25, 14, 57, 60, 10, 51, 72, 57, 87, 77, 91, 7, 81, 15, 26, 77, 21, 35, 91, 57, 32, 59, 33, 55, 39, 25, 38, 100, 74, 50, 21, 50, 63, 77, 9, 72, 28, 81, 80, 66, 9, 70, 24, 90, 85, 49, 66, 57, 36, 8, 65, 67, 18, 97, 21, 56, 21, 58, 55, 46, 59, 76, 95, 74, 52, 56, 97, 31, 36, 77, 96, 96, 46, 19, 37, 82, 20, 54, 90, 55, 61, 54, 73, 79, 2, 93, 34, 23, 3, 41, 20, 13, 68, 15, 86, 71, 70, 83, 2, 57, 11, 49, 52, 56, 20, 41, 90, 39, 94, 79, 45, 55, 85, 17, 33, 86, 61, 18, 60, 15, 58, 80, 28, 77, 46, 65, 48, 67, 99, 49, 23, 9, 49, 26, 17, 68, 66, 6, 58, 60, 36, 54, 66, 72, 70, 50, 58, 83, 67, 69, 49, 77, 100, 28, 53, 45, 93, 100, 11, 43, 100, 85, 52, 1, 63, 20, 20, 80, 77, 78, 91, 12, 31, 56, 84, 53, 5, 93, 87, 24, 61, 35, 100, 61, 63, 4, 57, 7, 4, 20, 49, 55, 56, 52, 55, 70, 71, 75, 50, 47, 4, 92, 11, 34, 48, 46, 38, 4, 38, 76, 27, 50, 11, 78, 62, 25, 82, 71, 31, 37, 90, 79, 91, 45, 31, 46, 15, 53, 72, 16, 100, 75, 7, 62, 60, 6, 7, 98, 10, 96, 73, 88, 97, 35, 18, 59, 59, 99, 29, 89, 87, 70, 20, 77, 66, 2, 74, 32, 54, 45, 47, 5, 71, 6, 66, 31, 11, 72, 80, 72, 19, 4, 60, 16, 39, 77, 74, 97, 27, 54, 38, 13, 75, 57, 41, 40, 10, 67, 72, 63, 63, 70, 20, 34, 75, 85, 64, 86, 9, 95, 57, 27, 98, 68, 42, 36, 96, 67, 85, 22, 72, 22, 86, 46, 30, 79, 38, 39, 45, 9, 53, 59, 78, 72, 92, 53, 57, 7, 90, 17, 1, 46, 43, 99, 14, 37, 86, 61, 55, 70, 83, 79, 43, 20, 24, 72, 98, 61, 10, 94, 21, 63, 5, 99, 86, 48, 3, 42, 55, 92, 58, 7, 89, 53, 57, 54, 41, 95, 15, 95, 64, 97, 73, 7, 68, 49, 30, 18, 61, 40, 11, 34, 54, 15, 32, 39, 63, 86, 33, 69, 77, 42, 27, 65, 46, 36, 19, 86, 30, 33, 33, 45, 81, 57, 3, 100, 5, 33, 17, 18, 24, 28, 51, 29, 94, 34, 19, 8, 71, 3, 28, 47, 45, 7, 63, 90, 42, 33, 28, 23, 17, 60, 19, 49, 16, 22, 49, 73, 6, 65, 42, 81, 44, 44, 61, 90, 29, 79, 97, 99, 82, 77, 97, 78, 83, 59, 19, 24, 44, 46, 98, 12, 57, 68, 61, 25, 41, 61, 49, 46, 25, 90, 78, 21, 33, 38, 10, 13, 17, 58, 11, 50, 34, 7, 79, 16, 65, 97, 91, 60, 95, 40, 72, 3, 8, 84, 27, 48, 44, 75, 46, 68, 16, 23, 40, 100, 61, 1, 12, 29, 59, 22, 30, 44, 28, 8, 60, 45, 56, 2, 56, 2, 42, 27, 57, 1, 10, 83, 48, 53, 10, 93, 73, 77, 68, 64, 77, 80, 65, 40, 8, 23, 14, 89, 66, 93, 48, 77, 37, 55, 31, 45, 57, 24, 71, 13, 24, 33, 47, 71, 37, 8, 16, 61, 85, 83, 25, 13, 14, 89, 4, 21, 63, 17, 61, 80, 10, 60, 9, 98, 14, 39, 42, 22, 62, 65, 86, 85, 97, 85, 7, 85, 92, 74, 46, 28, 8, 22, 40, 21, 10, 96, 93, 24, 12, 5, 3, 21, 64, 11, 71, 78, 1, 12, 99, 62, 76, 37, 98, 24, 21, 57, 61, 12, 30, 6, 92, 90, 27, 83, 10, 88, 78, 55, 63, 90, 59, 65, 62, 23, 28, 32, 52, 28, 44, 50, 42, 71, 38, 39, 47, 58, 95, 7, 22, 77, 64, 13, 66, 42, 95, 27, 81, 73, 33, 43, 14, 92, 59, 75, 66, 38, 7, 17, 66, 2, 18, 59, 72, 56, 49, 70, 13, 44, 76, 34, 72, 91, 98, 89, 84, 93, 15, 64, 17, 100, 58, 30, 91, 17, 4, 56, 54, 10, 72, 71, 11, 89, 81, 35, 96, 30, 4, 9, 73, 32, 94, 96, 74, 44, 84, 58, 36, 50, 73, 4, 49, 31, 33, 91, 99, 88, 46, 4, 98, 69, 27, 60, 10, 7, 46, 5, 36, 50, 65, 60, 33, 11, 55, 6, 54, 90, 15, 41, 92, 88, 44, 92, 70, 28, 83, 20, 15, 80, 23, 12, 49, 49, 24, 10, 8, 69, 14, 43, 70, 31, 55, 2, 41, 61, 60, 46, 51, 26, 86, 94, 13, 81, 85, 34, 8, 67, 53, 22, 99, 28, 86, 99, 28, 61, 8, 35, 29, 73, 30, 51, 3, 84, 4, 95, 44, 63, 40, 46, 89, 25, 39, 53, 5, 24, 39, 64, 42, 43, 86, 40, 22, 23, 38, 50, 83, 45, 36, 63, 70, 17, 13, 72, 100, 17, 67, 96, 31, 58, 93, 71, 83, 32, 76, 39, 7, 66, 55, 100, 8, 40, 40, 82, 62, 29, 83, 96, 26, 18, 58, 95, 35, 23, 18, 86, 91, 36, 33, 73, 94, 78, 44, 28, 9, 71, 18, 67, 36, 72, 66, 95, 63, 57, 76, 76, 38, 58, 71, 63, 28, 81, 9, 14, 3, 26, 51, 93, 14, 36, 65, 59, 13, 60, 86, 73, 30, 55, 91, 17, 27, 8, 64, 89, 65, 91, 17, 54, 1, 87, 68, 28, 67, 76, 93, 21, 53, 95, 65, 18, 30, 30, 76, 94, 41, 13, 66, 23, 68, 8, 39, 94, 16, 54, 34, 32, 45, 50, 85, 45, 89, 52, 24, 7, 27, 68, 28, 31, 62, 92, 49, 44, 73, 24, 37, 14, 37, 55, 36, 56, 62, 26, 1, 77, 80, 34, 8, 76, 36, 44, 20, 76, 95, 95, 82, 73, 62, 61, 56, 23, 53, 4, 18, 77, 79, 55, 42, 67, 61, 77, 22, 22, 55, 22, 51, 86, 8, 58, 61, 43, 2, 32, 70, 48, 26, 51, 21, 39, 12, 28, 13, 16, 31, 31, 92, 61, 37, 34, 28, 97, 62, 49, 18, 68, 71, 68, 5, 78, 78, 65, 72, 31, 48, 41, 78, 73, 43, 50, 63, 54, 77, 76, 21, 59, 6, 65, 20, 42, 50, 47, 90, 63, 95, 7, 83, 17, 27, 87, 94, 4, 52, 17, 34, 99, 57, 63, 24, 100, 13, 38, 5, 41, 13, 78, 100, 70, 94, 19, 63, 43, 65, 52, 57, 11, 11, 39, 28, 37, 26, 73, 40, 29, 90, 25, 27, 98, 87, 2, 49, 51, 92, 6, 92, 4, 83, 91, 26, 76, 61, 88, 70, 25, 40, 26, 87, 50, 17, 14, 38, 42, 39, 29, 70, 28, 53, 48, 77, 91, 2, 26, 42, 93, 31, 85, 96, 65, 27, 21, 92, 87, 61, 61, 63, 52, 38, 49, 53, 54, 15, 90, 95, 53, 18, 16, 32, 22, 64, 8, 64, 17, 85, 5, 9, 15, 41, 56, 79, 67, 29, 70, 53, 89, 82, 15, 92, 20, 16, 44, 25, 30, 33, 72, 34, 2, 87, 65, 75, 2, 24, 38, 18, 9, 95, 78, 75, 35, 34, 54, 54, 62, 75, 6, 2, 9, 73, 93, 80, 88, 36, 4, 17, 20, 75, 2, 73, 14, 18, 47, 67, 41, 36, 37, 1, 30, 14, 76, 17, 47, 81, 70, 60, 7, 75, 61, 15, 99, 53, 94, 86, 40, 50, 54, 59, 76, 55, 83, 41, 72, 29, 8, 65, 65, 44, 65, 46, 9, 92, 62, 8, 24, 83, 67, 31, 10, 80, 97, 8, 84, 43, 94, 24, 92, 99, 34, 67, 54, 69, 8, 25, 97, 67, 41, 13, 62, 6, 11, 70, 49, 24, 29, 73, 7, 96, 55, 68, 27, 3, 75, 10, 45, 20, 85, 36, 19, 71, 55, 24, 39, 14, 48, 87, 80, 41, 52, 93, 98, 62, 62, 46, 37, 91, 70, 43, 38, 24, 62, 16, 27, 37, 25, 23, 8, 62, 11, 26, 84, 65, 49, 22, 30, 49, 60, 9, 89, 11, 1, 86, 24, 14, 83, 61, 56, 53, 55, 45, 28, 17, 60, 6, 5, 37, 29, 12, 50, 39, 90, 33, 55, 90, 54, 84, 38, 13, 44, 78, 76, 96, 15, 99, 9, 50, 11, 17, 2, 66, 13, 29, 34, 73, 35, 38, 61, 15, 1, 10, 53, 90, 42, 7, 80, 47, 90, 69, 11, 33, 99, 86, 28, 13, 37, 88, 62, 47, 56, 15, 64, 69, 96, 49, 93, 82, 86, 53, 96, 39, 14, 48, 28, 55, 6, 7, 1, 95, 28, 63, 79, 26, 49, 58, 90, 85, 97, 4, 83, 53, 18, 99, 73, 13, 47, 65, 46, 85, 69, 41, 23, 82, 88, 2, 88, 45, 61, 40, 39, 88, 2, 69, 13, 2, 78, 54, 86, 75, 57, 21, 79, 27, 71, 51, 91, 17, 67, 37, 53, 87, 77, 75, 68, 17, 77, 7, 61, 37, 46, 52, 76, 99, 20, 40, 1, 98, 93, 38, 24, 2, 58, 2, 28, 28, 4, 18, 97, 70, 54, 49, 56, 83, 76, 75, 99, 52, 81, 11, 40, 78, 62, 15, 76, 34, 54, 76, 83, 98, 14, 58, 99, 23, 59, 26, 3, 14, 96, 99, 35, 1, 99, 42, 83, 74, 68, 33, 25, 48, 44, 16, 77, 57, 30, 4, 42, 35, 32, 24, 33, 45, 81, 31, 19, 91, 9, 21, 4, 4, 71, 90, 4, 70, 31, 39, 43, 98, 71, 20, 97, 66, 35, 25, 23, 17, 29, 64, 51, 60, 40, 35, 56, 72, 18, 26, 63, 26, 47, 18, 81, 69, 60, 84, 90, 90, 74, 33, 40, 45, 4, 36, 10, 38, 61, 84, 6, 41, 100, 57, 100, 91, 43, 7, 62, 60, 32, 76, 37, 30, 46, 69, 99, 5, 53, 88, 94, 78, 72, 33, 22, 75, 21, 84, 65, 33, 19, 70, 73, 18, 78, 24, 8, 21, 30, 22, 32, 61, 97, 21, 91, 42, 89, 41, 46, 93, 80, 92, 71, 4, 76, 44, 30, 96, 27, 94, 80, 46, 64, 52, 15, 93, 75, 75, 65, 4, 96, 97, 17, 92, 69, 59, 86, 57, 51, 83, 2, 82, 74, 72, 85, 2, 15, 15, 49, 94, 60, 29, 39, 75, 80, 5, 68, 7, 79, 32, 62, 74, 80, 78, 18, 48, 88, 3, 57, 38, 85, 58, 72, 11, 81, 56, 12, 95, 22, 60, 40, 82, 88, 30, 8, 20, 35, 75, 78, 13, 59, 39, 39, 38, 69, 56, 38, 56, 10, 46, 46, 94, 3, 69, 56, 83, 24, 67, 29, 98, 79, 69, 31, 18, 98, 38, 37, 84, 65, 14, 97, 23, 5, 87, 12, 73, 42, 1, 80, 51, 46, 77, 96, 100, 45, 4, 82, 21, 22, 63, 18, 100, 83, 100, 18, 32, 37, 6, 16, 53, 20, 64, 27, 76, 50, 39, 48, 43, 91, 27, 45, 37, 56, 92, 36, 100, 95, 70, 72, 17, 84, 41, 16, 66, 40, 85, 97, 29, 91, 64, 81, 62, 27, 8, 37, 28, 98, 36, 70, 40, 14, 14, 76, 69, 6, 64, 21, 52, 85, 92, 68, 68, 33, 36, 85, 72, 20, 33, 100, 62, 97, 33, 23, 75, 40, 11, 3, 89, 46, 24, 28, 60, 90, 56, 28, 95, 71, 48, 46, 55, 92, 66, 74, 24, 1, 10, 47, 72, 42, 47, 34, 90, 31, 56, 65, 70, 19, 19, 10, 64, 42, 37, 23, 83, 44, 3, 77, 14, 2, 75, 20, 93, 92, 93, 68, 92, 2, 15, 63, 96, 13, 48, 85, 43, 56, 1, 64, 74, 19, 73, 37, 13, 61, 12, 95, 5, 66, 24, 18, 19, 50, 38, 12, 41, 82, 31, 84, 84, 45, 98, 79, 57, 46, 15, 99, 1, 16, 62, 26, 86, 86, 14, 50, 47, 25, 97, 51, 42, 20, 68, 61, 21, 57, 24, 61, 39, 54, 44, 74, 99, 41, 4, 7, 38, 18, 58, 38, 85, 71, 63, 71, 57, 77, 72, 3, 53, 68, 5, 95, 39, 72, 7, 59, 81, 30, 71, 19, 35, 66, 44, 33, 7, 47, 92, 96, 16, 49, 34, 1, 19, 48, 23, 75, 76, 94, 29, 29, 62, 33, 75, 100, 57, 33, 11, 37, 62, 81, 7, 96, 99, 50, 81, 57, 48, 24, 52, 63, 72, 85, 63, 42, 85, 85, 69, 60, 79, 97, 40, 92, 30, 66, 43, 38, 98, 5, 74, 11, 38, 32, 59, 36, 33, 91, 92, 80, 14, 43, 42, 85, 80, 5, 78, 64, 41, 46, 75, 71, 43, 67, 62, 24, 32, 57, 61, 30, 61, 86, 92, 98, 17, 50, 33, 49, 40, 24, 28, 53, 19, 21, 89, 98, 25, 67, 13, 18, 12, 87, 88, 6, 53, 2, 29, 37, 58, 41, 66, 18, 26, 57, 68, 94, 59, 100, 94, 98, 76, 21, 3, 94, 94, 91, 91, 70, 9, 3, 87, 21, 41, 75, 26, 46, 28, 7, 82, 85, 47, 99, 54, 73, 7, 21, 18, 65, 21, 12, 15, 96, 84, 17, 89, 77, 59, 31, 47, 68, 85, 33, 40, 25, 59, 17, 22, 86, 23, 55, 22, 22, 5, 76, 94, 12, 96, 11, 28, 68, 74, 42, 15, 58, 10, 55, 34, 69, 37, 80, 88, 21, 65, 27, 98, 23, 95, 71, 9, 70, 26, 82, 91, 30, 57, 84, 93, 5, 46, 21, 24, 20, 62, 91, 29, 24, 97, 62, 92, 34, 94, 31, 54, 58, 57, 3, 80, 3, 74, 40, 72, 51, 22, 62, 80, 30, 97, 73, 34, 43, 45, 10, 14, 6, 100, 42, 81, 96, 55, 72, 81, 48, 2, 35, 5, 10, 89, 37, 13, 62, 76, 84, 12, 49, 98, 44, 79, 94, 68, 64, 88, 12, 73, 53, 69, 24, 46, 50, 72, 1, 73, 52, 48, 75, 38, 53, 36, 79, 89, 100, 40, 16, 36, 4, 65, 33, 99, 95, 26, 66, 10, 66, 77, 35, 18, 97, 58, 64, 46, 81, 64, 19, 85, 63, 45, 22, 67, 32, 100, 7, 32, 92, 23, 67, 47, 39, 51, 45, 85, 28, 62, 94, 93, 90, 28, 63, 86, 38, 26, 32, 18, 41, 2, 2, 3, 46, 76, 70, 77, 27, 76, 60, 70, 50, 78, 16, 40, 28, 12, 24, 8, 73, 18, 52, 62, 97, 14, 48, 34, 91, 31, 4, 31, 32, 5, 86, 77, 32, 7, 5, 59, 34, 65, 28, 84, 94, 96, 75, 22, 7, 99, 81, 32, 68, 32, 93, 64, 98, 92, 98, 88, 22, 1, 71, 53, 57, 8, 81, 41, 14, 38, 51, 47, 2, 30, 82, 95, 25, 57, 68, 84, 7, 100, 15, 74, 32, 7, 37, 29, 99, 86, 68, 72, 38, 90, 25, 95, 97, 57, 35, 10, 94, 37, 9, 47, 66, 42, 94, 91, 50, 13, 74, 56, 13, 88, 81, 44, 46, 70, 24, 96, 55, 43, 68, 93, 33, 44, 39, 29, 100, 25, 91, 46, 61, 51, 92, 26, 92, 37, 68, 94, 50, 41, 1, 62, 80, 82, 57, 78, 51, 32, 73, 57, 74, 40, 49, 58, 83, 87, 87, 35, 11, 29, 80, 23, 79, 23, 49, 70, 60, 16, 15, 61, 9, 16, 22, 88, 97, 78, 17, 99, 61, 90, 55, 34, 81, 56, 44, 16, 42, 30, 50, 5, 58, 81, 27, 88, 55, 27, 57, 66, 43, 72, 26, 51, 39, 47, 90, 35, 76, 7, 85, 88, 48, 39, 74, 28, 46, 17, 43, 40, 98, 44, 96, 55, 76, 22, 94, 31, 1, 2, 96, 43, 73, 74, 45, 63, 72, 86, 97, 100, 44, 33, 87, 91, 24, 60, 71, 69, 76, 13, 8, 73, 9, 3, 79, 84, 77, 72, 14, 77, 74, 62, 71, 98, 35, 67, 61, 58, 4, 9, 57, 100, 94, 44, 42, 17, 55, 12, 37, 31, 77, 45, 55, 85, 99, 86, 68, 27, 57, 34, 55, 82, 47, 77, 32, 33, 95, 44, 90, 99, 52, 47, 98, 97, 42, 39, 13, 96, 3, 50, 78, 79, 46, 33, 15, 96, 18, 82, 75, 26, 67, 29, 8, 13, 58, 91, 45, 52, 34, 35, 50, 37, 33, 99, 34, 74, 38, 98, 69, 92, 47, 47, 70, 44, 31, 84, 92, 48, 17, 66, 73, 36, 94, 32, 48, 51, 22, 93, 55, 7, 79, 4, 44, 11, 3, 77, 84, 92, 74, 52, 35, 73, 50, 4, 68, 80, 39, 59, 79, 7, 24, 4, 42, 70, 35, 42, 72, 9, 34, 26, 15, 12, 30, 10, 22, 84, 86, 57, 27, 12, 60, 61, 84, 10, 16, 51, 41, 6, 62, 20, 12, 85, 23, 6, 54, 9, 47, 26, 17, 32, 51, 84, 95, 32, 93, 16, 67, 31, 24, 93, 42, 83, 53, 77, 92, 20, 79, 33, 25, 40, 52, 89, 77, 26, 94, 30, 34, 92, 7, 51, 23, 10, 86, 17, 41, 30, 84, 60, 60, 7, 52, 53, 41, 57, 81, 33, 76, 12, 17, 53, 51, 20, 41, 27, 45, 86, 9, 78, 77, 67, 80, 51, 76, 17, 19, 69, 47, 2, 28, 58, 60, 79, 11, 100, 87, 43, 84, 63, 54, 52, 67, 57, 23, 7, 83, 67, 92, 43, 97, 20, 10, 28, 70, 85, 45, 88, 53, 43, 41, 32, 100, 52, 11, 62, 3, 97, 5, 87, 11, 58, 90, 77, 14, 13, 35, 49, 31, 78, 91, 79, 97, 52, 59, 66, 89, 3, 5, 41, 45, 97, 73, 96, 48, 35, 58, 51, 83, 62, 89, 46, 71, 30, 74, 37, 42, 61, 85, 25, 38, 27, 55, 35, 79, 13, 52, 67, 67, 57, 59, 63, 5, 83, 59, 53, 69, 68, 55, 4, 29, 43, 49, 51, 72, 74, 87, 66, 34, 71, 42, 72, 50, 96, 58, 28, 61, 9, 46, 27, 17, 56, 90, 22, 91, 100, 26, 59, 67, 80, 62, 47, 22, 62, 97, 45, 88, 84, 10, 21, 6, 3, 44, 55, 51, 1, 34, 11, 10, 79, 37, 26, 87, 78, 99, 77, 77, 24, 35, 95, 3, 49, 41, 76, 10, 38, 21, 97, 21, 82, 70, 78, 85, 13, 33, 35, 14, 66, 97, 75, 97, 33, 52, 83, 63, 51, 59, 91, 26, 45, 86, 29, 93, 26, 56, 55, 63, 76, 3, 35, 10, 24, 13, 46, 37, 97, 32, 2, 14, 28, 28, 10, 12, 79, 44, 74, 81, 2, 65, 7, 99, 50, 87, 91, 27, 42, 97, 90, 70, 52, 76, 79, 75, 40, 24, 63, 36, 55, 16, 2, 34, 43, 11, 45, 22, 55, 19, 2, 8, 35, 8, 6, 36, 46, 49, 62, 88, 97, 3, 57, 48, 79, 87, 23, 70, 10, 37, 58, 16, 53, 59, 49, 95, 69, 45, 16, 75, 15, 70, 83, 49, 29, 40, 84, 75, 88, 98, 14, 85, 100, 22, 84, 30, 8, 58, 100, 17, 95, 9, 84, 47, 67, 84, 93, 87, 28, 61, 62, 43, 30, 96, 91, 10, 35, 27, 84, 75, 24, 49, 11, 75, 70, 94, 5, 77, 52, 4, 45, 98, 64, 28, 96, 30, 63, 88, 16, 91, 48, 29, 33, 29, 76, 75, 39, 63, 53, 74, 37, 28, 23, 47, 3, 92, 92, 7, 21, 43, 62, 65, 92, 25, 45, 87, 6, 7, 75, 73, 97, 74, 2, 81, 55, 29, 8, 45, 91, 60, 70, 27, 88, 92, 25, 42, 36, 69, 48, 8, 11, 61, 72, 55, 37, 68, 41, 42, 75, 67, 14, 23, 93, 67, 4, 47, 96, 11, 43, 86, 22, 12, 65, 61, 56, 41, 2, 43, 9, 49, 50, 72, 61, 73, 26, 97, 41, 18, 38, 67, 85, 4, 89, 77, 70, 44, 75, 17, 6, 17, 55, 28, 28, 71, 88, 83, 63, 42, 25, 72, 90, 26, 95, 3, 99, 72, 99, 91, 89, 89, 57, 25, 44, 97, 1, 65, 41, 27, 82, 46, 43, 88, 25, 71, 58, 65, 5, 20, 6, 82, 43, 47, 7, 89, 49, 5, 60, 100, 47, 1, 40, 3, 77, 83, 100, 78, 99, 92, 56, 32, 37, 99, 19, 14, 21, 76, 78, 25, 96, 83, 6, 90, 81, 65, 79, 30, 21, 38, 81, 68, 90, 20, 70, 67, 54, 21, 96, 4, 12, 51, 36, 1, 1, 54, 14, 21, 30, 91, 98, 77, 25, 3, 18, 5, 19, 96, 86, 40, 86, 18, 7, 75, 89, 76, 93, 94, 49, 88, 98, 60, 91, 33, 60, 91, 38, 73, 64, 67, 15, 61, 95, 91, 15, 13, 48, 34, 60, 33, 73, 45, 3, 79, 72, 91, 6, 64, 85, 6, 4, 82, 66, 94, 66, 77, 36, 3, 50, 99, 22, 16, 11, 68, 7, 78, 80, 6, 11, 40, 90, 35, 36, 92, 65, 7, 83, 22, 71, 67, 28, 74, 100, 93, 19, 65, 69, 6, 67, 70, 57, 40, 38, 67, 8, 96, 44, 87, 1, 6, 78, 90, 40, 14, 82, 4, 72, 64, 26, 42, 82, 53, 67, 81, 97, 85, 45, 17, 91, 63, 87, 47, 55, 24, 65, 62, 19, 9, 100, 71, 14, 78, 60, 6, 43, 41, 9, 14, 56, 86, 8, 37, 90, 74, 69, 86, 11, 13, 3, 1, 28, 41, 99, 82, 16, 63, 43, 86, 23, 94, 56, 89, 23, 15, 94, 17, 8, 54, 31, 63, 40, 90, 52, 81, 63, 20, 19, 73, 85, 73, 25, 64, 13, 75, 45, 28, 90, 39, 65, 12, 84, 20, 100, 7, 86, 45, 23, 93, 99, 5, 8, 90, 94, 59, 22, 9, 30, 40, 33, 14, 12, 10, 77, 76, 84, 73, 55, 73, 63, 19, 37, 47, 38, 88, 53, 24, 33, 27, 68, 83, 32, 75, 24, 25, 85, 45, 85, 15, 85, 18, 28, 48, 27, 57, 24, 10, 29, 78, 35, 44, 97, 71, 42, 86, 10, 46, 9, 94, 72, 29, 76, 3, 3, 51, 80, 88, 96, 64, 2, 32, 33, 81, 79, 59, 89, 2, 69, 18, 32, 55, 13, 28, 77, 54, 13, 86, 99, 74, 80, 22, 2, 7, 77, 56, 58, 56, 95, 5, 71, 48, 36, 4, 29, 14, 62, 17, 68, 82, 86, 99, 88, 50, 78, 64, 3, 42, 2, 53, 67, 33, 27, 68, 39, 3, 76, 48, 10, 70, 52, 32, 18, 39, 35, 46, 5, 49, 14, 72, 82, 52, 22, 70, 1, 51, 85, 56, 92, 86, 60, 59, 18, 86, 78, 9, 40, 53, 8, 49, 23, 60, 81, 92, 50, 67, 37, 54, 67, 2, 77, 49, 5, 98, 70, 6, 48, 6, 13, 92, 44, 72, 50, 61, 10, 79, 21, 49, 32, 29, 50, 6, 40, 30, 97, 89, 48, 85, 43, 15, 38, 19, 15, 43, 69, 36, 48, 68, 41, 60, 59, 84, 83, 60, 97, 44, 39, 17, 93, 22, 97, 42, 27, 36, 23, 75, 25, 70, 59, 19, 36, 96, 37, 50, 38, 57, 85, 37, 25, 78, 48, 83, 61, 83, 95, 9, 26, 33, 26, 70, 6, 74, 63, 32, 10, 85, 58, 86, 7, 16, 4, 94, 63, 40, 44, 53, 49, 80, 41, 73, 57, 89, 7, 70, 23, 1, 78, 48, 85, 55, 18, 90, 29, 80, 73, 90, 17, 30, 75, 75, 97, 78, 68, 60, 69, 63, 64, 17, 95, 4, 89, 3, 44, 48, 72, 66, 100, 2, 14, 85, 8, 83, 26, 36, 14, 99, 77, 82, 80, 51, 56, 77, 80, 76, 88, 49, 90, 51, 17, 84, 6, 58, 87, 50, 5, 10, 15, 4, 63, 80, 40, 71, 62, 66, 58, 76, 16, 35, 57, 95, 37, 65, 23, 17, 92, 10, 65, 81, 12, 33, 17, 70, 90, 55, 19, 94, 16, 33, 50, 79, 13, 89, 49, 26, 6, 58, 53, 21, 92, 10, 68, 29, 26, 90, 97, 17, 52, 13, 49, 15, 45, 65, 84, 35, 19, 54, 80, 35, 87, 29, 13, 51, 18, 13, 28, 23, 70, 81, 96, 14, 42, 63, 94, 67, 4, 90, 35, 7, 54, 83, 74, 98, 48, 57, 84, 18, 11, 64, 52, 49, 92, 16, 51, 61, 80, 30, 36, 2, 10, 31, 67, 51, 45, 60, 69, 100, 1, 3, 7, 54, 38, 80, 3, 85, 88, 87, 54, 50, 2, 58, 50, 45, 25, 52, 6, 5, 82, 93, 58, 91, 23, 24, 94, 19, 83, 14, 18, 35, 17, 24, 40, 6, 55, 42, 42, 95, 80, 95, 96, 33, 52, 46, 78, 77, 49, 35, 33, 30, 27, 90, 73, 1, 13, 18, 19, 47, 31, 36, 81, 99, 60, 20, 4, 66, 13, 45, 60, 45, 40, 8, 77, 43, 53, 6, 71, 53, 40, 3, 83, 18, 92, 7, 18, 56, 24, 36, 2, 54, 72, 82, 53, 83, 53, 8, 48, 18, 53, 60, 62, 44, 67, 90, 38, 71, 48, 9, 23, 39, 11, 57, 57, 55, 63, 74, 10, 38, 62, 12, 44, 33, 45, 48, 67, 98, 55, 66, 15, 59, 25, 28, 2, 43, 69, 40, 65, 16, 48, 40, 7, 10, 48, 63, 64, 63, 88, 74, 100, 49, 85, 43, 33, 81, 90, 99, 78, 97, 65, 44, 55, 41, 23, 9, 36, 92, 100, 52, 59, 99, 91, 65, 8, 91, 79, 72, 53, 19, 97, 4, 67, 33, 99, 52, 13, 40, 50, 91, 36, 66, 86, 43, 7, 61, 51, 94, 4, 50, 45, 62, 48, 88, 79, 7, 78, 9, 78, 82, 27, 26, 37, 46, 58, 35, 97, 71, 75, 98, 13, 62, 64, 50, 4, 70, 10, 54, 15, 13, 55, 59, 27, 54, 98, 5, 61, 75, 65, 90, 8, 92, 16, 45, 89, 73, 79, 85, 95, 5, 82, 7, 67, 45, 57, 22, 66, 18, 28, 80, 31, 82, 91, 57, 36, 88, 13, 96, 15, 77, 85, 22, 20, 52, 18, 8, 25, 49, 92, 19, 53, 26, 78, 71, 22, 86, 45, 88, 3, 72, 19, 85, 5, 9, 41, 40, 49, 53, 87, 63, 82, 24, 36, 53, 75, 54, 61, 51, 2, 4, 70, 6, 81, 99, 29, 3, 36, 73, 90, 38, 44, 60, 23, 48, 21, 15, 40, 69, 20, 78, 83, 53, 1, 70, 5, 28, 75, 65, 78, 28, 21, 99, 34, 1, 97, 62, 3, 84, 86, 44, 22, 81, 56, 96, 80, 76, 62, 19, 96, 81, 49, 78, 85, 1, 99, 90, 28, 74, 6, 6, 1, 26, 4, 86, 79, 53, 99, 81, 36, 84, 77, 9, 64, 32, 56, 44, 7, 70, 14, 54, 2, 14, 83, 87, 15, 81, 76, 42, 54, 81, 99, 7, 7, 55, 92, 85, 7, 91, 17, 94, 74, 93, 55, 90, 76, 62, 85, 34, 31, 50, 87, 33, 64, 69, 19, 78, 50, 46, 71, 55, 26, 70, 61, 84, 24, 53, 20, 82, 43, 89, 27, 68, 33, 81, 57, 9, 95, 41, 42, 77, 91, 81, 9, 6, 49, 79, 83, 50, 76, 53, 5, 2, 74, 17, 37, 97, 69, 57, 78, 63, 97, 57, 83, 29, 89, 39, 37, 83, 32, 31, 60, 74, 11, 20, 31, 11, 51, 13, 13, 26, 17, 69, 79, 43, 85, 16, 39, 6, 24, 69, 20, 20, 25, 2, 48, 13, 93, 37, 48, 76, 19, 59, 1, 81, 78, 31, 91, 80, 95, 3, 6, 63, 23, 84, 5, 8, 51, 44, 13, 74, 64, 84, 45, 40, 86, 93, 52, 78, 81, 51, 5, 99, 9, 5, 79, 87, 35, 21, 18, 29, 76, 23, 91, 98, 59, 96, 5, 61, 91, 69, 35, 6, 53, 79, 45, 90, 23, 48, 67, 55, 99, 71, 53, 7, 75, 31, 45, 61, 4, 63, 89, 79, 37, 31, 76, 47, 78, 33, 8, 20, 1, 94, 25, 5, 24, 21, 94, 47, 69, 12, 53, 19, 82, 6, 25, 8, 88, 22, 20, 91, 36, 60, 69, 24, 43, 97, 71, 20, 29, 30, 92, 81, 23, 68, 86, 46, 89, 79, 44, 9, 91, 97, 27, 24, 2, 3, 84, 41, 24, 55, 32, 11, 15, 52, 35, 57, 48, 57, 28, 76, 86, 19, 57, 8, 87, 94, 5, 27, 72, 49, 87, 14, 45, 13, 90, 98, 67, 25, 90, 43, 79, 21, 53, 93, 73, 39, 49, 72, 95, 29, 48, 80, 47, 56, 39, 85, 49, 44, 63, 72, 92, 49, 38, 88, 13, 27, 37, 80, 51, 26, 22, 29, 99, 74, 74, 23, 13, 74, 94, 59, 2, 41, 39, 1, 48, 77, 85, 48, 20, 100, 20, 63, 48, 9, 50, 13, 35, 38, 92, 37, 64, 13, 17, 14, 38, 90, 36, 2, 16, 29, 61, 17, 22, 99, 17, 69, 27, 54, 69, 99, 53, 88, 61, 52, 48, 63, 64, 82, 100, 7, 70, 15, 19, 38, 28, 9, 28, 63, 10, 95, 44, 70, 63, 65, 20, 32, 85, 47, 85, 53, 97, 89, 92, 57, 92, 39, 19, 8, 72, 71, 14, 41, 85, 85, 79, 65, 93, 58, 79, 2, 52, 22, 24, 66, 86, 43, 97, 71, 41, 81, 23, 37, 21, 67, 46, 13, 5, 64, 72, 77, 86, 85, 69, 71, 69, 99, 87, 13, 56, 65, 15, 59, 87, 90, 25, 72, 84, 21, 94, 25, 54, 69, 13, 26, 35, 58, 90, 39, 74, 61, 67, 59, 98, 36, 81, 66, 34, 67, 79, 42, 84, 45, 52, 70, 34, 28, 41, 69, 49, 87, 93, 54, 55, 58, 79, 89, 67, 21, 79, 92, 81, 46, 3, 78, 33, 35, 96, 18, 54, 26, 11, 37, 22, 63, 6, 7, 90, 98, 75, 90, 84, 20, 95, 38, 77, 26, 78, 95, 46, 57, 87, 26, 54, 89, 56, 38, 23, 51, 7, 28, 76, 18, 64, 97, 32, 69, 55, 73, 67, 29, 15, 2, 48, 9, 92, 24, 34, 69, 19, 79, 77, 57, 57, 82, 97, 12, 71, 71, 14, 78, 99, 41, 47, 62, 89, 30, 31, 43, 2, 49, 71, 16, 50, 19, 25, 93, 94, 10, 62, 64, 41, 90, 20, 97, 72, 16, 60, 42, 87, 25, 71, 85, 65, 69, 98, 53, 98, 28, 95, 52, 28, 17, 67, 30, 35, 43, 22, 81, 53, 35, 44, 45, 25, 16, 41, 96, 31, 52, 89, 69, 76, 12, 5, 92, 32, 3, 44, 30, 82, 90, 81, 10, 58, 99, 39, 45, 42, 12, 25, 46, 47, 68, 90, 71, 83, 82, 18, 66, 85, 58, 34, 12, 69, 39, 3, 1, 93, 46, 82, 74, 87, 14, 83, 44, 12, 73, 88, 5, 85, 64, 50, 83, 32, 91, 53, 66, 24, 22, 83, 8, 79, 69, 19, 100, 59, 73, 52, 51, 18, 33, 24, 56, 46, 7, 52, 9, 31, 39, 14, 15, 3, 15, 49, 86, 58, 1, 3, 81, 22, 38, 41, 53, 6, 11, 52, 64, 84, 3, 14, 53, 87, 37, 61, 84, 95, 12, 92, 26, 2, 57, 92, 56, 24, 41, 93, 81, 93, 96, 13, 67, 85, 5, 19, 90, 16, 70, 5, 51, 24, 18, 55, 10, 6, 15, 45, 53, 26, 88, 30, 80, 97, 73, 35, 20, 65, 28, 52, 58, 75, 64, 24, 59, 21, 42, 48, 88, 63, 4, 38, 38, 21, 92, 99, 78, 59, 43, 82, 36, 82, 63, 15, 78, 36, 50, 97, 100, 77, 100, 57, 3, 16, 32, 61, 36, 25, 60, 23, 39, 63, 12, 76, 35, 55, 74, 64, 13, 68, 46, 49, 50, 8, 63, 27, 43, 64, 76, 95, 92, 27, 51, 94, 42, 35, 54, 77, 59, 13, 51, 98, 75, 62, 25, 9, 17, 99, 25, 29, 18, 70, 29, 19, 29, 44, 46, 72, 7, 73, 18, 99, 99, 68, 44, 41, 54, 98, 69, 13, 62, 72, 62, 89, 33, 86, 49, 1, 36, 73, 82, 54, 94, 10, 72, 23, 5, 69, 46, 12, 93, 63, 62, 44, 82, 5, 36, 36, 54, 4, 48, 68, 75, 61, 8, 60, 46, 56, 60, 82, 81, 93, 87, 74, 55, 10, 96, 59, 31, 41, 22, 23, 3, 83, 66, 85, 40, 1, 20, 45, 57, 19, 64, 83, 79, 71, 94, 76, 27, 6, 9, 7, 98, 95, 80, 52, 57, 28, 63, 87, 68, 84, 61, 23, 19, 79, 59, 58, 79, 30, 54, 87, 100, 18, 22, 78, 88, 67, 5, 66, 72, 14, 24, 22, 60, 56, 25, 16, 83, 87, 54, 2, 71, 15, 76, 89, 93, 34, 98, 23, 63, 3, 62, 62, 20, 35, 91, 60, 1, 96, 25, 25, 61, 49, 46, 20, 4, 22, 88, 38, 9, 41, 39, 31, 7, 15, 71, 51, 100, 20, 74, 15, 22, 87, 76, 94, 21, 19, 53, 21, 66, 29, 45, 26, 29, 42, 45, 84, 64, 84, 73, 24, 25, 12, 6, 83, 78, 28, 34, 29, 47, 7, 43, 20, 93, 71, 65, 65, 89, 69, 85, 54, 50, 82, 79, 78, 75, 75, 14, 38, 59, 86, 13, 35, 49, 70, 17, 78, 97, 50, 7, 95, 8, 49, 15, 52, 19, 31, 16, 59, 100, 53, 12, 49, 34, 42, 78, 60, 17, 91, 50, 27, 77, 62, 61, 25, 32, 77, 3, 28, 79, 9, 75, 86, 9, 41, 38, 80, 71, 5, 38, 22, 57, 2, 70, 42, 43, 48, 2, 11, 90, 51, 37, 66, 64, 97, 43, 95, 26, 45, 75, 4, 5, 49, 41, 65, 89, 30, 44, 59, 35, 82, 81, 91, 35, 2, 85, 77, 1, 86, 88, 91, 88, 76, 8, 51, 25, 50, 46, 50, 46, 72, 5, 2, 20, 45, 67, 60, 75, 10, 70, 61, 43, 2, 3, 77, 4, 87, 6, 56, 72, 45, 98, 59, 20, 6, 62, 44, 7, 7, 45, 53, 78, 49, 54, 49, 46, 72, 8, 20, 82, 29, 32, 76, 31, 34, 5, 86, 21, 10, 41, 44, 54, 39, 55, 25, 96, 16, 69, 2, 74, 65, 54, 3, 14, 60, 51, 59, 31, 10, 30, 64, 90, 61, 40, 20, 94, 96, 5, 66, 5, 98, 62, 10, 36, 16, 34, 83, 83, 54, 84, 56, 19, 90, 10, 84, 49, 12, 42, 31, 21, 23, 47, 62, 83, 86, 82, 28, 33, 38, 46, 37, 35, 7, 98, 22, 74, 31, 56, 56, 37, 40, 63, 7, 29, 72, 90, 29, 83, 83, 59, 55, 5, 5, 16, 39, 42, 49, 66, 74, 87, 63, 62, 73, 69, 59, 47, 94, 42, 2, 49, 78, 93, 63, 84, 21, 34, 25, 49, 16, 7, 60, 22, 11, 64, 38, 49, 58, 86, 66, 31, 24, 29, 45, 49, 49, 3, 47, 95, 96, 48, 43, 73, 41, 58, 8, 13, 91, 32, 62, 59, 38, 21, 80, 100, 36, 69, 48, 93, 7, 66, 76, 82, 46, 72, 30, 46, 74, 76, 40, 70, 76, 83, 94, 68, 40, 54, 32, 82, 85, 93, 40, 75, 65, 72, 74, 53, 92, 22, 97, 98, 87, 72, 80, 84, 43, 61, 29, 69, 89, 69, 90, 16, 3, 35, 35, 94, 88, 66, 75, 73, 11, 67, 99, 75, 90, 72, 79, 81, 93, 76, 31, 31, 99, 62, 14, 94, 22, 43, 14, 62, 63, 3, 77, 65, 89, 63, 58, 77, 29, 32, 1, 39, 50, 99, 65, 39, 70, 44, 72, 15, 19, 2, 97, 17, 63, 63, 62, 36, 5, 75, 50, 19, 77, 78, 83, 18, 41, 40, 94, 69, 23, 94, 7, 25, 44, 71, 63, 13, 66, 86, 79, 84, 87, 76, 53, 1, 38, 14, 89, 94, 89, 38, 12, 17, 15, 46, 34, 7, 85, 79, 75, 59, 24, 33, 83, 67, 56, 98, 32, 21, 83, 62, 57, 70, 37, 9, 22, 26, 74, 10, 19, 14, 99, 82, 31, 14, 27, 16, 72, 63, 47, 47, 22, 70, 31, 4, 89, 86, 1, 20, 7, 84, 81, 15, 5, 70, 23, 26, 95, 48, 36, 66, 62, 86, 47, 44, 99, 26, 11, 71, 88, 57, 69, 9, 27, 99, 65, 15, 37, 17, 86, 95, 100, 18, 9, 56, 39, 83, 82, 34, 30, 69, 51, 91, 54, 49, 86, 5, 74, 97, 27, 62, 53, 47, 22, 31, 97, 86, 45, 33, 55, 82, 27, 54, 52, 35, 62, 90, 69, 95, 75, 99, 15, 25, 41, 20, 74, 27, 24, 47, 75, 2, 60, 27, 48, 34, 10, 45, 71, 54, 29, 25, 88, 56, 31, 39, 42, 92, 28, 11, 86, 3, 61, 100, 79, 1, 19, 52, 79, 95, 51, 53, 96, 62, 32, 96, 95, 41, 92, 66, 46, 20, 42, 85, 27, 72, 23, 69, 63, 3, 31, 100, 5, 91, 99, 83, 91, 70, 87, 22, 16, 89, 26, 63, 50, 57, 58, 45, 49, 1, 62, 47, 73, 3, 31, 99, 27, 6, 19, 89, 8, 49, 89, 64, 39, 39, 98, 82, 60, 84, 55, 75, 72, 80, 38, 74, 89, 47, 70, 37, 48, 83, 35, 20, 85, 66, 70, 11, 71, 89, 52, 30, 37, 92, 93, 28, 82, 90, 9, 42, 26, 63, 68, 49, 94, 57, 74, 82, 4, 43, 71, 3, 25, 5, 74, 62, 22, 43, 24, 92, 31, 75, 73, 68, 18, 65, 95, 100, 7, 55, 93, 84, 69, 12, 84, 14, 69, 58, 96, 72, 100, 66, 74, 77, 22, 47, 38, 44, 41, 61, 87, 72, 36, 60, 91, 5, 24, 85, 4, 82, 91, 48, 17, 11, 60, 1, 24, 28, 58, 71, 51, 9, 36, 76, 85, 58, 74, 22, 1, 14, 35, 87, 85, 22, 98, 75, 26, 22, 11, 82, 55, 53, 29, 72, 63, 40, 24, 39, 67, 81, 9, 17, 41, 97, 92, 78, 6, 65, 99, 58, 79, 33, 44, 15, 6, 94, 90, 32, 15, 52, 13, 21, 5, 93, 44, 19, 33, 67, 57, 51, 99, 18, 68, 40, 14, 11, 17, 19, 28, 67, 76, 58, 52, 71, 24, 57, 64, 13, 40, 30, 17, 52, 3, 21, 45, 46, 39, 29, 13, 48, 79, 11, 65, 98, 2, 30, 9, 18, 48, 88, 37, 75, 97, 40, 45, 20, 96, 61, 85, 36, 42, 1, 39, 44, 21, 35, 90, 11, 63, 2, 10, 42, 64, 74, 39, 66, 3, 99, 35, 2, 38, 71, 76, 34, 10, 73, 6, 58, 33, 90, 45, 74, 42, 83, 70, 62, 18, 59, 24, 32, 12, 34, 25, 75, 59, 16, 40, 14, 66, 75, 15, 4, 97, 43, 89, 59, 67, 94, 16, 51, 35, 60, 76, 76, 94, 45, 89, 63, 3, 65, 95, 14, 50, 19, 89, 8, 34, 80, 73, 100, 54, 40, 55, 3, 82, 95, 61, 100, 41, 76, 50, 75, 87, 25, 3, 80, 70, 43, 43, 24, 7, 89, 38, 56, 59, 78, 64, 93, 57, 88, 44, 63, 27, 50, 65, 60, 44, 25, 59, 84, 52, 8, 59, 90, 33, 13, 69, 54, 55, 63, 77, 62, 3, 66, 17, 62, 43, 32, 6, 52, 72, 49, 14, 98, 98, 30, 58, 41, 54, 16, 77, 57, 24, 35, 46, 8, 99, 66, 13, 53, 81, 89, 66, 35, 7, 83, 96, 49, 66, 1, 100, 37, 1, 65, 87, 98, 94, 44, 91, 99, 11, 67, 55, 34, 53, 52, 93, 51, 70, 57, 55, 2, 98, 21, 36, 4, 55, 32, 52, 72, 84, 4, 61, 85, 68, 47, 82, 62, 90, 24, 60, 100, 42, 67, 86, 94, 70, 30, 96, 39, 87, 51, 40, 84, 71, 76, 87, 25, 59, 90, 96, 42, 93, 56, 26, 61, 54, 60, 74, 43, 35, 33, 95, 77, 51, 32, 70, 21, 13, 66, 59, 51, 68, 51, 34, 38, 78, 72, 14, 36, 14, 61, 29, 6, 69, 7, 18, 22, 66, 43, 17, 52, 28, 11, 28, 78, 94, 50, 98, 6, 15, 9, 9, 34, 11, 94, 23, 88, 66, 36, 75, 31, 96, 3, 88, 64, 61, 6, 38, 26, 100, 54, 78, 27, 16, 57, 5, 9, 6, 54, 66, 72, 14, 74, 5, 24, 20, 27, 11, 37, 14, 37, 67, 10, 40, 54, 25, 100, 11, 62, 78, 11, 15, 7, 37, 30, 15, 41, 90, 21, 47, 8, 92, 60, 33, 49, 84, 52, 75, 46, 88, 89, 83, 54, 50, 74, 60, 26, 25, 70, 88, 54, 80, 54, 60, 69, 36, 27, 61, 77, 47, 7, 84, 90, 67, 69, 38, 2, 72, 65, 47, 60, 5, 29, 65, 6, 2, 76, 31, 27, 46, 18, 80, 77, 24, 92, 45, 59, 70, 58, 87, 16, 64, 71, 57, 82, 91, 47, 83, 62, 11, 82, 73, 67, 10, 38, 72, 64, 65, 2, 42, 10, 72, 73, 39, 47, 16, 35, 5, 85, 92, 91, 52, 56, 13, 9, 89, 55, 55, 72, 17, 17, 5, 89, 83, 14, 78, 54, 29, 43, 7, 70, 4, 30, 95, 42, 76, 10, 77, 32, 95, 20, 75, 98, 75, 39, 6, 64, 94, 12, 87, 10, 28, 91, 50, 62, 56, 80, 67, 85, 74, 26, 6, 29, 55, 100, 23, 31, 62, 51, 62, 8, 70, 36, 5, 97, 75, 11, 12, 20, 74, 50, 81, 54, 40, 30, 15, 47, 61, 82, 83, 86, 7, 41, 67, 13, 40, 89, 43, 1, 39, 57, 60, 60, 92, 65, 56, 18, 27, 19, 37, 100, 68, 17, 53, 59, 99, 20, 6, 11, 53, 40, 49, 11, 80, 15, 23, 20, 3, 66, 72, 93, 22, 32, 4, 65, 48, 60, 35, 74, 78, 23, 73, 98, 92, 78, 56, 42, 97, 61, 4, 49, 53, 52, 59, 32, 66, 33, 3, 20, 98, 27, 64, 71, 10, 68, 88, 57, 79, 74, 30, 56, 96, 54, 5, 39, 83, 61, 80, 31, 73, 36, 31, 25, 87, 89, 57, 5, 22, 59, 24, 71, 37, 40, 94, 46, 7, 81, 2, 85, 6, 83, 92, 1, 89, 97, 92, 71, 57, 23, 2, 29, 58, 32, 6, 45, 73, 62, 1, 46, 72, 24, 68, 9, 15, 61, 6, 21, 93, 8, 5, 98, 42, 49, 51, 30, 45, 42, 53, 53, 64, 6, 33, 74, 37, 38, 18, 61, 51, 18, 58, 23, 93, 26, 83, 8, 86, 88, 80, 31, 47, 37, 28, 89, 85, 30, 70, 81, 71, 22, 33, 87, 27, 65, 60, 16, 3, 29, 28, 53, 98, 86, 27, 42, 63, 9, 49, 48, 49, 81, 30, 95, 17, 58, 35, 1, 39, 57, 81, 62, 30, 65, 48, 9, 29, 59, 24, 31, 39, 3, 36, 36, 40, 62, 77, 2, 23, 78, 2, 71, 58, 31, 17, 74, 40, 4, 26, 79, 60, 58, 40, 41, 22, 39, 49, 2, 97, 24, 85, 35, 27, 20, 22, 66, 33, 98, 68, 55, 75, 69, 77, 84, 51, 46, 9, 91, 49, 86, 69, 60, 43, 60, 100, 16, 98, 49, 70, 46, 24, 54, 32, 50, 25, 53, 68, 57, 50, 87, 64, 77, 7, 40, 60, 57, 85, 21, 47, 85, 6, 67, 96, 1, 26, 48, 68, 75, 48, 37, 20, 71, 42, 51, 21, 66, 3, 40, 23, 5, 26, 38, 81, 32, 77, 92, 88, 14, 12, 87, 50, 18, 5, 46, 18, 31, 45, 37, 57, 92, 74, 77, 62, 15, 27, 34, 81, 82, 25, 55, 86, 50, 92, 18, 33, 20, 61, 73, 85, 73, 59, 35, 42, 15, 32, 11, 97, 76, 47, 54, 67, 72, 30, 80, 87, 8, 66, 19, 89, 90, 25, 26, 40, 68, 43, 24, 87, 56, 96, 72, 28, 6, 6, 21, 21, 89, 31, 17, 64, 29, 70, 82, 1, 99, 13, 39, 59, 78, 57, 47, 68, 33, 25, 59, 100, 19, 82, 86, 74, 30, 9, 1, 35, 66, 73, 55, 54, 3, 24, 17, 84, 93, 50, 84, 44, 63, 22, 2, 40, 30, 100, 59, 62, 24, 69, 61, 43, 3, 98, 16, 32, 7, 69, 66, 72, 41, 73, 26, 96, 96, 94, 79, 88, 96, 14, 83, 58, 35, 84, 49, 64, 84, 60, 77, 7, 28, 37, 1, 30, 34, 17, 61, 92, 85, 27, 64, 77, 51, 41, 72, 46, 34, 50, 85, 29, 63, 68, 38, 49, 3, 87, 64, 38, 46, 40, 97, 25, 28, 97, 55, 14, 13, 15, 5, 49, 93, 20, 26, 43, 60, 97, 40, 94, 99, 25, 74, 13, 44, 12, 62, 46, 50, 77, 84, 47, 69, 80, 71, 96, 28, 25, 61, 41, 92, 66, 41, 36, 85, 66, 79, 45, 63, 70, 90, 13, 94, 15, 25, 89, 26, 38, 35, 27, 15, 70, 73, 83, 1, 44, 30, 28, 68, 91, 20, 11, 8, 61, 47, 44, 26, 77, 40, 40, 46, 29, 52, 92, 96, 29, 80, 21, 66, 14, 48, 32, 35, 72, 14, 35, 15, 96, 15, 35, 86, 34, 45, 45, 94, 43, 88, 20, 19, 28, 11, 65, 8, 63, 8, 3, 43, 87, 76, 8, 53, 75, 40, 87, 46, 5, 74, 13, 52, 88, 47, 37, 21, 43, 33, 67, 38, 21, 38, 56, 100, 48, 72, 7, 62, 79, 62, 4, 18, 37, 64, 70, 63, 3, 8, 8, 59, 33, 72, 11, 20, 70, 99, 93, 13, 32, 59, 2, 4, 48, 57, 3, 95, 81, 61, 9, 11, 74, 12, 28, 62, 75, 49, 24, 29, 9, 84, 40, 41, 55, 50, 13, 25, 100, 5, 89, 83, 15, 90, 86, 62, 98, 40, 8, 78, 53, 16, 89, 26, 80, 68, 88, 6, 17, 63, 87, 25, 46, 26, 17, 53, 27, 29, 77, 26, 33, 17, 9, 99, 6, 46, 12, 3, 86, 20, 33, 90, 87, 21, 15, 18, 40, 54, 24, 8, 69, 10, 32, 66, 87, 49, 18, 13, 29, 46, 38, 62, 62, 98, 12, 19, 44, 24, 22, 81, 95, 6, 70, 33, 78, 36, 51, 17, 42, 26, 25, 10, 87, 8, 75, 73, 8, 45, 85, 37, 90, 74, 50, 4, 72, 61, 22, 67, 36, 95, 99, 82, 100, 20, 15, 77, 7, 17, 94, 48, 94, 70, 9, 80, 77, 36, 52, 85, 32, 88, 73, 21, 61, 22, 24, 84, 34, 98, 2, 70, 92, 100, 51, 92, 19, 17, 68, 26, 85, 13, 25, 78, 82, 86, 57, 59, 21, 60, 95, 52, 47, 67, 24, 60, 40, 100, 95, 73, 97, 97, 94, 40, 48, 97, 31, 67, 13, 51, 44, 98, 15, 20, 27, 97, 5, 84, 7, 77, 95, 53, 80, 94, 71, 56, 5, 10, 7, 99, 82, 3, 95, 28, 94, 43, 24, 25, 61, 36, 27, 56, 85, 41, 27, 12, 89, 84, 47, 47, 12, 41, 99, 92, 86, 69, 99, 90, 78, 5, 89, 12, 59, 35, 39, 52, 29, 62, 28, 89, 49, 54, 96, 86, 47, 75, 97, 87, 58, 43, 34, 69, 35, 32, 12, 21, 53, 10, 10, 30, 66, 50, 93, 24, 85, 83, 28, 13, 96, 55, 54, 45, 61, 1, 82, 59, 75, 78, 45, 32, 72, 78, 1, 58, 62, 64, 78, 14, 74, 40, 95, 91, 89, 40, 15, 25, 22, 42, 38, 18, 48, 43, 14, 8, 43, 95, 18, 18, 24, 63, 1, 47, 92, 53, 4, 53, 17, 34, 66, 42, 73, 13, 32, 13, 52, 98, 38, 25, 91, 75, 94, 39, 69, 7, 98, 11, 53, 16, 80, 28, 30, 81, 74, 21, 85, 78, 74, 1, 11, 91, 94, 35, 55, 26, 47, 6, 23, 84, 31, 14, 10, 76, 4, 78, 83, 1, 41, 87, 68, 20, 15, 97, 52, 40, 18, 37, 17, 43, 89, 79, 85, 83, 13, 40, 8, 60, 97, 82, 95, 79, 47, 5, 55, 2, 34, 89, 3, 74, 75, 22, 46, 41, 19, 97, 81, 88, 33, 49, 30, 74, 80, 66, 56, 92, 5, 15, 3, 54, 48, 50, 32, 47, 6, 86, 48, 39, 26, 50, 65, 53, 24, 10, 93, 42, 6, 25, 81, 91, 26, 62, 64, 5, 27, 71, 48, 84, 85, 3, 37, 84, 52, 20, 30, 57, 58, 78, 47, 83, 79, 11, 35, 2, 20, 28, 95, 26, 4, 75, 68, 29, 36, 83, 85, 15, 53, 85, 98, 89, 87, 86, 24, 90, 5, 54, 46, 62, 83, 44, 45, 61, 55, 79, 15, 26, 58, 61, 3, 14, 36, 70, 94, 23, 52, 79, 37, 56, 15, 86, 96, 1, 71, 20, 90, 76, 73, 87, 89, 55, 30, 33, 67, 36, 64, 33, 62, 73, 94, 64, 38, 81, 34, 32, 55, 37, 62, 44, 45, 76, 29, 40, 76, 52, 59, 17, 79, 83, 3, 67, 37, 84, 52, 56, 20, 67, 40, 81, 91, 85, 44, 29, 17, 77, 12, 72, 66, 25, 67, 10, 100, 95, 49, 27, 98, 8, 43, 28, 90, 97, 47, 79, 80, 50, 86, 99, 68, 77, 79, 58, 62, 23, 38, 78, 51, 49, 1, 68, 73, 67, 77, 24, 14, 78, 50, 11, 37, 44, 91, 78, 92, 37, 8, 24, 86, 93, 22, 53, 22, 53, 62, 83, 27, 100, 12, 29, 100, 13, 97, 25, 31, 73, 48, 44, 2, 50, 7, 38, 45, 97, 16, 37, 33, 23, 60, 70, 68, 33, 74, 89, 85, 35, 23, 63, 34, 34, 92, 86, 98, 88, 10, 29, 12, 57, 72, 66, 6, 78, 3, 51, 26, 18, 39, 58, 41, 50, 79, 60, 34, 52, 48, 19, 87, 70, 33, 72, 3, 24, 57, 53, 63, 66, 81, 27, 23, 52, 92, 80, 82, 94, 82, 7, 64, 72, 17, 56, 21, 47, 15, 55, 99, 62, 25, 37, 83, 9, 8, 37, 85, 17, 89, 47, 82, 21, 25, 56, 25, 68, 88, 6, 14, 69, 64, 77, 93, 32, 84, 65, 79, 98, 19, 29, 11, 95, 65, 45, 4, 72, 81, 88, 88, 22, 86, 22, 42, 63, 29, 66, 30, 16, 23, 95, 37, 87, 71, 29, 70, 6, 93, 48, 3, 64, 28, 65, 10, 92, 61, 65, 16, 42, 52, 55, 63, 90, 76, 56, 4, 5, 22, 33, 72, 44, 28, 8, 82, 50, 36, 52, 56, 81, 51, 10, 96, 79, 27, 5, 22, 87, 70, 37, 80, 73, 44, 94, 62, 19, 50, 17, 75, 71, 50, 99, 66, 29, 6, 48, 30, 94, 99, 37, 74, 1, 99, 69, 79, 77, 25, 53, 15, 94, 89, 95, 67, 32, 88, 80, 3, 89, 97, 29, 11, 98, 27, 77, 78, 85, 76, 59, 78, 26, 48, 3, 26, 46, 23, 57, 74, 47, 9, 88, 93, 49, 34, 59, 33, 22, 90, 35, 62, 38, 15, 73, 87, 42, 1, 64, 26, 76, 75, 55, 1, 22, 57, 78, 19, 31, 34, 92, 77, 94, 79, 69, 43, 65, 79, 75, 86, 21, 61, 99, 58, 75, 23, 45, 68, 23, 60, 45, 98, 34, 99, 50, 7, 7, 28, 25, 37, 13, 16, 66, 59, 47, 86, 1, 11, 17, 27, 48, 37, 87, 98, 94, 13, 21, 90, 81, 43, 50, 77, 93, 35, 28, 94, 42, 86, 73, 18, 23, 86, 86, 40, 96, 32, 25, 96, 94, 41, 22, 93, 29, 60, 90, 23, 72, 62, 64, 4, 5, 65, 81, 49, 100, 60, 42, 93, 45, 15, 10, 19, 52, 95, 10, 47, 78, 35, 94, 23, 27, 67, 15, 8, 26, 57, 82, 49, 18, 45, 53, 74, 10, 85, 74, 61, 96, 16, 53, 40, 82, 62, 59, 85, 9, 68, 83, 86, 54, 28, 9, 33, 94, 75, 40, 71, 83, 21, 19, 53, 17, 23, 78, 26, 7, 52, 86, 2, 19, 90, 94, 52, 52, 4, 36, 12, 23, 70, 97, 29, 49, 57, 13, 42, 84, 52, 12, 66, 24, 82, 18, 92, 5, 96, 18, 63, 47, 55, 17, 17, 45, 10, 68, 48, 65, 55, 59, 87, 24, 7, 15, 72, 16, 27, 65, 99, 30, 28, 64, 5, 9, 34, 97, 65, 81, 66, 80, 27, 72, 96, 95, 16, 57, 62, 15, 73, 16, 25, 59, 91, 84, 26, 62, 99, 4, 78, 49, 86, 5, 12, 42, 65, 97, 90, 82, 77, 55, 61, 55, 79, 8, 49, 46, 16, 10, 61, 88, 25, 37, 98, 15, 20, 23, 28, 70, 79, 5, 18, 16, 61, 82, 57, 78, 30, 47, 59, 7, 53, 71, 61, 31, 78, 10, 77, 93, 71, 89, 32, 48, 25, 29, 62, 97, 4, 42, 66, 82, 98, 36, 49, 59, 69, 5, 36, 98, 3, 46, 4, 56, 16, 17, 38, 93, 78, 14, 37, 100, 54, 68, 47, 79, 48, 61, 27, 51, 2, 44, 84, 99, 79, 32, 9, 99, 37, 96, 97, 91, 93, 52, 46, 8, 20, 36, 52, 97, 1, 40, 97, 55, 59, 43, 85, 7, 55, 11, 57, 56, 54, 93, 7, 85, 24, 67, 83, 12, 15, 31, 3, 7, 83, 100, 15, 54, 35, 18, 51, 36, 58, 99, 42, 16, 93, 26, 22, 48, 88, 31, 3, 41, 23, 61, 77, 46, 28, 12, 10, 94, 42, 12, 100, 76, 11, 14, 82, 98, 84, 32, 33, 41, 82, 74, 8, 74, 51, 82, 21, 38, 12, 76, 30, 86, 88, 59, 83, 67, 70, 92, 60, 63, 3, 60, 91, 66, 25, 72, 63, 8, 55, 47, 100, 36, 20, 8, 9, 22, 89, 82, 59, 100, 9, 40, 37, 96, 98, 19, 63, 67, 11, 74, 82, 65, 33, 24, 30, 10, 95, 44, 17, 1, 90, 17, 36, 61, 76, 96, 82, 64, 29, 92, 15, 37, 32, 51, 85, 29, 69, 99, 48, 31, 72, 81, 96, 57, 4, 77, 66, 50, 21, 34, 50, 10, 50, 85, 23, 77, 32, 4, 40, 61, 48, 6, 49, 79, 56, 33, 59, 77, 83, 58, 59, 55, 38, 54, 63, 41, 83, 28, 90, 55, 61, 39, 16, 63, 75, 38, 39, 59, 94, 31, 71, 41, 36, 19, 71, 44, 4, 29, 72, 86, 87, 30, 92, 24, 36, 54, 17, 18, 33, 6, 72, 94, 97, 87, 8, 23, 77, 46, 81, 70, 76, 51, 10, 64, 22, 80, 7, 25, 60, 78, 62, 46, 59, 6, 22, 94, 11, 38, 63, 44, 95, 34, 89, 43, 73, 96, 66, 49, 41, 46, 70, 69, 49, 79, 84, 70, 10, 42, 94, 21, 71, 7, 19, 29, 12, 40, 23, 23, 29, 85, 66, 75, 71, 54, 18, 95, 1, 83, 95, 93, 80, 64, 13, 28, 94, 96, 97, 55, 37, 42, 75, 7, 49, 93, 88, 60, 84, 10, 34, 12, 46, 51, 87, 68, 56, 56, 62, 56, 38, 56, 49, 17, 71, 61, 45, 64, 57, 93, 18, 45, 35, 45, 4, 83, 37, 91, 94, 73, 52, 80, 84, 97, 30, 22, 17, 38, 77, 30, 93, 66, 38, 41, 35, 8, 54, 31, 24, 62, 23, 93, 6, 57, 37, 9, 91, 26, 51, 37, 98, 2, 68, 33, 51, 49, 7, 67, 86, 35, 96, 79, 1, 33, 71, 35, 93, 24, 65, 16, 85, 39, 8, 43, 48, 97, 3, 90, 22, 54, 78, 19, 55, 45, 51, 57, 94, 57, 23, 31, 92, 71, 61, 44, 55, 32, 30, 99, 7, 46, 14, 44, 84, 74, 86, 31, 70, 88, 21, 91, 93, 50, 61, 48, 95, 11, 56, 40, 20, 31, 70, 63, 1, 31, 58, 7, 14, 87, 6, 20, 32, 71, 63, 67, 44, 100, 98, 13, 88, 70, 55, 80, 19, 15, 79, 65, 26, 87, 4, 97, 17, 26, 11, 69, 8, 68, 75, 21, 6, 32, 92, 37, 3, 7, 55, 98, 6, 4, 11, 45, 73, 65, 77, 44, 80, 7, 8, 57, 93, 64, 5, 9, 41, 15, 29, 48, 34, 56, 20, 39, 87, 11, 27, 41, 69, 81, 39, 75, 85, 1, 71, 9, 17, 99, 4, 48, 6, 12, 4, 50, 27, 60, 11, 67, 26, 39, 66, 59, 94, 85, 49, 33, 47, 75, 25, 16, 8, 63, 42, 44, 15, 64, 4, 32, 63, 8, 79, 20, 71, 35, 21, 97, 94, 31, 15, 72, 22, 80, 30, 67, 16, 79, 51, 62, 5, 76, 77, 64, 90, 70, 7, 5, 34, 11, 88, 48, 18, 18, 67, 40, 52, 39, 36, 98, 70, 2, 69, 43, 81, 50, 61, 96, 80, 12, 9, 85, 39, 38, 100, 28, 7, 59, 84, 92, 69, 71, 91, 38, 89, 57, 77, 92, 48, 64, 89, 69, 65, 9, 11, 97, 59, 23, 44, 90, 34, 4, 74, 72, 41, 26, 52, 100, 84, 35, 43, 4, 6, 34, 93, 46, 42, 21, 37, 89, 84, 78, 57, 100, 86, 19, 48, 96, 42, 91, 86, 75, 94, 11, 99, 87, 36, 2, 86, 19, 36, 28, 22, 93, 13, 14, 90, 55, 34, 27, 43, 69, 4, 100, 20, 41, 18, 67, 89, 11, 57, 74, 86, 3, 36, 36, 89, 72, 89, 26, 42, 76, 5, 16, 69, 18, 81, 10, 72, 67, 36, 66, 87, 91, 65, 7, 32, 35, 73, 72, 45, 82, 45, 82, 84, 32, 69, 24, 3, 9, 1, 97, 85, 5, 64, 5, 22, 44, 14, 45, 10, 2, 11, 97, 92, 27, 3, 75, 13, 27, 46, 10, 8, 42, 43, 43, 74, 64, 18, 28, 72, 18, 24, 56, 23, 87, 60, 96, 83, 74, 93, 92, 75, 3, 40, 18, 81, 94, 93, 46, 73, 90, 55, 32, 32, 49, 75, 5, 12, 44, 32, 84, 62, 8, 39, 36, 46, 51, 31, 28, 76, 75, 72, 2, 29, 63, 19, 10, 9, 63, 7, 81, 53, 61, 12, 84, 9, 38, 40, 73, 82, 23, 56, 43, 30, 46, 30, 28, 48, 60, 7, 23, 87, 30, 24, 15, 93, 95, 24, 53, 57, 30, 33, 9, 42, 96, 44, 3, 34, 83, 75, 15, 6, 82, 9, 87, 79, 38, 14, 27, 49, 21, 1, 35, 50, 77, 50, 94, 71, 25, 46, 27, 7, 30, 36, 100, 26, 79, 2, 59, 14, 28, 25, 19, 61, 85, 5, 92, 74, 19, 70, 74, 91, 70, 61, 92, 46, 10, 38, 16, 86, 83, 95, 92, 13, 82, 44, 90, 12, 45, 100, 25, 25, 76, 43, 85, 60, 48, 28, 85, 18, 97, 58, 60, 67, 18, 51, 64, 79, 88, 32, 17, 23, 26, 60, 87, 7, 3, 76, 18, 48, 75, 43, 24, 50, 37, 60, 61, 36, 88, 45, 53, 84, 54, 64, 2, 72, 67, 66, 2, 6, 97, 18, 28, 74, 78, 66, 80, 80, 41, 49, 79, 67, 43, 2, 68, 80, 62, 28, 15, 49, 24, 20, 84, 30, 83, 86, 1, 49, 51, 54, 55, 99, 72, 34, 72, 1, 100, 51, 80, 92, 51, 59, 59, 94, 12, 26, 73, 73, 6, 87, 73, 81, 6, 57, 10, 89, 42, 62, 89, 44, 68, 43, 42, 39, 29, 13, 39, 28, 15, 70, 19, 65, 80, 77, 58, 92, 55, 82, 16, 12, 69, 89, 44, 26, 97, 6, 66, 90, 19, 55, 33, 86, 49, 26, 24, 77, 90, 14, 56, 56, 84, 75, 20, 63, 3, 30, 54, 9, 11, 22, 72, 31, 10, 16, 57, 58, 73, 74, 47, 91, 28, 31, 77, 29, 8, 100, 57, 97, 66, 13, 52, 1, 39, 23, 63, 93, 4, 69, 2, 15, 90, 25, 97, 51, 92, 5, 60, 64, 79, 58, 55, 58, 88, 83, 86, 47, 34, 95, 95, 99, 7, 98, 99, 97, 20, 14, 89, 24, 34, 42, 90, 75, 67, 86, 25, 10, 91, 36, 74, 21, 93, 80, 78, 32, 62, 16, 78, 95, 10, 72, 46, 68, 69, 44, 64, 40, 9, 4, 15, 42, 98, 56, 16, 16, 42, 92, 25, 84, 27, 50, 56, 19, 29, 33, 50, 42, 48, 79, 89, 9, 2, 34, 76, 22, 29, 91, 62, 38, 47, 28, 79, 44, 84, 47, 59, 77, 38, 35, 12, 65, 85, 67, 35, 65, 99, 85, 59, 99, 15, 47, 7, 17, 32, 35, 38, 60, 25, 51, 97, 23, 31, 28, 66, 14, 74, 76, 90, 11, 63, 1, 27, 99, 67, 62, 63, 17, 98, 73, 15, 12, 71, 22, 80, 2, 56, 70, 62, 32, 20, 10, 55, 50, 89, 72, 15, 62, 48, 4, 25, 10, 56, 51, 8, 74, 64, 22, 91, 13, 47, 5, 77, 17, 78, 56, 19, 33, 25, 32, 17, 97, 93, 71, 98, 82, 42, 13, 95, 41, 68, 19, 2, 76, 22, 61, 49, 37, 83, 39, 50, 81, 44, 26, 97, 21, 33, 67, 6, 10, 50, 22, 58, 43, 44, 55, 76, 37, 19, 70, 30, 39, 41, 31, 14, 14, 92, 62, 50, 26, 1, 51, 6, 96, 28, 54, 68, 13, 21, 25, 22, 70, 98, 79, 64, 41, 85, 39, 30, 56, 61, 59, 94, 1, 41, 59, 66, 32, 20, 67, 9, 72, 70, 66, 19, 97, 20, 39, 61, 40, 63, 34, 61, 61, 12, 25, 53, 49, 63, 82, 4, 75, 40, 49, 27, 81, 7, 92, 64, 78, 59, 25, 2, 80, 90, 72, 28, 9, 10, 89, 48, 73, 22, 9, 33, 86, 85, 85, 34, 47, 19, 89, 74, 10, 89, 100, 42, 47, 92, 6, 76, 2, 82, 29, 81, 71, 1, 8, 80, 62, 48, 79, 34, 70, 39, 18, 55, 23, 55, 40, 22, 25, 80, 95, 34, 20, 46, 76, 66, 37, 33, 93, 90, 14, 22, 22, 84, 74, 82, 15, 35, 29, 46, 69, 98, 36, 38, 4, 59, 44, 95, 32, 68, 26, 78, 2, 45, 23, 77, 62, 12, 61, 7, 53, 74, 28, 75, 9, 1, 56, 76, 35, 84, 21, 55, 34, 56, 45, 89, 66, 88, 36, 49, 8, 61, 78, 9, 58, 53, 37, 71, 64, 97, 77, 16, 22, 56, 42, 82, 56, 97, 57, 43, 33, 77, 49, 18, 85, 93, 58, 2, 81, 93, 51, 40, 6, 80, 48, 15, 32, 36, 37, 47, 84, 14, 63, 5, 21, 56, 38, 29, 53, 95, 71, 37, 23, 19, 6, 59, 12, 63, 61, 44, 56, 63, 83, 13, 42, 82, 27, 74, 17, 15, 20, 100, 80, 34, 56, 1, 90, 93, 29, 94, 39, 99, 82, 62, 69, 87, 20, 32, 49, 80, 27, 56, 94, 9, 20, 36, 42, 98, 61, 10, 13, 32, 61, 92, 18, 16, 44, 7, 61, 72, 52, 99, 22, 85, 12, 91, 71, 32, 74, 71, 63, 1, 79, 9, 61, 98, 44, 3, 96, 56, 12, 8, 87, 73, 51, 4, 40, 95, 62, 52, 66, 65, 3, 40, 49, 14, 82, 71, 97, 55, 94, 12, 55, 72, 20, 16, 21, 15, 70, 16, 22, 33, 75, 60, 57, 26, 64, 49, 72, 77, 100, 37, 94, 54, 28, 94, 20, 9, 17, 68, 16, 10, 79, 70, 33, 50, 37, 53, 16, 58, 69, 89, 91, 95, 49, 47, 20, 64, 95, 91, 92, 47, 80, 85, 52, 59, 31, 71, 68, 47, 39, 83, 8, 69, 4, 40, 71, 41, 44, 38, 50, 12, 27, 40, 59, 75, 39, 78, 38, 33, 21, 29, 31, 52, 66, 83, 10, 96, 53, 29, 94, 43, 63, 1, 12, 67, 92, 34, 59, 35, 71, 8, 99, 97, 48, 57, 71, 86, 86, 60, 70, 6, 41, 53, 9, 58, 35, 19, 53, 39, 99, 46, 34, 62, 98, 45, 28, 89, 78, 38, 23, 48, 45, 21, 97, 44, 77, 19, 81, 63, 31, 3, 20, 71, 55, 29, 28, 41, 99, 32, 31, 49, 29, 64, 10, 78, 60, 89, 66, 89, 26, 40, 89, 23, 13, 85, 18, 89, 3, 51, 3, 33, 53, 75, 55, 59, 55, 34, 51, 5, 17, 33, 53, 45, 97, 63, 22, 56, 51, 39, 97, 29, 79, 85, 51, 43, 69, 20, 83, 23, 70, 86, 8, 74, 12, 14, 84, 66, 48, 34, 22, 64, 67, 74, 61, 15, 36, 34, 22, 39, 25, 18, 67, 55, 2, 69, 97, 22, 40, 79, 97, 10, 16, 4, 35, 27, 17, 19, 44, 16, 4, 65, 32, 22, 39, 92, 36, 26, 77, 10, 16, 1, 27, 82, 55, 81, 2, 3, 54, 94, 82, 50, 3, 97, 5, 89, 76, 74, 7, 71, 89, 63, 36, 20, 84, 26, 63, 72, 51, 40, 81, 19, 92, 59, 100, 99, 91, 54, 1, 45, 47, 82, 46, 1, 31, 51, 41, 6, 24, 100, 76, 12, 62, 63, 84, 97, 88, 98, 68, 91, 89, 100, 9, 81, 11, 60, 79, 1, 65, 31, 97, 63, 13, 43, 15, 95, 93, 56, 100, 68, 55, 27, 79, 16, 90, 14, 64, 29, 12, 32, 71, 100, 83, 31, 32, 93, 43, 10, 46, 7, 93, 42, 22, 57, 36, 36, 51, 28, 43, 2, 95, 97, 28, 26, 64, 69, 91, 28, 50, 2, 11, 72, 2, 45, 3, 33, 38, 45, 95, 35, 3, 39, 28, 24, 95, 64, 12, 45, 91, 54, 46, 38, 3, 25, 15, 66, 94, 5, 93, 95, 7, 55, 66, 60, 100, 68, 44, 89, 64, 90, 23, 67, 28, 50, 42, 22, 13, 5, 66, 56, 59, 63, 45, 61, 88, 59, 78, 81, 63, 23, 27, 21, 77, 92, 32, 76, 12, 76, 16, 75, 17, 38, 93, 45, 40, 87, 18, 4, 91, 36, 59, 1, 98, 55, 13, 85, 13, 91, 17, 28, 13, 43, 48, 41, 87, 80, 69, 98, 7, 84, 24, 23, 74, 69, 19, 13, 55, 37, 68, 97, 24, 79, 98, 21, 33, 62, 6, 46, 52, 74, 25, 16, 17, 72, 57, 55, 3, 77, 52, 61, 60, 27, 84, 85, 95, 54, 49, 1, 42, 17, 98, 65, 95, 47, 86, 27, 8, 43, 24, 12, 16, 48, 27, 84, 72, 35, 38, 26, 11, 41, 87, 23, 68, 22, 7, 62, 75, 56, 63, 69, 72, 12, 33, 66, 58, 70, 44, 65, 12, 68, 28, 80, 67, 55, 63, 90, 41, 1, 16, 52, 93, 2, 74, 60, 23, 32, 22, 49, 87, 36, 69, 58, 47, 54, 75, 56, 23, 19, 72, 87, 38, 100, 18, 56, 6, 80, 46, 46, 32, 61, 49, 25, 14, 22, 36, 88, 54, 9, 88, 92, 44, 57, 50, 42, 10, 76, 49, 84, 46, 21, 70, 35, 20, 39, 91, 25, 19, 88, 22, 2, 100, 71, 78, 13, 44, 14, 100, 97, 22, 39, 41, 18, 95, 42, 11, 56, 17, 60, 40, 63, 80, 61, 49, 51, 100, 91, 27, 70, 78, 48, 23, 77, 18, 53, 41, 62, 66, 92, 10, 39, 31, 50, 8, 77, 91, 71, 33, 60, 30, 72, 74, 61, 84, 22, 63, 83, 13, 89, 4, 90, 88, 27, 19, 6, 31, 59, 19, 96, 3, 28, 86, 33, 30, 46, 9, 72, 16, 41, 31, 97, 64, 4, 9, 48, 78, 71, 82, 90, 11, 38, 31, 98, 16, 1, 55, 46, 12, 73, 93, 14, 1, 30, 46, 82, 75, 6, 53, 42, 99, 84, 38, 62, 39, 46, 61, 16, 68, 95, 57, 78, 32, 40, 28, 47, 40, 82, 44, 51, 7, 36, 64, 7, 65, 61, 40, 92, 67, 92, 33, 65, 27, 23, 78, 18, 20, 91, 33, 40, 85, 42, 69, 68, 81, 96, 66, 20, 30, 9, 23, 36, 44, 38, 94, 60, 99, 33, 3, 17, 76, 36, 33, 3, 10, 10, 20, 29, 52, 4, 68, 36, 45, 37, 3, 77, 84, 20, 49, 13, 28, 71, 48, 23, 8, 41, 35, 58, 25, 37, 74, 1, 24, 58, 55, 33, 20, 74, 14, 71, 29, 33, 59, 26, 69, 13, 2, 5, 33, 50, 17, 60, 72, 17, 83, 80, 9, 69, 89, 34, 5, 15, 86, 29, 72, 40, 13, 91, 65, 26, 62, 93, 11, 72, 18, 31, 84, 72, 35, 16, 73, 4, 76, 45, 20, 10, 76, 80, 78, 64, 13, 34, 78, 50, 14, 50, 89, 27, 92, 53, 4, 5, 98, 14, 76, 67, 45, 60, 90, 79, 75, 63, 82, 2, 7, 53, 63, 82, 33, 92, 45, 97, 26, 23, 99, 39, 24, 87, 17, 15, 92, 21, 20, 41, 86, 47, 7, 30, 6, 97, 61, 33, 11, 94, 86, 17, 99, 49, 50, 83, 92, 94, 31, 17, 68, 29, 8, 43, 16, 76, 10, 59, 48, 29, 99, 34, 27, 57, 15, 33, 5, 27, 17, 15, 73, 2, 83, 71, 50, 32, 53, 42, 78, 83, 10, 97, 12, 69, 40, 79, 45, 49, 89, 44, 29, 87, 29, 55, 95, 44, 39, 100, 22, 55, 66, 94, 57, 49, 64, 6, 32, 16, 99, 9, 51, 61, 6, 14, 81, 97, 44, 77, 45, 32, 21, 25, 70, 49, 79, 64, 44, 18, 15, 66, 72, 33, 59, 28, 33, 23, 86, 16, 90, 36, 25, 92, 48, 82, 5, 29, 30, 100, 5, 26, 31, 77, 50, 52, 26, 80, 68, 21, 97, 34, 86, 21, 66, 45, 100, 50, 19, 37, 66, 60, 25, 42, 52, 72, 75, 8, 100, 4, 8, 57, 29, 38, 33, 78, 90, 10, 9, 57, 31, 6, 90, 68, 78, 8, 64, 29, 57, 82, 66, 74, 42, 90, 15, 93, 61, 89, 100, 13, 92, 59, 21, 72, 97, 5, 1, 38, 15, 10, 46, 97, 67, 87, 16, 44, 46, 80, 72, 3, 13, 89, 28, 54, 78, 43, 98, 91, 83, 50, 3, 27, 8, 75, 98, 56, 79, 99, 45, 45, 60, 90, 41, 26, 29, 9, 21, 74, 88, 92, 28, 100, 33, 56, 6, 10, 50, 3, 52, 32, 4, 6, 58, 64, 80, 8, 19, 59, 58, 16, 3, 17, 5, 96, 42, 85, 4, 62, 59, 43, 5, 86, 94, 37, 93, 99, 99, 42, 54, 50, 74, 57, 56, 83, 20, 87, 90, 91, 45, 47, 6, 100, 63, 62, 95, 56, 47, 50, 17, 57, 92, 74, 42, 85, 62, 87, 36, 60, 28, 89, 62, 1, 97, 69, 84, 69, 55, 25, 11, 52, 72, 16, 51, 34, 29, 45, 42, 27, 46, 10, 83, 37, 83, 77, 73, 97, 63, 8, 8, 90, 48, 69, 43, 45, 89, 26, 13, 44, 50, 23, 95, 73, 90, 45, 59, 70, 41, 100, 97, 86, 9, 79, 74, 44, 55, 98, 40, 17, 6, 47, 7, 53, 68, 49, 49, 56, 26, 13, 99, 27, 87, 45, 100, 76, 41, 10, 46, 81, 9, 94, 18, 17, 72, 43, 12, 27, 41, 51, 95, 98, 50, 53, 50, 17, 53, 51, 72, 30, 63, 23, 57, 50, 67, 8, 77, 8, 17, 74, 40, 25, 67, 10, 93, 39, 52, 57, 17, 92, 7, 63, 89, 8, 16, 91, 24, 68, 93, 96, 50, 55, 70, 6, 56, 36, 65, 33, 95, 81, 58, 35, 57, 25, 96, 1, 15, 47, 9, 31, 91, 68, 93, 79, 75, 60, 21, 99, 80, 13, 46, 29, 20, 15, 86, 75, 2, 50, 59, 97, 82, 17, 83, 38, 41, 78, 90, 55, 76, 99, 37, 66, 66, 29, 97, 40, 41, 17, 90, 20, 82, 87, 48, 1, 1, 33, 27, 55, 82, 86, 51, 15, 2, 85, 4, 94, 14, 93, 48, 89, 43, 36, 55, 60, 64, 3, 52, 56, 19, 41, 75, 52, 80, 74, 52, 80, 6, 79, 86, 39, 16, 88, 5, 17, 72, 8, 10, 37, 1, 9, 26, 95, 44, 32, 55, 59, 34, 6, 15, 4, 98, 41, 56, 77, 15, 59, 9, 72, 89, 94, 63, 4, 34, 67, 72, 57, 75, 81, 94, 27, 41, 71, 21, 84, 2, 27, 95, 87, 32, 9, 42, 82, 1, 49, 10, 15, 8, 18, 39, 96, 64, 53, 52, 97, 19, 23, 53, 45, 56, 98, 71, 96, 68, 44, 32, 21, 70, 26, 7, 54, 86, 1, 35, 86, 49, 44, 53, 56, 14, 43, 4, 77, 95, 7, 25, 65, 29, 29, 10, 84, 27, 32, 32, 46, 75, 63, 67, 97, 40, 25, 50, 25, 25, 36, 62, 74, 79, 14, 81, 44, 8, 36, 72, 2, 42, 96, 19, 71, 77, 28, 6, 55, 11, 37, 100, 38, 51, 66, 34, 90, 43, 35, 66, 67, 70, 28, 92, 100, 93, 73, 96, 1, 60, 67, 54, 2, 63, 72, 24, 91, 51, 81, 45, 62, 70, 44, 99, 20, 62, 84, 62, 4, 70, 27, 70, 91, 54, 14, 42, 47, 86, 37, 99, 97, 4, 52, 98, 18, 24, 21, 8, 74, 54, 52, 87, 23, 47, 37, 42, 8, 20, 3, 11, 41, 82, 33, 31, 35, 46, 73, 33, 83, 9, 31, 79, 12, 83, 77, 29, 58, 49, 36, 83, 2, 39, 70, 24, 86, 6, 18, 93, 78, 72, 56, 18, 53, 88, 49, 40, 33, 21, 72, 67, 29, 55, 45, 93, 37, 73, 21, 46, 74, 9, 28, 27, 99, 97, 3, 84, 3, 20, 29, 80, 43, 84, 49, 48, 23, 97, 87, 7, 17, 10, 73, 98, 64, 69, 90, 52, 94, 62, 97, 67, 22, 25, 93, 21, 73, 95, 56, 27, 66, 36, 58, 9, 19, 7, 56, 93, 3, 94, 99, 72, 3, 23, 21, 19, 92, 62, 70, 85, 23, 67, 3, 97, 43, 95, 69, 67, 42, 24, 94, 7, 60, 3, 67, 30, 9, 74, 23, 64, 67, 73, 87, 22, 96, 7, 40, 39, 68, 9, 23, 42, 27, 77, 38, 21, 71, 6, 88, 64, 82, 33, 71, 93, 35, 89, 22, 44, 63, 96, 59, 81, 21, 45, 2, 68, 51, 93, 6, 70, 54, 80, 11, 80, 56, 49, 53, 26, 54, 40, 42, 35, 72, 64, 79, 6, 52, 1, 1, 66, 48, 11, 47, 20, 55, 100, 87, 57, 45, 92, 26, 98, 71, 37, 29, 26, 37, 81, 4, 90, 20, 45, 77, 43, 60, 55, 1, 11, 7, 53, 29, 7, 64, 27, 26, 70, 78, 13, 79, 22, 56, 56, 71, 27, 92, 100, 4, 28, 80, 7, 70, 52, 3, 98, 46, 62, 4, 98, 25, 63, 51, 53, 69, 66, 79, 46, 87, 56, 10, 65, 30, 66, 21, 100, 92, 64, 51, 95, 44, 83, 54, 65, 34, 8, 14, 31, 22, 17, 29, 98, 31, 31, 50, 51, 96, 80, 97, 34, 87, 6, 99, 16, 71, 71, 68, 14, 34, 18, 61, 29, 100, 66, 93, 85, 25, 6, 16, 46, 75, 96, 43, 5, 26, 44, 56, 73, 75, 4, 6, 62, 61, 56, 29, 32, 78, 96, 97, 12, 14, 9, 92, 65, 74, 37, 50, 99, 42, 17, 96, 68, 12, 39, 25, 89, 34, 32, 13, 9, 35, 70, 22, 95, 26, 50, 78, 3, 46, 27, 66, 11, 35, 10, 75, 9, 46, 24, 59, 39, 40, 54, 7, 3, 44, 83, 43, 78, 14, 55, 38, 48, 77, 59, 94, 54, 8, 24, 8, 5, 50, 74, 15, 84, 35, 90, 44, 80, 65, 2, 18, 57, 8, 76, 11, 51, 58, 54, 80, 71, 60, 17, 70, 36, 27, 16, 89, 35, 39, 97, 91, 40, 22, 6, 23, 56, 47, 19, 35, 63, 72, 52, 19, 79, 80, 30, 82, 37, 35, 61, 8, 94, 30, 29, 30, 56, 44, 70, 42, 34, 66, 33, 73, 39, 90, 48, 94, 88, 66, 28, 50, 89, 32, 69, 68, 63, 50, 49, 99, 84, 61, 58, 29, 42, 87, 10, 98, 82, 80, 91, 16, 97, 75, 88, 36, 16, 35, 29, 3, 52, 9, 53, 41, 92, 21, 8, 54, 22, 8, 4, 57, 20, 62, 85, 62, 100, 95, 11, 81, 26, 53, 96, 22, 28, 84, 9, 95, 70, 90, 98, 22, 50, 50, 62, 93, 22, 21, 46, 43, 80, 1, 51, 99, 62, 35, 60, 61, 81, 22, 94, 6, 75, 89, 80, 54, 24, 40, 48, 94, 29, 45, 15, 78, 46, 28, 70, 19, 100, 67, 13, 79, 68, 63, 77, 81, 98, 89, 94, 30, 62, 87, 36, 36, 27, 67, 41, 51, 6, 89, 96, 35, 85, 62, 64, 83, 89, 86, 1, 88, 52, 14, 18, 71, 28, 94, 52, 77, 34, 97, 7, 96, 35, 94, 83, 61, 60, 24, 63, 17, 64, 58, 3, 48, 19, 19, 82, 59, 4, 83, 98, 55, 48, 15, 78, 75, 61, 81, 52, 46, 77, 10, 41, 11, 3, 76, 23, 14, 99, 86, 82, 62, 43, 85, 61, 14, 55, 43, 24, 58, 77, 22, 64, 76, 88, 41, 50, 48, 21, 53, 94, 97, 14, 86, 59, 16, 61, 34, 81, 11, 19, 63, 24, 13, 99, 85, 78, 53, 79, 2, 62, 7, 23, 25, 82, 62, 66, 83, 10, 86, 36, 55, 35, 1, 92, 45, 17, 5, 78, 49, 15, 48, 63, 91, 61, 13, 27, 38, 65, 5, 91, 26, 11, 65, 3, 44, 27, 68, 26, 88, 53, 13, 42, 39, 14, 33, 84, 82, 89, 13, 30, 4, 61, 93, 94, 73, 5, 20, 62, 22, 76, 53, 99, 38, 17, 1, 81, 43, 20, 6, 30, 25, 19, 23, 63, 84, 8, 98, 65, 96, 11, 94, 51, 23, 38, 96, 95, 95, 15, 56, 68, 42, 60, 66, 31, 77, 19, 11, 71, 90, 69, 53, 14, 39, 27, 77, 22, 34, 26, 86, 82, 36, 31, 32, 10, 69, 28, 4, 63, 94, 12, 30, 88, 71, 47, 18, 99, 17, 29, 22, 7, 49, 26, 72, 39, 52, 48, 60, 38, 74, 97, 19, 61, 27, 2, 71, 95, 29, 26, 9, 75, 37, 90, 62, 60, 89, 79, 58, 57, 59, 31, 15, 59, 56, 87, 97, 60, 86, 56, 97, 11, 4, 67, 24, 31, 68, 94, 77, 49, 71, 38, 23, 8, 27, 36, 19, 67, 66, 76, 24, 25, 59, 90, 35, 14, 76, 32, 73, 14, 39, 21, 24, 43, 87, 47, 73, 7, 92, 1, 55, 15, 38, 77, 22, 65, 12, 40, 83, 29, 67, 58, 53, 77, 48, 40, 43, 75, 71, 67, 88, 9, 88, 64, 3, 26, 62, 27, 32, 6, 28, 86, 20, 65, 14, 93, 81, 77, 84, 64, 6, 2, 21, 10, 79, 68, 49, 21, 43, 19, 87, 82, 80, 26, 97, 82, 52, 11, 9, 83, 16, 36, 21, 35, 52, 34, 79, 33, 11, 62, 96, 16, 63, 16, 25, 93, 36, 74, 13, 30, 44, 52, 63, 23, 77, 60, 57, 28, 70, 17, 63, 85, 4, 83, 71, 55, 16, 1, 87, 78, 62, 34, 93, 76, 50, 70, 69, 37, 95, 33, 66, 38, 84, 28, 13, 61, 39, 21, 40, 8, 37, 2, 44, 40, 36, 66, 46, 4, 66, 85, 81, 79, 18, 26, 55, 19, 95, 23, 7, 89, 55, 72, 78, 91, 52, 90, 51, 90, 10, 42, 98, 46, 96, 93, 37, 31, 59, 35, 34, 76, 19, 67, 55, 88, 92, 9, 59, 38, 83, 65, 26, 89, 37, 3, 79, 40, 45, 81, 29, 54, 23, 78, 52, 18, 71, 40, 100, 81, 74, 86, 56, 44, 52, 62, 84, 95, 70, 42, 32, 4, 6, 9, 45, 94, 63, 23, 85, 7, 56, 14, 13, 78, 91, 64, 47, 13, 55, 98, 93, 29, 83, 1, 24, 86, 62, 7, 32, 84, 100, 15, 87, 58, 23, 31, 51, 86, 6, 36, 44, 61, 1, 56, 90, 43, 71, 36, 56, 26, 85, 48, 6, 68, 100, 29, 5, 62, 88, 37, 45, 87, 51, 83, 44, 26, 14, 47, 63, 71, 34, 58, 31, 34, 14, 72, 76, 36, 59, 83, 61, 43, 83, 18, 62, 82, 99, 67, 43, 86, 55, 87, 24, 57, 70, 68, 82, 35, 66, 96, 57, 99, 54, 87, 84, 19, 10, 11, 54, 68, 94, 67, 10, 76, 84, 72, 57, 34, 90, 52, 19, 44, 90, 95, 100, 11, 14, 34, 97, 79, 81, 53, 29, 34, 39, 64, 52, 100, 74, 58, 67, 67, 24, 77, 94, 59, 100, 3, 93, 89, 54, 63, 84, 95, 57, 35, 6, 70, 20, 2, 100, 1, 55, 28, 34, 45, 91, 38, 45, 17, 95, 11, 35, 18, 39, 29, 28, 90, 83, 20, 30, 88, 35, 13, 82, 91, 100, 87, 13, 19, 41, 64, 19, 47, 44, 5, 91, 34, 42, 87, 2, 36, 50, 37, 5, 88, 17, 32, 30, 51, 4, 59, 38, 38, 72, 19, 80, 71, 58, 44, 41, 50, 8, 12, 96, 51, 16, 86, 36, 9, 25, 38, 44, 74, 26, 100, 13, 94, 31, 42, 44, 86, 1, 81, 23, 72, 51, 55, 94, 60, 98, 86, 9, 5, 97, 4, 55, 64, 42, 91, 72, 66, 80, 15, 39, 5, 66, 51, 50, 97, 93, 93, 34, 45, 25, 57, 68, 75, 11, 61, 87, 60, 98, 95, 65, 95, 51, 71, 58, 92, 61, 82, 9, 92, 96, 99, 48, 14, 1, 97, 62, 45, 89, 95, 89, 13, 51, 56, 40, 13, 68, 26, 73, 66, 72, 89, 12, 74, 59, 21, 65, 72, 2, 25, 63, 50, 23, 11, 63, 76, 7, 24, 20, 48, 18, 9, 12, 21, 16, 51, 85, 84, 28, 57, 1, 52, 97, 64, 25, 56, 84, 42, 27, 86, 66, 41, 35, 41, 51, 49, 68, 10, 72, 87, 57, 41, 47, 68, 13, 63, 71, 98, 98, 50, 6, 50, 1, 3, 13, 26, 58, 96, 19, 36, 33, 36, 76, 19, 76, 79, 67, 43, 88, 90, 82, 96, 83, 28, 63, 95, 42, 85, 92, 91, 35, 50, 40, 35, 52, 52, 12, 61, 100, 30, 96, 32, 66, 23, 51, 93, 1, 69, 88, 88, 59, 69, 83, 93, 48, 98, 87, 42, 34, 31, 32, 68, 80, 72, 55, 31, 75, 18, 43, 74, 48, 38, 6, 65, 60, 8, 9, 13, 76, 96, 52, 86, 16, 87, 78, 16, 84, 17, 57, 69, 47, 88, 37, 78, 11, 43, 60, 86, 60, 2, 59, 59, 91, 16, 23, 2, 23, 32, 14, 51, 79, 66, 36, 47, 52, 66, 62, 87, 34, 70, 55, 32, 9, 43, 9, 20, 85, 68, 5, 45, 69, 15, 3, 11, 31, 78, 12, 53, 61, 26, 3, 39, 43, 91, 37, 94, 56, 50, 32, 41, 19, 86, 72, 80, 81, 80, 99, 65, 99, 55, 61, 19, 69, 64, 29, 51, 41, 40, 4, 1, 65, 58, 91, 7, 48, 80, 52, 55, 29, 83, 95, 100, 21, 66, 31, 1, 45, 29, 65, 95, 35, 26, 13, 55, 41, 41, 6, 33, 81, 9, 85, 97, 18, 27, 56, 66, 6, 7, 72, 87, 42, 67, 38, 62, 32, 68, 14, 29, 48, 30, 23, 82, 7, 36, 36, 47, 28, 41, 79, 8, 1, 15, 5, 71, 42, 12, 36, 47, 70, 7, 85, 11, 25, 22, 24, 9, 89, 89, 37, 36, 19, 11, 69, 25, 98, 57, 24, 26, 49, 2, 85, 50, 17, 41, 20, 10, 52, 7, 8, 22, 65, 93, 84, 90, 14, 8, 98, 55, 96, 86, 42, 66, 48, 63, 91, 98, 19, 14, 75, 67, 67, 59, 68, 35, 52, 39, 44, 3, 45, 52, 76, 62, 96, 60, 3, 61, 19, 100, 67, 66, 37, 9, 32, 36, 71, 22, 85, 89, 87, 59, 7, 5, 70, 75, 40, 21, 13, 35, 23, 58, 38, 51, 71, 33, 10, 73, 94, 28, 24, 60, 93, 12, 20, 24, 47, 42, 97, 84, 82, 35, 42, 89, 40, 63, 63, 31, 83, 75, 65, 58, 84, 3, 8, 54, 35, 17, 78, 80, 96, 1, 40, 88, 12, 11, 64, 11, 53, 12, 94, 34, 47, 87, 74, 38, 50, 36, 68, 84, 63, 32, 41, 98, 86, 100, 52, 21, 16, 81, 52, 63, 82, 43, 51, 45, 54, 66, 55, 58, 77, 100, 43, 75, 87, 17, 12, 88, 4, 31, 71, 66, 63, 64, 64, 48, 63, 67, 20, 31, 47, 72, 93, 80, 14, 95, 25, 19, 60, 31, 76, 89, 31, 19, 15, 69, 87, 79, 56, 90, 9, 78, 8, 23, 41, 71, 23, 4, 89, 42, 34, 87, 65, 26, 67, 31, 73, 91, 49, 32, 21, 77, 72, 3, 47, 87, 71, 33, 65, 78, 74, 25, 8, 81, 48, 48, 3, 70, 3, 91, 63, 88, 78, 80, 66, 44, 10, 38, 86, 10, 21, 58, 38, 93, 61, 84, 79, 83, 68, 95, 13, 42, 71, 20, 22, 18, 19, 25, 39, 74, 15, 54, 61, 44, 33, 26, 39, 94, 15, 24, 55, 36, 34, 45, 28, 94, 28, 58, 28, 48, 4, 40, 89, 74, 11, 62, 44, 30, 86, 34, 3, 53, 87, 15, 48, 71, 93, 87, 16, 7, 62, 23, 42, 47, 67, 21, 40, 46, 78, 20, 93, 81, 59, 33, 7, 70, 95, 50, 51, 32, 83, 53, 36, 22, 19, 84, 44, 11, 22, 60, 18, 35, 34, 59, 82, 100, 32, 73, 97, 9, 92, 42, 42, 3, 74, 100, 72, 20, 49, 74, 4, 83, 78, 39, 56, 96, 74, 100, 7, 95, 11, 24, 82, 96, 34, 63, 47, 65, 35, 43, 26, 79, 84, 19, 81, 10, 18, 4, 81, 18, 77, 84, 52, 54, 75, 8, 1, 48, 59, 7, 95, 21, 82, 76, 16, 16, 90, 62, 32, 76, 4, 9, 54, 40, 27, 34, 1, 96, 89, 81, 13, 17, 17, 17, 70, 91, 24, 23, 90, 34, 29, 84, 54, 11, 11, 69, 78, 100, 82, 61, 76, 37, 70, 81, 76, 48, 67, 28, 96, 55, 61, 60, 72, 77, 76, 93, 19, 51, 15, 8, 84, 96, 44, 37, 6, 6, 57, 35, 6, 38, 95, 33, 75, 16, 65, 2, 64, 31, 30, 59, 38, 42, 70, 9, 18, 46, 53, 36, 96, 68, 95, 80, 15, 38, 68, 72, 44, 77, 6, 1, 66, 52, 85, 92, 68, 49, 94, 83, 32, 75, 93, 69, 16, 62, 29, 85, 7, 81, 20, 55, 100, 66, 86, 14, 4, 53, 85, 99, 81, 42, 51, 47, 94, 35, 38, 61, 35, 83, 95, 18, 57, 87, 86, 24, 48, 14, 8, 7, 47, 79, 61, 46, 45, 98, 12, 100, 50, 48, 50, 83, 90, 100, 29, 83, 34, 66, 95, 20, 49, 41, 38, 57, 27, 75, 33, 26, 41, 92, 84, 87, 71, 96, 84, 67, 93, 47, 18, 95, 95, 67, 77, 84, 66, 5, 18, 51, 22, 64, 22, 70, 4, 59, 79, 82, 86, 11, 59, 26, 2, 43, 12, 24, 38, 95, 42, 83, 42, 59, 77, 88, 77, 5, 23, 94, 9, 92, 96, 30, 7, 18, 52, 10, 28, 82, 43, 13, 44, 1, 38, 45, 95, 1, 21, 85, 96, 14, 67, 89, 73, 95, 28, 1, 99, 50, 95, 7, 41, 90, 88, 47, 59, 91, 8, 87, 24, 2, 51, 67, 2, 41, 64, 49, 41, 36, 33, 88, 49, 99, 28, 73, 93, 55, 74, 43, 4, 20, 49, 96, 61, 88, 94, 20, 31, 1, 58, 54, 2, 60, 73, 56, 100, 36, 4, 41, 71, 88, 28, 19, 38, 56, 92, 82, 62, 17, 24, 66, 36, 24, 13, 96, 63, 7, 67, 93, 59, 24, 99, 13, 84, 71, 20, 83, 58, 75, 75, 80, 62, 3, 50, 99, 10, 93, 80, 71, 9, 55, 88, 96, 78, 1, 92, 40, 59, 58, 33, 17, 34, 83, 29, 69, 5, 100, 51, 62, 74, 78, 93, 35, 80, 42, 85, 41, 35, 16, 11, 95, 70, 99, 91, 47, 51, 34, 87, 9, 43, 71, 25, 28, 53, 6, 96, 57, 5, 99, 70, 31, 76, 62, 65, 55, 55, 2, 95, 41, 17, 57, 36, 87, 55, 78, 33, 57, 63, 71, 65, 5, 41, 42, 33, 45, 99, 80, 53, 55, 78, 74, 85, 53, 87, 2, 59, 42, 3, 5, 34, 71, 62, 69, 57, 68, 98, 42, 25, 60, 64, 41, 17, 57, 82, 1, 53, 80, 80, 6, 87, 58, 31, 71, 62, 18, 24, 21, 11, 26, 25, 44, 49, 86, 65, 5, 6, 62, 98, 30, 74, 62, 70, 42, 70, 4, 94, 22, 35, 73, 27, 21, 82, 10, 44, 96, 79, 67, 16, 89, 45, 40, 84, 93, 78, 48, 49, 35, 62, 99, 64, 87, 12, 85, 28, 81, 40, 21, 2, 75, 45, 81, 47, 79, 90, 90, 74, 68, 9, 89, 8, 53, 80, 91, 97, 9, 91, 45, 43, 52, 43, 58, 38, 6, 95, 17, 86, 34, 89, 40, 8, 33, 20, 55, 11, 61, 96, 36, 80, 4, 24, 87, 8, 56, 29, 4, 16, 19, 1, 11, 22, 95, 68, 59, 1, 62, 27, 86, 96, 15, 25, 55, 100, 96, 61, 62, 56, 57, 98, 87, 12, 73, 73, 20, 80, 54, 23, 96, 72, 75, 6, 94, 70, 25, 4, 70, 87, 83, 55, 34, 97, 32, 40, 48, 27, 1, 10, 35, 9, 7, 21, 20, 31, 46, 91, 11, 99, 66, 6, 22, 40, 63, 67, 9, 39, 23, 78, 25, 5, 85, 10, 1, 16, 50, 1, 94, 50, 10, 28, 58, 68, 1, 29, 98, 98, 20, 8, 48, 85, 65, 69, 24, 79, 88, 33, 18, 10, 10, 94, 14, 94, 4, 66, 61, 5, 66, 55, 6, 27, 34, 15, 94, 86, 43, 92, 83, 14, 51, 82, 98, 68, 3, 74, 46, 90, 6, 15, 99, 67, 9, 12, 13, 64, 29, 73, 20, 95, 79, 25, 21, 65, 39, 67, 50, 81, 10, 85, 95, 60, 18, 44, 79, 20, 17, 25, 9, 74, 91, 59, 41, 51, 22, 5, 14, 51, 29, 33, 97, 8, 9, 69, 24, 47, 35, 25, 80, 44, 9, 26, 56, 27, 69, 34, 98, 38, 10, 7, 11, 1, 65, 3, 51, 87, 7, 17, 89, 36, 1, 85, 95, 10, 53, 70, 56, 40, 94, 35, 35, 55, 12, 90, 81, 33, 76, 30, 70, 85, 36, 32, 85, 53, 35, 88, 91, 93, 4, 79, 80, 56, 15, 26, 65, 67, 95, 21, 58, 89, 7, 93, 43, 19, 34, 75, 51, 9, 4, 72, 94, 92, 3, 30, 44, 89, 69, 86, 34, 24, 64, 13, 80, 78, 91, 44, 96, 37, 64, 6, 25, 23, 98, 19, 41, 31, 45, 43, 92, 49, 14, 85, 92, 68, 66, 87, 57, 35, 72, 42, 10, 35, 6, 89, 64, 96, 33, 11, 33, 48, 16, 9, 70, 13, 28, 62, 96, 72, 56, 39, 72, 21, 75, 63, 89, 40, 1, 97, 26, 72, 90, 36, 58, 95, 24, 21, 91, 8, 32, 75, 8, 99, 83, 29, 12, 62, 43, 59, 86, 98, 49, 57, 71, 23, 72, 11, 62, 72, 59, 40, 96, 48, 75, 53, 42, 50, 74, 84, 10, 57, 58, 17, 55, 93, 45, 18, 6, 39, 28, 91, 37, 76, 100, 59, 98, 23, 69, 12, 46, 27, 51, 41, 74, 77, 94, 67, 26, 19, 51, 87, 27, 60, 3, 81, 4, 100, 51, 10, 38, 78, 52, 26, 6, 51, 36, 55, 25, 4, 66, 71, 30, 68, 11, 55, 44, 56, 22, 22, 74, 24, 8, 100, 83, 11, 33, 87, 62, 35, 48, 51, 12, 99, 29, 69, 50, 64, 24, 26, 68, 89, 96, 49, 9, 59, 56, 52, 14, 29, 73, 40, 52, 81, 91, 34, 43, 75, 72, 56, 9, 19, 6, 73, 18, 34, 41, 19, 50, 64, 44, 69, 5, 92, 17, 65, 50, 24, 16, 15, 52, 41, 6, 3, 21, 49, 89, 15, 23, 60, 70, 84, 31, 27, 56, 100, 13, 96, 18, 62, 12, 13, 30, 68, 56, 98, 32, 57, 22, 99, 24, 73, 39, 29, 28, 11, 29, 16, 25, 52, 27, 46, 35, 57, 73, 42, 56, 85, 37, 25, 98, 100, 90, 79, 19, 97, 76, 2, 54, 49, 1, 77, 74, 91, 57, 53, 2, 86, 68, 26, 89, 94, 24, 75, 3, 96, 16, 10, 32, 4, 35, 81, 56, 76, 59, 26, 72, 86, 28, 77, 87, 80, 53, 12, 70, 62, 64, 71, 99, 31, 49, 39, 76, 72, 65, 30, 19, 80, 40, 2, 35, 26, 82, 42, 53, 40, 68, 24, 77, 95, 1, 63, 74, 5, 74, 95, 18, 37, 18, 68, 19, 66, 6, 47, 89, 70, 76, 59, 1, 15, 60, 88, 92, 41, 29, 44, 32, 96, 68, 60, 42, 20, 23, 67, 76, 48, 62, 46, 37, 79, 13, 7, 96, 71, 53, 84, 40, 29, 42, 93, 95, 53, 80, 87, 45, 8, 30, 28, 4, 49, 87, 97, 20, 61, 64, 48, 61, 25, 93, 97, 3, 57, 3, 98, 27, 8, 33, 19, 36, 26, 11, 82, 78, 90, 20, 22, 49, 2, 49, 4, 50, 87, 1, 22, 48, 64, 69, 8, 40, 13, 56, 42, 21, 58, 91, 100, 65, 75, 70, 52, 100, 80, 86, 29, 21, 5, 2, 21, 6, 50, 25, 8, 88, 77, 29, 87, 40, 49, 94, 79, 13, 49, 72, 85, 59, 14, 36, 75, 88, 5, 79, 39, 36, 16, 67, 8, 20, 68, 29, 78, 69, 5, 85, 56, 81, 65, 43, 20, 65, 88, 50, 29, 89, 21, 65, 99, 86, 1, 25, 73, 5, 3, 11, 41, 18, 29, 100, 90, 96, 28, 67, 64, 32, 3, 71, 12, 19, 65, 83, 35, 53, 84, 63, 41, 56, 79, 91, 41, 79, 15, 65, 36, 70, 75, 28, 39, 55, 27, 28, 50, 55, 46, 65, 38, 100, 36, 2, 18, 52, 84, 52, 4, 20, 66, 96, 75, 45, 86, 16, 75, 53, 80, 10, 22, 7, 37, 60, 61, 16, 40, 63, 70, 85, 27, 59, 37, 14, 60, 54, 66, 96, 58, 21, 15, 75, 69, 89, 71, 6, 56, 46, 58, 88, 7, 79, 46, 96, 39, 58, 11, 30, 20, 32, 66, 99, 90, 2, 64, 50, 8, 81, 45, 17, 2, 11, 91, 22, 51, 14, 27, 7, 11, 85, 46, 17, 63, 91, 64, 53, 48, 74, 82, 20, 57, 100, 70, 47, 1, 33, 48, 8, 14, 44, 24, 67, 54, 67, 40, 4, 80, 66, 62, 90, 50, 7, 58, 65, 49, 22, 17, 49, 47, 51, 68, 56, 2, 89, 54, 2, 21, 1, 62, 86, 44, 37, 4, 49, 55, 43, 4, 34, 9, 18, 75, 10, 76, 85, 74, 25, 58, 43, 25, 56, 45, 44, 11, 46, 32, 64, 99, 52, 64, 60, 90, 59, 97, 45, 59, 51, 88, 15, 37, 48, 32, 63, 57, 7, 47, 83, 83, 4, 25, 7, 12, 69, 50, 22, 66, 81, 86, 64, 85, 1, 24, 26, 12, 72, 70, 22, 74, 9, 36, 62, 56, 67, 77, 65, 26, 23, 47, 8, 79, 23, 15, 90, 43, 16, 63, 8, 97, 48, 23, 33, 1, 98, 58, 64, 21, 27, 85, 47, 36, 73, 8, 43, 91, 84, 7, 16, 59, 5, 76, 89, 79, 42, 30, 21, 57, 92, 80, 5, 92, 3, 37, 92, 100, 94, 7, 21, 73, 43, 67, 8, 15, 26, 50, 58, 62, 9, 73, 72, 65, 100, 60, 44, 93, 89, 16, 50, 80, 96, 6, 23, 50, 43, 14, 1, 88, 72, 21, 60, 15, 39, 67, 81, 17, 69, 38, 78, 29, 63, 49, 45, 62, 60, 88, 55, 48, 56, 56, 79, 3, 61, 2, 52, 55, 67, 52, 43, 91, 25, 2, 5, 15, 21, 85, 31, 41, 75, 60, 69, 37, 8, 65, 50, 19, 5, 56, 18, 60, 63, 49, 62, 24, 50, 13, 30, 68, 16, 72, 58, 40, 26, 14, 55, 98, 51, 37, 38, 25, 97, 58, 13, 56, 22, 62, 75, 26, 70, 92, 85, 32, 40, 98, 7, 41, 62, 37, 61, 78, 60, 18, 69, 85, 32, 23, 82, 34, 12, 19, 58, 8, 28, 22, 63, 50, 83, 89, 27, 4, 33, 12, 36, 72, 61, 42, 65, 23, 30, 25, 100, 90, 94, 68, 26, 77, 43, 8, 10, 54, 78, 19, 13, 58, 40, 75, 7, 75, 16, 33, 78, 48, 96, 65, 71, 57, 59, 35, 31, 88, 11, 30, 29, 5, 49, 55, 81, 43, 14, 43, 48, 43, 61, 60, 100, 1, 87, 6, 75, 2, 91, 52, 49, 38, 69, 71, 46, 27, 6, 76, 14, 68, 57, 43, 72, 6, 49, 5, 100, 62, 47, 48, 4, 59, 7, 4, 59, 45, 61, 33, 46, 3, 37, 46, 41, 5, 17, 38, 83, 74, 14, 96, 93, 70, 90, 17, 27, 90, 21, 27, 51, 19, 26, 7, 77, 84, 10, 88, 29, 22, 72, 26, 77, 8, 24, 69, 64, 92, 6, 98, 17, 19, 94, 9, 41, 35, 25, 19, 25, 97, 97, 27, 15, 22, 33, 44, 6, 94, 31, 86, 68, 2, 11, 44, 62, 86, 12, 77, 77, 69, 75, 93, 88, 20, 2, 80, 6, 78, 50, 82, 75, 47, 9, 41, 68, 93, 84, 25, 39, 66, 62, 6, 68, 25, 1, 81, 10, 64, 57, 87, 32, 83, 31, 71, 2, 84, 2, 60, 62, 52, 41, 36, 98, 1, 76, 17, 46, 12, 42, 84, 77, 55, 41, 44, 79, 93, 76, 89, 56, 85, 27, 39, 67, 57, 10, 21, 93, 63, 80, 54, 14, 72, 89, 11, 25, 16, 80, 70, 27, 21, 5, 4, 27, 97, 99, 6, 89, 27, 46, 96, 11, 72, 86, 29, 80, 47, 49, 72, 10, 80, 77, 23, 4, 65, 86, 28, 33, 65, 97, 11, 37, 53, 14, 63, 49, 65, 20, 89, 91, 65, 84, 53, 36, 21, 81, 68, 68, 82, 91, 77, 61, 68, 51, 16, 84, 36, 43, 16, 52, 91, 27, 88, 43, 92, 3, 91, 8, 22, 79, 98, 87, 14, 2, 74, 35, 83, 93, 54, 64, 84, 82, 76, 51, 32, 92, 34, 20, 34, 50, 71, 25, 28, 11, 19, 19, 13, 10, 27, 86, 40, 76, 24, 6, 78, 98, 92, 12, 90, 45, 75, 73, 26, 2, 23, 9, 93, 9, 28, 79, 58, 51, 55, 37, 61, 73, 7, 25, 34, 33, 10, 74, 61, 86, 31, 90, 83, 22, 1, 24, 18, 75, 49, 95, 76, 23, 3, 21, 31, 31, 99, 40, 33, 5, 76, 93, 77, 83, 69, 11, 67, 30, 36, 79, 15, 66, 68, 49, 87, 68, 25, 4, 94, 73, 50, 22, 95, 52, 42, 78, 34, 92, 69, 66, 96, 45, 10, 24, 79, 30, 34, 97, 60, 21, 76, 26, 86, 43, 75, 24, 63, 99, 79, 56, 23, 28, 77, 69, 80, 70, 46, 13, 13, 67, 31, 60, 11, 40, 84, 41, 70, 69, 89, 81, 90, 64, 6, 27, 59, 32, 51, 21, 82, 29, 28, 4, 57, 5, 25, 88, 26, 22, 52, 39, 88, 82, 50, 50, 74, 33, 90, 95, 54, 79, 75, 95, 94, 32, 21, 52, 16, 71, 24, 97, 52, 52, 53, 60, 8, 77, 47, 33, 50, 50, 23, 38, 32, 25, 87, 57, 9, 29, 51, 62, 59, 77, 56, 52, 8, 29, 56, 23, 51, 79, 72, 2, 30, 24, 13, 89, 52, 11, 74, 53, 61, 48, 90, 44, 72, 29, 100, 81, 57, 50, 42, 15, 26, 50, 18, 85, 78, 73, 8, 80, 4, 31, 82, 85, 6, 46, 74, 57, 57, 47, 9, 17, 94, 51, 60, 66, 79, 11, 46, 87, 60, 39, 53, 37, 40, 70, 21, 69, 95, 80, 49, 98, 62, 82, 82, 67, 27, 7, 75, 83, 53, 36, 51, 99, 86, 62, 64, 16, 72, 61, 2, 83, 51, 54, 19, 43, 23, 92, 11, 69, 23, 59, 66, 85, 40, 100, 51, 19, 6, 26, 1, 11, 61, 4, 9, 98, 65, 24, 13, 37, 36, 14, 19, 38, 67, 90, 80, 41, 33, 91, 62, 7, 1, 27, 91, 41, 78, 94, 11, 84, 71, 11, 46, 31, 66, 54, 80, 31, 29, 92, 67, 64, 57, 37, 1, 23, 78, 81, 15, 62, 23, 76, 69, 23, 55, 11, 15, 84, 4, 25, 67, 26, 88, 64, 8, 53, 17, 87, 83, 45, 78, 1, 60, 34, 90, 61, 8, 19, 93, 75, 81, 15, 2, 49, 37, 8, 11, 4, 92, 15, 28, 10, 40, 15, 74, 48, 20, 42, 86, 2, 87, 64, 55, 98, 49, 96, 10, 9, 14, 2, 83, 94, 68, 84, 94, 5, 44, 5, 8, 35, 71, 87, 44, 62, 54, 17, 9, 73, 11, 95, 26, 49, 10, 80, 46, 58, 75, 56, 66, 41, 9, 100, 34, 77, 36, 28, 33, 79, 84, 92, 13, 54, 78, 8, 15, 31, 77, 76, 55, 87, 22, 81, 35, 31, 12, 80, 40, 39, 87, 58, 79, 96, 9, 12, 72, 44, 91, 4, 74, 74, 95, 86, 79, 24, 46, 46, 7, 22, 21, 61, 60, 42, 41, 94, 24, 53, 25, 15, 91, 12, 24, 69, 59, 85, 32, 82, 28, 23, 85, 2, 48, 31, 39, 79, 6, 36, 24, 12, 57, 44, 73, 16, 37, 65, 61, 12, 17, 86, 78, 59, 49, 54, 27, 59, 38, 11, 40, 17, 85, 76, 70, 84, 58, 61, 62, 63, 96, 37, 75, 5, 32, 99, 20, 68, 63, 33, 31, 32, 70, 61, 90, 70, 14, 69, 28, 3, 79, 67, 19, 15, 42, 89, 98, 99, 49, 12, 13, 44, 48, 39, 48, 80, 37, 20, 99, 52, 4, 82, 83, 73, 42, 24, 94, 7, 92, 21, 9, 22, 39, 27, 88, 32, 67, 86, 82, 15, 49, 94, 11, 96, 33, 10, 27, 21, 81, 26, 24, 36, 7, 6, 8, 100, 30, 1, 6, 73, 73, 66, 47, 11, 92, 34, 94, 59, 71, 75, 25, 19, 21, 87, 15, 5, 49, 93, 25, 29, 18, 49, 65, 76, 6, 24, 75, 87, 77, 32, 12, 49, 97, 58, 12, 41, 43, 57, 51, 14, 32, 27, 84, 52, 14, 50, 56, 62, 43, 32, 42, 60, 32, 6, 88, 38, 82, 14, 24, 58, 46, 35, 58, 94, 44, 21, 86, 39, 78, 36, 52, 61, 63, 87, 12, 28, 37, 19, 41, 79, 50, 82, 90, 34, 40, 77, 71, 21, 43, 46, 30, 88, 33, 39, 33, 28, 12, 19, 66, 89, 6, 69, 1, 68, 56, 12, 47, 92, 82, 87, 22, 83, 69, 11, 16, 60, 40, 38, 80, 82, 84, 61, 21, 68, 99, 5, 95, 62, 23, 61, 50, 29, 29, 2, 48, 84, 13, 47, 27, 46, 33, 48, 29, 53, 11, 96, 12, 2, 34, 43, 35, 69, 3, 7, 36, 54, 11, 82, 15, 86, 42, 17, 66, 23, 18, 65, 58, 83, 11, 37, 80, 96, 36, 8, 48, 98, 56, 12, 99, 41, 54, 85, 9, 9, 91, 96, 14, 54, 77, 28, 39, 71, 96, 4, 45, 14, 20, 2, 48, 31, 90, 27, 78, 26, 87, 77, 23, 42, 88, 22, 34, 94, 58, 42, 2, 49, 89, 15, 2, 65, 94, 92, 87, 90, 47, 31, 55, 66, 85, 54, 96, 26, 80, 73, 51, 18, 50, 74, 11, 89, 47, 44, 82, 4, 37, 35, 4, 25, 1, 57, 42, 95, 48, 28, 36, 46, 11, 42, 12, 47, 95, 59, 72, 26, 32, 75, 96, 33, 48, 6, 73, 46, 2, 7, 49, 38, 41, 5, 63, 94, 13, 4, 40, 61, 83, 75, 58, 45, 68, 69, 43, 14, 28, 67, 91, 11, 41, 86, 43, 40, 44, 67, 85, 45, 73, 85, 82, 14, 89, 44, 59, 2, 99, 98, 14, 34, 24, 71, 30, 91, 92, 73, 56, 19, 39, 46, 29, 31, 84, 23, 70, 27, 89, 54, 71, 14, 90, 4, 79, 79, 100, 37, 32, 50, 34, 97, 83, 57, 19, 13, 99, 10, 37, 6, 80, 27, 51, 8, 57, 86, 82, 78, 64, 23, 31, 34, 36, 20, 90, 14, 50, 89, 50, 33, 38, 83, 29, 73, 91, 100, 37, 41, 61, 73, 46, 41, 99, 48, 48, 7, 34, 82, 84, 97, 4, 66, 83, 39, 37, 72, 52, 87, 12, 1, 71, 1, 35, 52, 73, 25, 51, 9, 17, 11, 33, 62, 51, 31, 9, 51, 89, 94, 32, 72, 91, 35, 37, 25, 73, 26, 48, 76, 64, 59, 76, 34, 59, 10, 85, 84, 86, 87, 44, 2, 98, 77, 15, 100, 7, 23, 2, 48, 17, 33, 19, 59, 19, 8, 83, 43, 85, 30, 18, 48, 40, 93, 81, 50, 54, 18, 33, 91, 4, 77, 44, 53, 5, 58, 5, 63, 81, 6, 10, 49, 39, 81, 59, 9, 88, 41, 52, 24, 22, 21, 71, 61, 66, 51, 10, 19, 20, 95, 62, 24, 23, 5, 28, 27, 15, 32, 89, 47, 38, 51, 95, 28, 31, 53, 88, 70, 45, 39, 93, 66, 60, 63, 78, 25, 65, 39, 95, 85, 33, 8, 60, 7, 13, 87, 85, 27, 71, 74, 73, 8, 76, 19, 87, 6, 23, 74, 75, 67, 65, 67, 84, 76, 81, 61, 52, 45, 99, 98, 81, 84, 6, 92, 90, 70, 79, 75, 48, 1, 100, 72, 8, 75, 90, 46, 32, 64, 19, 6, 30, 35, 24, 65, 10, 56, 25, 61, 52, 23, 59, 33, 6, 64, 24, 48, 33, 54, 74, 80, 54, 73, 3, 13, 99, 92, 58, 30, 7, 29, 35, 88, 63, 10, 52, 73, 65, 76, 85, 16, 50, 95, 100, 8, 58, 24, 55, 42, 29, 28, 73, 35, 52, 75, 47, 50, 18, 57, 31, 24, 85, 17, 11, 99, 26, 62, 23, 42, 89, 60, 57, 91, 54, 9, 98, 12, 84, 4, 5, 12, 83, 30, 46, 86, 4, 45, 35, 74, 1, 17, 97, 37, 33, 60, 87, 58, 73, 62, 51, 62, 21, 7, 52, 74, 67, 1, 85, 50, 56, 42, 14, 38, 71, 59, 23, 26, 55, 9, 99, 7, 25, 48, 95, 57, 7, 82, 66, 79, 43, 16, 92, 63, 74, 95, 88, 41, 95, 73, 42, 50, 66, 55, 39, 36, 66, 13, 61, 20, 73, 60, 79, 97, 7, 73, 5, 65, 6, 22, 95, 100, 89, 87, 14, 63, 81, 2, 55, 28, 26, 96, 29, 91, 51, 68, 26, 16, 32, 38, 87, 5, 49, 65, 53, 7, 90, 58, 71, 95, 31, 66, 95, 20, 4, 8, 34, 84, 61, 40, 63, 86, 87, 92, 76, 89, 11, 53, 4, 42, 91, 43, 46, 91, 7, 99, 98, 48, 8, 20, 43, 90, 37, 89, 61, 40, 48, 94, 76, 9, 85, 38, 94, 72, 81, 22, 60, 91, 74, 16, 33, 16, 58, 30, 59, 16, 80, 56, 64, 39, 27, 58, 29, 64, 46, 89, 3, 93, 35, 30, 53, 19, 68, 47, 42, 100, 20, 2, 91, 93, 69, 75, 61, 78, 56, 19, 93, 36, 26, 8, 74, 52, 65, 54, 15, 62, 95, 70, 55, 81, 99, 59, 99, 18, 5, 93, 18, 76, 46, 60, 21, 14, 34, 81, 91, 89, 51, 35, 76, 76, 43, 2, 79, 59, 7, 46, 21, 1, 67, 27, 81, 17, 85, 32, 35, 42, 24, 4, 17, 69, 63, 37, 34, 48, 69, 24, 88, 19, 58, 64, 46, 52, 17, 77, 11, 23, 22, 83, 24, 88, 9, 56, 4, 45, 87, 90, 86, 62, 93, 55, 30, 7, 43, 15, 54, 12, 38, 94, 82, 48, 57, 80, 99, 25, 56, 61, 47, 29, 43, 22, 68, 3, 78, 23, 48, 64, 13, 85, 26, 57, 39, 7, 16, 34, 22, 69, 97, 11, 62, 78, 10, 70, 9, 9, 94, 16, 21, 93, 44, 64, 14, 63, 18, 91, 86, 65, 7, 98, 2, 84, 6, 92, 42, 21, 25, 15, 42, 21, 26, 55, 51, 35, 25, 59, 95, 70, 75, 68, 14, 70, 83, 28, 33, 100, 70, 18, 17, 28, 67, 18, 11, 72, 9, 5, 93, 34, 19, 86, 54, 96, 40, 56, 83, 16, 15, 29, 38, 41, 96, 51, 62, 78, 30, 94, 30, 52, 63, 46, 79, 29, 63, 42, 53, 23, 46, 97, 56, 16, 82, 62, 12, 21, 17, 46, 37, 83, 74, 74, 23, 22, 76, 85, 99, 6, 30, 80, 57, 93, 25, 35, 73, 39, 28, 25, 62, 73, 21, 69, 89, 54, 30, 52, 75, 99, 97, 63, 81, 22, 36, 56, 43, 11, 40, 94, 68, 21, 73, 24, 13, 98, 11, 38, 88, 38, 62, 49, 11, 35, 18, 51, 88, 99, 54, 14, 97, 2, 76, 30, 23, 63, 85, 66, 26, 76, 59, 93, 48, 83, 17, 13, 32, 79, 50, 20, 16, 11, 68, 78, 97, 37, 80, 85, 36, 33, 98, 84, 34, 74, 65, 9, 36, 1, 74, 61, 28, 84, 6, 76, 66, 74, 88, 50, 52, 37, 69, 67, 99, 36, 45, 96, 73, 76, 80, 60, 9, 29, 95, 94, 54, 60, 2, 42, 60, 75, 54, 88, 10, 59, 63, 28, 32, 2, 77, 83, 38, 45, 2, 36, 32, 98, 31, 56, 73, 62, 15, 81, 43, 10, 27, 96, 69, 28, 37, 80, 55, 91, 67, 16, 49, 81, 43, 33, 82, 71, 67, 71, 67, 68, 7, 99, 65, 89, 54, 38, 3, 21, 70, 45, 82, 96, 40, 2, 24, 29, 81, 30, 19, 48, 45, 19, 80, 88, 51, 14, 10, 18, 84, 77, 37, 42, 27, 2, 31, 32, 91, 85, 52, 12, 29, 85, 8, 20, 86, 83, 48, 67, 64, 66, 66, 8, 37, 45, 47, 39, 58, 57, 8, 94, 85, 45, 35, 11, 98, 17, 94, 40, 1, 46, 51, 29, 82, 10, 1, 68, 44, 48, 34, 7, 66, 51, 15, 2, 95, 13, 92, 5, 69, 100, 98, 53, 44, 84, 15, 93, 1, 9, 32, 1, 6, 34, 82, 87, 44, 82, 6, 39, 81, 39, 46, 46, 89, 12, 99, 36, 24, 91, 92, 45, 90, 41, 49, 85, 24, 64, 29, 24, 24, 60, 77, 81, 45, 58, 19, 88, 91, 25, 27, 71, 63, 24, 17, 4, 35, 67, 91, 10, 57, 82, 54, 98, 22, 3, 34, 97, 18, 62, 73, 41, 73, 1, 21, 18, 58, 39, 57, 100, 63, 35, 70, 78, 10, 38, 33, 96, 5, 23, 6, 13, 4, 11, 63, 77, 13, 48, 25, 30, 62, 49, 22, 86, 49, 94, 3, 58, 85, 12, 57, 99, 98, 27, 28, 8, 64, 60, 3, 20, 82, 8, 85, 37, 71, 47, 65, 83, 94, 42, 65, 7, 90, 38, 93, 39, 32, 47, 96, 68, 58, 53, 66, 56, 31, 94, 15, 46, 53, 17, 66, 87, 77, 2, 23, 47, 48, 40, 81, 93, 81, 97, 100, 70, 35, 92, 60, 18, 38, 8, 85, 48, 60, 50, 55, 42, 43, 69, 87, 48, 37, 4, 34, 65, 5, 8, 11, 52, 47, 44, 97, 79, 40, 48, 1, 74, 91, 12, 91, 80, 19, 75, 27, 30, 77, 33, 71, 71, 53, 58, 18, 90, 61, 3, 54, 66, 11, 17, 69, 9, 60, 65, 88, 51, 64, 40, 25, 54, 51, 67, 34, 70, 94, 12, 99, 70, 45, 70, 92, 97, 79, 10, 38, 39, 12, 92, 56, 74, 60, 25, 83, 71, 41, 22, 21, 5, 61, 97, 58, 63, 64, 43, 32, 9, 55, 83, 30, 51, 4, 21, 47, 82, 82, 37, 72, 46, 28, 28, 19, 39, 52, 53, 9, 44, 74, 81, 48, 86, 78, 58, 49, 93, 52, 32, 1, 6, 14, 82, 8, 17, 2, 55, 50, 36, 91, 22, 81, 70, 49, 99, 60, 52, 52, 68, 95, 77, 100, 95, 15, 77, 4, 15, 69, 55, 46, 21, 13, 12, 2, 20, 80, 56, 26, 30, 91, 68, 51, 71, 89, 51, 21, 48, 2, 72, 67, 48, 1, 67, 42, 15, 43, 97, 29, 64, 52, 26, 84, 16, 37, 38, 35, 69, 45, 61, 98, 35, 80, 100, 57, 69, 2, 77, 16, 3, 1, 35, 2, 1, 1, 96, 15, 95, 92, 95, 10, 95, 20, 94, 10, 57, 83, 45, 25, 27, 57, 74, 13, 36, 25, 69, 56, 26, 45, 72, 80, 97, 58, 81, 97, 58, 76, 63, 4, 20, 57, 14, 14, 77, 59, 24, 85, 41, 20, 61, 19, 76, 86, 31, 63, 10, 99, 19, 87, 95, 42, 18, 44, 99, 98, 40, 8, 26, 55, 63, 45, 11, 76, 58, 39, 86, 81, 75, 78, 52, 87, 96, 79, 72, 78, 42, 33, 28, 12, 71, 75, 5, 88, 18, 55, 86, 9, 14, 63, 63, 76, 7, 26, 4, 16, 16, 41, 97, 91, 19, 100, 77, 66, 79, 1, 44, 72, 33, 71, 83, 4, 97, 39, 91, 14, 93, 28, 23, 58, 90, 85, 33, 48, 62, 88, 64, 78, 29, 12, 68, 99, 11, 96, 64, 89, 96, 59, 60, 81, 82, 94, 84, 78, 84, 26, 92, 76, 6, 14, 33, 47, 50, 18, 95, 64, 57, 10, 41, 85, 73, 60, 83, 83, 55, 99, 24, 51, 57, 35, 83, 38, 81, 18, 16, 64, 43, 7, 92, 100, 72, 76, 47, 73, 45, 93, 36, 2, 54, 76, 86, 26, 35, 21, 60, 42, 19, 83, 44, 75, 70, 26, 65, 50, 43, 80, 65, 37, 38, 56, 37, 61, 84, 35, 33, 28, 79, 21, 29, 32, 48, 67, 57, 35, 87, 16, 76, 57, 51, 71, 83, 20, 96, 47, 21, 38, 26, 37, 26, 15, 93, 62, 75, 28, 48, 8, 55, 26, 80, 36, 57, 27, 2, 65, 13, 40, 33, 40, 48, 83, 10, 30, 54, 5, 77, 26, 94, 54, 62, 20, 21, 6, 81, 95, 33, 81, 54, 40, 6, 33, 75, 15, 12, 76, 79, 24, 15, 11, 16, 62, 45, 25, 43, 98, 30, 71, 75, 23, 77, 37, 94, 97, 94, 27, 91, 27, 7, 97, 66, 12, 29, 40, 26, 92, 67, 57, 68, 33, 67, 83, 46, 12, 7, 88, 61, 88, 59, 36, 63, 87, 24, 56, 83, 17, 82, 25, 95, 40, 21, 60, 52, 2, 51, 29, 45, 17, 85, 12, 1, 4, 46, 46, 67, 5, 34, 27, 92, 44, 14, 6, 30, 37, 14, 64, 6, 47, 88, 100, 87, 61, 12, 90, 14, 62, 70, 58, 31, 7, 22, 83, 10, 67, 29, 76, 71, 14, 54, 15, 57, 68, 72, 38, 56, 85, 53, 61, 32, 92, 61, 18, 52, 72, 59, 65, 85, 28, 75, 67, 34, 96, 50, 43, 62, 30, 70, 85, 43, 76, 51, 51, 43, 22, 40, 50, 7, 92, 11, 90, 83, 23, 7, 87, 46, 17, 3, 82, 44, 77, 49, 78, 24, 50, 72, 86, 79, 94, 22, 73, 69, 72, 23, 63, 93, 62, 12, 51, 5, 22, 40, 39, 96, 98, 77, 41, 14, 32, 23, 10, 8, 23, 39, 32, 24, 62, 69, 54, 55, 90, 26, 75, 13, 100, 37, 57, 61, 49, 60, 17, 22, 51, 55, 70, 49, 84, 10, 14, 15, 84, 75, 74, 6, 13, 57, 29, 27, 25, 82, 81, 66, 59, 8, 30, 58, 44, 87, 18, 44, 98, 86, 18, 48, 93, 87, 96, 76, 48, 62, 90, 32, 88, 63, 89, 1, 20, 18, 27, 96, 51, 59, 14, 10, 18, 43, 67, 62, 81, 37, 57, 78, 22, 26, 26, 14, 64, 73, 41, 12, 86, 30, 43, 74, 45, 31, 26, 64, 100, 4, 11, 3, 14, 24, 12, 32, 67, 30, 45, 99, 66, 1, 77, 40, 79, 2, 5, 42, 26, 46, 53, 12, 27, 47, 85, 71, 30, 10, 86, 29, 13, 97, 31, 26, 20, 94, 9, 38, 24, 53, 37, 41, 54, 13, 80, 32, 66, 85, 73, 91, 82, 78, 54, 8, 24, 38, 79, 53, 99, 64, 34, 63, 60, 16, 41, 32, 62, 49, 69, 85, 2, 57, 25, 7, 21, 5, 90, 86, 41, 62, 29, 22, 91, 82, 29, 15, 72, 7, 19, 22, 23, 4, 85, 34, 20, 25, 65, 81, 73, 34, 17, 26, 42, 41, 32, 63, 97, 21, 100, 89, 35, 28, 10, 25, 62, 91, 91, 85, 49, 10, 6, 71, 65, 90, 5, 84, 14, 69, 16, 39, 54, 84, 64, 96, 77, 48, 10, 73, 68, 9, 62, 2, 37, 23, 27, 50, 13, 17, 34, 62, 78, 39, 32, 43, 81, 88, 78, 94, 57, 46, 84, 62, 29, 100, 9, 5, 47, 18, 30, 14, 27, 43, 68, 15, 65, 46, 16, 78, 62, 49, 91, 92, 39, 22, 86, 19, 10, 15, 65, 18, 60, 100, 31, 41, 99, 40, 45, 45, 57, 74, 11, 83, 16, 78, 49, 33, 23, 64, 10, 36, 64, 52, 79, 3, 25, 64, 21, 86, 31, 37, 3, 90, 37, 34, 30, 35, 73, 27, 32, 81, 52, 42, 16, 20, 71, 64, 52, 45, 28, 13, 80, 91, 64, 11, 45, 88, 26, 66, 74, 56, 54, 28, 98, 90, 61, 27, 25, 85, 5, 8, 66, 57, 49, 33, 76, 71, 96, 27, 15, 75, 39, 46, 18, 54, 8, 62, 41, 34, 79, 66, 89, 33, 94, 86, 74, 6, 65, 98, 91, 69, 5, 8, 25, 5, 40, 52, 27, 87, 78, 93, 14, 68, 91, 31, 21, 98, 44, 14, 31, 75, 79, 72, 59, 72, 9, 32, 78, 25, 82, 20, 94, 38, 79, 70, 43, 70, 22, 21, 56, 51, 14, 69, 19, 4, 51, 91, 1, 95, 4, 84, 21, 35, 7, 79, 58, 15, 10, 35, 40, 91, 6, 85, 81, 84, 6, 23, 53, 27, 95, 61, 30, 60, 81, 100, 63, 32, 90, 16, 78, 46, 51, 98, 32, 57, 28, 89, 71, 37, 76, 62, 80, 81, 46, 60, 17, 52, 34, 69, 30, 80, 81, 11, 40, 62, 10, 2, 93, 52, 69, 70, 49, 19, 19, 80, 75, 46, 68, 98, 34, 95, 59, 65, 76, 57, 76, 92, 60, 61, 12, 89, 41, 93, 100, 32, 54, 61, 33, 98, 12, 54, 19, 60, 72, 37, 91, 99, 34, 59, 96, 19, 5, 54, 36, 80, 62, 11, 23, 21, 24, 35, 10, 64, 79, 61, 95, 84, 21, 79, 81, 85, 84, 99, 44, 56, 87, 35, 6, 72, 45, 1, 90, 49, 6, 25, 81, 68, 88, 3, 88, 11, 89, 49, 26, 67, 61, 72, 2, 34, 50, 82, 18, 86, 80, 13, 93, 18, 47, 98, 89, 43, 50, 31, 44, 55, 55, 76, 74, 94, 78, 14, 4, 19, 14, 29, 37, 75, 100, 39, 60, 2, 20, 77, 87, 52, 89, 79, 21, 88, 28, 10, 30, 77, 40, 25, 83, 46, 100, 9, 40, 30, 22, 43, 48, 87, 24, 36, 13, 75, 74, 72, 76, 46, 48, 14, 49, 37, 44, 69, 76, 71, 30, 57, 99, 21, 82, 82, 67, 33, 90, 58, 62, 63, 52, 61, 1, 75, 97, 14, 50, 22, 85, 77, 19, 85, 43, 19, 73, 86, 40, 48, 9, 69, 4, 7, 90, 37, 40, 8, 70, 81, 65, 83, 43, 16, 44, 96, 43, 92, 9, 92, 65, 45, 20, 36, 81, 62, 54, 53, 100, 93, 52, 60, 14, 8, 18, 3, 44, 58, 62, 65, 38, 26, 48, 33, 93, 91, 28, 35, 34, 88, 78, 98, 84, 98, 85, 65, 11, 39, 17, 62, 83, 21, 73, 96, 28, 91, 50, 71, 48, 11, 88, 37, 36, 35, 69, 81, 77, 48, 15, 10, 87, 93, 59, 71, 42, 44, 35, 4, 34, 3, 18, 16, 23, 90, 64, 50, 80, 13, 73, 79, 24, 60, 16, 11, 46, 36, 91, 22, 36, 58, 83, 22, 2, 93, 44, 43, 36, 78, 98, 21, 33, 15, 89, 7, 57, 52, 57, 88, 64, 81, 67, 87, 92, 34, 50, 37, 69, 40, 10, 4, 49, 92, 78, 50, 84, 21, 92, 72, 51, 42, 44, 35, 8, 32, 41, 64, 83, 49, 4, 99, 29, 70, 85, 72, 3, 86, 60, 23, 78, 69, 79, 26, 60, 56, 76, 96, 28, 19, 19, 30, 60, 62, 64, 20, 94, 5, 35, 28, 5, 38, 26, 86, 7, 63, 57, 61, 48, 17, 84, 25, 85, 62, 3, 97, 69, 78, 92, 96, 96, 62, 78, 8, 23, 41, 79, 68, 97, 13, 96, 2, 51, 21, 87, 9, 83, 95, 70, 83, 11, 5, 59, 48, 66, 61, 44, 86, 38, 87, 81, 86, 48, 10, 45, 22, 3, 23, 90, 99, 87, 85, 52, 89, 57, 90, 98, 92, 37, 19, 74, 47, 75, 32, 46, 92, 45, 41, 77, 82, 79, 9, 19, 78, 19, 15, 100, 21, 37, 89, 71, 76, 25, 75, 64, 81, 64, 13, 72, 52, 83, 97, 51, 57, 81, 96, 48, 25, 37, 24, 58, 67, 85, 29, 45, 3, 43, 44, 75, 32, 84, 45, 7, 8, 19, 22, 88, 35, 35, 12, 86, 17, 60, 88, 26, 40, 84, 25, 16, 72, 1, 26, 38, 85, 54, 82, 39, 96, 77, 13, 27, 60, 57, 85, 67, 28, 7, 7, 14, 93, 18, 51, 9, 29, 39, 86, 69, 22, 11, 36, 45, 11, 61, 82, 47, 14, 16, 85, 62, 92, 97, 88, 4, 5, 25, 70, 32, 31, 76, 45, 23, 45, 48, 83, 74, 86, 69, 94, 59, 31, 29, 3, 93, 42, 36, 39, 55, 3, 23, 16, 95, 19, 56, 98, 23, 80, 19, 7, 62, 47, 3, 84, 91, 50, 66, 16, 35, 86, 61, 93, 68, 90, 47, 60, 83, 83, 98, 37, 85, 20, 5, 31, 90, 12, 80, 65, 91, 51, 71, 52, 97, 73, 87, 39, 75, 4, 55, 9, 42, 15, 54, 9, 56, 100, 69, 90, 34, 18, 27, 71, 90, 83, 1, 79, 94, 33, 43, 36, 83, 65, 39, 79, 90, 77, 69, 64, 80, 75, 24, 21, 42, 77, 30, 97, 29, 50, 87, 14, 67, 65, 84, 56, 99, 85, 87, 44, 69, 81, 31, 51, 46, 69, 81, 87, 97, 49, 50, 76, 24, 73, 49, 65, 2, 30, 13, 82, 79, 51, 95, 97, 67, 79, 5, 65, 15, 91, 60, 35, 71, 90, 85, 68, 10, 17, 54, 6, 65, 55, 34, 40, 80, 82, 56, 33, 11, 69, 14, 41, 71, 60, 89, 38, 90, 93, 54, 56, 35, 14, 90, 58, 3, 26, 25, 13, 42, 31, 70, 59, 37, 3, 50, 16, 36, 6, 100, 98, 74, 65, 38, 44, 77, 79, 33, 66, 71, 87, 74, 6, 100, 15, 15, 2, 41, 91, 66, 34, 73, 88, 44, 10, 42, 46, 77, 78, 51, 77, 75, 76, 93, 65, 71, 69, 43, 4, 87, 65, 90, 60, 22, 41, 74, 36, 94, 66, 27, 60, 52, 99, 99, 47, 60, 40, 92, 37, 17, 94, 65, 44, 69, 57, 60, 40, 26, 54, 95, 64, 18, 36, 23, 92, 76, 48, 79, 69, 66, 57, 80, 17, 56, 78, 15, 67, 70, 59, 55, 38, 52, 19, 81, 73, 28, 92, 64, 5, 45, 58, 68, 15, 93, 90, 6, 68, 89, 84, 88, 54, 41, 68, 22, 48, 97, 37, 66, 66, 47, 21, 4, 98, 39, 84, 22, 66, 28, 85, 22, 72, 94, 89, 86, 86, 30, 43, 5, 19, 79, 45, 24, 71, 12, 46, 18, 8, 34, 35, 74, 80, 55, 77, 29, 94, 12, 51, 11, 39, 87, 85, 63, 81, 73, 100, 18, 55, 43, 23, 25, 21, 67, 48, 91, 30, 93, 60, 37, 78, 94, 62, 9, 1, 90, 38, 46, 54, 40, 8, 44, 26, 92, 6, 6, 17, 6, 76, 71, 100, 50, 95, 20, 68, 94, 62, 97, 39, 73, 85, 16, 18, 99, 25, 18, 88, 14, 63, 41, 53, 71, 85, 30, 14, 42, 88, 30, 99, 63, 100, 98, 12, 46, 69, 79, 40, 82, 27, 78, 54, 11, 93, 24, 9, 69, 41, 97, 82, 56, 89, 34, 78, 25, 16, 91, 19, 3, 21, 17, 65, 72, 15, 76, 18, 35, 6, 57, 17, 32, 86, 22, 42, 78, 45, 3, 47, 38, 51, 80, 45, 39, 66, 22, 16, 81, 64, 34, 83, 84, 50, 47, 8, 16, 74, 25, 51, 31, 33, 19, 62, 18, 40, 55, 47, 85, 9, 45, 22, 59, 25, 66, 50, 90, 39, 65, 70, 2, 50, 4, 38, 99, 2, 45, 67, 27, 21, 69, 57, 53, 87, 70, 22, 26, 76, 68, 10, 85, 65, 83, 43, 89, 100, 44, 30, 90, 8, 99, 92, 9, 54, 81, 60, 55, 77, 26, 81, 97, 94, 89, 1, 80, 58, 74, 57, 33, 41, 19, 17, 5, 1, 12, 45, 53, 55, 74, 42, 15, 24, 85, 23, 77, 65, 82, 83, 41, 7, 63, 89, 52, 51, 89, 83, 60, 62, 40, 93, 55, 58, 61, 11, 10, 72, 56, 62, 27, 81, 56, 41, 5, 40, 63, 81, 5, 45, 64, 97, 3, 78, 86, 55, 81, 26, 89, 40, 40, 28, 32, 94, 37, 45, 56, 99, 16, 11, 60, 94, 92, 15, 34, 48, 7, 49, 80, 63, 45, 95, 59, 99, 73, 96, 5, 5, 22, 94, 44, 61, 73, 28, 6, 10, 72, 13, 8, 87, 24, 19, 81, 67, 86, 66, 66, 92, 66, 45, 6, 62, 40, 64, 61, 64, 60, 65, 68, 33, 10, 11, 45, 83, 90, 2, 44, 61, 14, 3, 100, 89, 73, 32, 7, 58, 49, 72, 1, 15, 17, 6, 76, 8, 22, 88, 71, 81, 53, 90, 65, 62, 100, 9, 96, 90, 10, 39, 2, 75, 93, 1, 64, 66, 84, 70, 75, 33, 42, 76, 47, 58, 33, 74, 17, 54, 62, 87, 86, 66, 76, 2, 79, 27, 10, 27, 68, 71, 17, 70, 46, 10, 22, 9, 75, 6, 78, 49, 38, 71, 76, 36, 80, 61, 61, 96, 66, 74, 34, 52, 39, 61, 5, 70, 88, 15, 96, 7, 37, 12, 28, 82, 21, 2, 42, 47, 7, 72, 48, 96, 42, 75, 83, 22, 35, 43, 17, 1, 69, 3, 4, 7, 63, 8, 28, 50, 74, 23, 9, 11, 35, 36, 44, 7, 37, 86, 6, 95, 9, 53, 42, 50, 27, 24, 23, 14, 19, 92, 14, 87, 94, 17, 45, 56, 76, 73, 58, 50, 95, 66, 60, 81, 53, 55, 40, 90, 92, 45, 36, 100, 97, 78, 50, 75, 1, 24, 88, 71, 15, 53, 57, 60, 69, 2, 16, 97, 74, 25, 46, 20, 42, 57, 53, 94, 63, 92, 35, 55, 36, 71, 54, 84, 48, 55, 58, 100, 79, 98, 71, 45, 50, 27, 5, 71, 80, 72, 67, 5, 48, 64, 77, 89, 72, 29, 82, 34, 20, 69, 88, 55, 39, 94, 90, 86, 48, 47, 85, 78, 96, 55, 23, 46, 34, 79, 16, 13, 2, 34, 70, 49, 97, 46, 89, 68, 74, 22, 53, 93, 90, 41, 99, 28, 34, 88, 65, 33, 86, 50, 11, 82, 56, 85, 27, 41, 15, 94, 54, 68, 27, 75, 16, 23, 20, 4, 42, 45, 77, 94, 37, 67, 86, 87, 94, 71, 74, 11, 4, 11, 60, 66, 92, 67, 2, 70, 8, 16, 63, 13, 83, 89, 87, 50, 63, 58, 5, 56, 2, 81, 2, 90, 47, 87, 76, 93, 10, 1, 3, 65, 11, 14, 30, 55, 32, 83, 24, 39, 98, 39, 3, 32, 79, 41, 33, 42, 98, 37, 97, 99, 69, 98, 40, 68, 37, 15, 12, 46, 67, 66, 10, 78, 79, 91, 84, 62, 73, 59, 1, 22, 97, 55, 5, 76, 96, 37, 69, 93, 25, 17, 44, 45, 67, 83, 12, 3, 50, 75, 100, 16, 40, 61, 45, 70, 51, 28, 32, 75, 87, 84, 96, 83, 38, 52, 10, 33, 88, 78, 78, 64, 47, 73, 8, 13, 7, 72, 67, 56, 46, 66, 24, 86, 78, 68, 55, 80, 96, 38, 54, 34, 21, 1, 16, 59, 52, 78, 43, 91, 55, 72, 54, 1, 44, 61, 65, 51, 32, 31, 58, 78, 48, 81, 15, 25, 49, 21, 4, 96, 59, 57, 29, 79, 9, 44, 89, 60, 73, 84, 50, 80, 55, 55, 32, 51, 16, 97, 53, 99, 27, 10, 76, 75, 91, 42, 99, 39, 63, 55, 86, 21, 63, 14, 51, 72, 9, 92, 31, 82, 27, 33, 61, 33, 87, 92, 83, 54, 88, 35, 53, 67, 97, 80, 93, 87, 22, 43, 77, 36, 97, 62, 8, 60, 75, 58, 31, 83, 1, 13, 64, 79, 97, 76, 12, 36, 68, 46, 89, 7, 33, 93, 25, 29, 25, 17, 15, 98, 60, 43, 33, 56, 4, 40, 67, 30, 49, 49, 64, 50, 14, 80, 28, 10, 55, 91, 45, 74, 37, 86, 81, 69, 78, 5, 49, 54, 74, 63, 51, 33, 57, 83, 40, 12, 22, 59, 93, 23, 7, 56, 24, 20, 35, 3, 30, 42, 94, 26, 15, 82, 63, 47, 50, 93, 4, 98, 46, 77, 12, 97, 61, 20, 31, 52, 31, 53, 10, 23, 27, 17, 78, 50, 88, 65, 52, 69, 58, 45, 95, 72, 26, 9, 71, 27, 1, 26, 76, 47, 54, 87, 95, 14, 58, 25, 65, 88, 29, 27, 62, 55, 43, 92, 4, 82, 56, 56, 51, 13, 52, 97, 36, 78, 5, 6, 56, 6, 83, 32, 4, 36, 70, 98, 49, 28, 74, 66, 15, 3, 44, 77, 57, 86, 68, 13, 19, 75, 20, 69, 39, 71, 65, 74, 48, 22, 32, 4, 79, 14, 87, 82, 50, 56, 31, 50, 83, 56, 67, 50, 58, 10, 78, 67, 47, 45, 31, 66, 71, 50, 86, 9, 20, 3, 34, 20, 24, 17, 75, 2, 31, 61, 35, 32, 16, 17, 33, 99, 72, 52, 100, 30, 13, 77, 48, 60, 73, 78, 77, 43, 27, 14, 3, 46, 16, 36, 17, 91, 53, 91, 92, 35, 51, 78, 18, 67, 94, 2, 17, 66, 53, 16, 47, 18, 92, 94, 29, 64, 23, 57, 58, 49, 70, 60, 46, 38, 47, 63, 28, 51, 53, 72, 85, 56, 49, 54, 22, 43, 56, 90, 60, 60, 57, 58, 77, 48, 51, 5, 63, 25, 13, 20, 25, 83, 31, 70, 20, 77, 84, 47, 28, 89, 18, 64, 44, 19, 18, 17, 13, 25, 58, 72, 36, 14, 29, 65, 13, 31, 21, 27, 7, 34, 98, 31, 16, 28, 52, 87, 56, 36, 33, 83, 76, 3, 99, 71, 73, 68, 87, 85, 92, 44, 8, 79, 9, 88, 43, 21, 70, 64, 47, 76, 97, 44, 6, 64, 71, 57, 50, 78, 44, 34, 13, 71, 88, 11, 41, 60, 78, 27, 44, 21, 22, 3, 51, 30, 90, 94, 2, 59, 57, 48, 34, 5, 91, 91, 68, 13, 100, 17, 43, 43, 2, 55, 14, 90, 65, 6, 49, 94, 33, 45, 66, 6, 47, 68, 88, 89, 61, 89, 47, 69, 37, 33, 73, 79, 23, 92, 44, 22, 8, 86, 17, 62, 92, 82, 51, 8, 87, 99, 53, 71, 95, 70, 77, 42, 37, 64, 82, 98, 4, 28, 18, 40, 12, 91, 71, 35, 34, 66, 8, 42, 3, 24, 55, 94, 5, 5, 53, 92, 3, 5, 62, 50, 74, 90, 43, 10, 5, 24, 59, 9, 51, 77, 100, 15, 19, 22, 49, 52, 87, 56, 45, 41, 32, 99, 34, 36, 3, 86, 79, 58, 42, 93, 7, 15, 82, 49, 77, 39, 72, 35, 47, 74, 63, 98, 88, 81, 20, 88, 33, 6, 96, 77, 99, 27, 28, 84, 14, 30, 22, 45, 87, 63, 37, 45, 30, 70, 93, 6, 8, 16, 92, 6, 42, 55, 4, 29, 87, 75, 69, 19, 32, 64, 48, 30, 90, 75, 14, 55, 56, 35, 99, 95, 97, 87, 39, 78, 57, 84, 83, 16, 51, 27, 74, 92, 81, 29, 21, 67, 3, 89, 38, 34, 4, 37, 64, 93, 63, 29, 99, 18, 63, 98, 12, 11, 84, 3, 89, 92, 38, 23, 60, 88, 49, 85, 80, 29, 13, 52, 48, 67, 40, 37, 100, 95, 73, 15, 87, 35, 43, 85, 4, 57, 34, 68, 68, 70, 70, 56, 61, 7, 78, 72, 94, 27, 56, 25, 7, 20, 76, 6, 86, 67, 42, 86, 61, 14, 52, 99, 48, 95, 36, 52, 51, 69, 71, 70, 38, 40, 77, 51, 98, 7, 22, 43, 33, 78, 68, 91, 97, 95, 97, 35, 62, 38, 72, 22, 4, 23, 73, 3, 69, 8, 6, 72, 76, 76, 41, 14, 67, 18, 64, 64, 24, 37, 7, 8, 14, 26, 50, 63, 20, 98, 97, 81, 88, 20, 55, 91, 42, 27, 93, 11, 34, 51, 82, 61, 26, 74, 26, 93, 91, 41, 56, 66, 78, 14, 25, 91, 91, 75, 5, 11, 72, 53, 43, 59, 72, 49, 49, 66, 27, 94, 76, 12, 44, 9, 73, 21, 34, 50, 13, 77, 91, 21, 42, 68, 86, 67, 10, 77, 41, 15, 39, 64, 19, 33, 23, 43, 82, 23, 8, 60, 16, 35, 24, 11, 43, 48, 32, 28, 97, 96, 4, 87, 16, 46, 54, 2, 64, 16, 30, 56, 82, 68, 19, 100, 100, 41, 42, 33, 16, 49, 45, 31, 83, 68, 94, 77, 15, 25, 5, 11, 20, 60, 50, 88, 57, 55, 89, 20, 70, 70, 75, 51, 37, 46, 51, 88, 38, 44, 73, 53, 45, 17, 36, 27, 84, 29, 56, 98, 5, 12, 60, 76, 71, 9, 63, 28, 16, 3, 99, 85, 72, 74, 36, 60, 71, 38, 48, 8, 33, 20, 61, 77, 36, 96, 56, 71, 76, 63, 20, 80, 74, 79, 7, 96, 40, 70, 75, 55, 24, 74, 91, 96, 99, 78, 7, 69, 67, 54, 76, 100, 25, 88, 28, 60, 83, 35, 82, 10, 97, 1, 89, 22, 32, 96, 70, 23, 17, 44, 29, 40, 69, 19, 87, 67, 97, 94, 87, 15, 99, 15, 66, 24, 2, 94, 35, 37, 28, 17, 46, 77, 69, 87, 98, 100, 34, 19, 22, 50, 63, 2, 41, 83, 21, 80, 50, 69, 25, 88, 83, 23, 2, 49, 98, 4, 94, 33, 92, 73, 1, 37, 49, 69, 75, 99, 21, 8, 17, 94, 9, 31, 96, 50, 14, 68, 81, 15, 88, 5, 2, 70, 79, 4, 70, 29, 59, 15, 13, 2, 88, 13, 90, 36, 33, 65, 86, 53, 72, 3, 99, 81, 33, 46, 82, 98, 13, 14, 12, 100, 70, 14, 21, 48, 69, 43, 28, 79, 57, 40, 80, 96, 52, 69, 84, 37, 33, 69, 41, 57, 23, 39, 89, 56, 84, 70, 53, 48, 35, 17, 47, 4, 30, 68, 3, 98, 62, 31, 28, 18, 70, 7, 66, 74, 27, 49, 10, 12, 17, 50, 68, 40, 41, 56, 47, 24, 77, 51, 72, 63, 67, 70, 66, 96, 89, 68, 45, 50, 98, 24, 20, 68, 30, 85, 41, 9, 33, 2, 20, 1, 51, 39, 40, 91, 46, 38, 67, 74, 89, 90, 36, 55, 59, 1, 3, 48, 20, 99, 49, 70, 23, 68, 37, 4, 4, 29, 12, 88, 30, 83, 89, 32, 73, 80, 75, 18, 18, 41, 43, 58, 30, 78, 64, 40, 30, 66, 39, 2, 17, 88, 71, 39, 7, 59, 42, 11, 39, 6, 98, 20, 40, 38, 51, 13, 18, 25, 82, 87, 17, 25, 44, 46, 54, 7, 38, 36, 73, 76, 89, 89, 63, 59, 79, 70, 17, 72, 32, 7, 77, 29, 26, 69, 67, 76, 81, 36, 53, 14, 22, 69, 90, 65, 67, 44, 71, 4, 31, 95, 79, 19, 35, 94, 29, 13, 63, 97, 37, 46, 3, 65, 26, 28, 33, 44, 55, 65, 79, 7, 79, 100, 28, 68, 16, 94, 63, 39, 49, 45, 85, 79, 15, 20, 72, 43, 84, 86, 39, 20, 31, 93, 85, 57, 20, 69, 100, 27, 34, 79, 33, 12, 30, 12, 31, 46, 57, 94, 36, 5, 90, 20, 36, 5, 39, 7, 99, 75, 93, 38, 46, 23, 82, 82, 31, 54, 51, 31, 80, 84, 61, 64, 47, 90, 76, 29, 87, 84, 74, 22, 41, 64, 42, 76, 68, 32, 82, 66, 58, 26, 55, 56, 49, 37, 37, 79, 42, 39, 61, 21, 74, 21, 36, 20, 11, 11, 49, 49, 47, 22, 71, 87, 37, 64, 62, 4, 47, 95, 22, 57, 21, 76, 12, 21, 64, 48, 99, 57, 87, 12, 77, 60, 32, 65, 32, 94, 27, 32, 43, 73, 5, 65, 59, 42, 28, 72, 45, 26, 67, 18, 82, 87, 46, 93, 7, 61, 41, 57, 18, 79, 68, 46, 90, 52, 10, 21, 45, 37, 52, 87, 9, 57, 51, 68, 98, 30, 91, 94, 8, 57, 12, 89, 95, 57, 82, 1, 17, 74, 10, 34, 4, 29, 32, 93, 80, 41, 66, 25, 77, 17, 63, 86, 25, 66, 5, 74, 47, 95, 68, 54, 4, 31, 43, 98, 39, 76, 51, 55, 1, 60, 41, 56, 88, 72, 48, 20, 64, 13, 44, 41, 82, 58, 26, 6, 23, 82, 32, 70, 28, 51, 23, 31, 81, 17, 29, 19, 44, 79, 25, 44, 90, 17, 99, 29, 40, 99, 48, 4, 11, 43, 44, 44, 1, 21, 2, 23, 54, 33, 44, 81, 83, 19, 12, 15, 35, 92, 85};
+
+int output_array[NUM_BINS];
+int expected_array[NUM_BINS] = {7079, 7237, 7182, 7228, 7274};
+
+int output_array_accel[NUM_BINS*NUM_ACCELS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
diff --git a/documentation/tutorial_pact_2022/04-simd/Exercise3/solution/bambu.sh b/documentation/tutorial_pact_2022/04-simd/Exercise3/solution/bambu.sh
new file mode 100755
index 000000000..84dae7853
--- /dev/null
+++ b/documentation/tutorial_pact_2022/04-simd/Exercise3/solution/bambu.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+script=$(readlink -e $0)
+root_dir=$(dirname $script)/..
+
+mkdir test2
+cd test2
+bambu ${root_dir}/histogram.c \
+ --compiler=I386_GCC49 --experimental-setup=BAMBU-BALANCED-MP \
+ --device-name=5SGXEA7N2F45C1 --clock-period=10 \
+ -fopenmp-simd=2 \
+ -fwhole-program -fno-delete-null-pointer-checks -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 \
+ --simulate --pretty-print=output.c \
+ "$@" |& tee log.txt
+cd ..
+mkdir test3
+cd test3
+bambu ${root_dir}/histogram.c \
+ --compiler=I386_GCC49 --experimental-setup=BAMBU-BALANCED-MP \
+ --device-name=5SGXEA7N2F45C1 --clock-period=10 \
+ -fopenmp-simd=3 \
+ -fwhole-program -fno-delete-null-pointer-checks -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 \
+ --simulate --pretty-print=output.c \
+ "$@" |& tee log.txt
+cd ..
+mkdir test4
+cd test4
+bbambu ${root_dir}/histogram.c \
+ --compiler=I386_GCC49 --experimental-setup=BAMBU-BALANCED-MP \
+ --device-name=5SGXEA7N2F45C1 --clock-period=10 \
+ -fopenmp-simd=4 \
+ -fwhole-program -fno-delete-null-pointer-checks -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 \
+ --simulate --pretty-print=output.c \
+ "$@" |& tee log.txt
+cd ..
+mkdir test8
+cd test8
+bambu ${root_dir}/histogram.c \
+ --compiler=I386_GCC49 --experimental-setup=BAMBU-BALANCED-MP \
+ --device-name=5SGXEA7N2F45C1 --clock-period=10 \
+ -fopenmp-simd=8 \
+ -fwhole-program -fno-delete-null-pointer-checks -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 \
+ --simulate --pretty-print=output.c \
+ "$@" |& tee log.txt
+cd ..
diff --git a/documentation/tutorial_pact_2022/README.md b/documentation/tutorial_pact_2022/README.md
new file mode 100644
index 000000000..44380b761
--- /dev/null
+++ b/documentation/tutorial_pact_2022/README.md
@@ -0,0 +1 @@
+[](https://colab.research.google.com/github/ferrandi/PandA-bambu/blob/main/documentation/tutorial_pact_2022/bambu.ipynb)
diff --git a/documentation/tutorial_pact_2022/bambu.ipynb b/documentation/tutorial_pact_2022/bambu.ipynb
new file mode 100644
index 000000000..6825aae64
--- /dev/null
+++ b/documentation/tutorial_pact_2022/bambu.ipynb
@@ -0,0 +1,673 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "# **Initial setup**\n",
+ "\n",
+ "Install Bambu and required packages:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "!echo \"deb http://ppa.launchpad.net/git-core/ppa/ubuntu $(cat /etc/os-release | grep UBUNTU_CODENAME | sed 's/.*=//g') main\" >> /etc/apt/sources.list.d/git-core.list\n",
+ "!apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A1715D88E1DF1F24\n",
+ "!apt-get update\n",
+ "!apt-get install -y --no-install-recommends build-essential ca-certificates gcc-multilib git iverilog verilator wget\n",
+ "!wget https://release.bambuhls.eu/appimage/bambu-pact22.AppImage\n",
+ "!chmod +x bambu-*.AppImage\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/bambu\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/spider\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/tree-panda-gcc\n",
+ "!ln -sf $PWD/bambu-*.AppImage /bin/clang-12\n",
+ "!git clone --depth 1 --filter=blob:none --sparse https://github.com/ferrandi/PandA-bambu.git\n",
+ "%cd PandA-bambu\n",
+ "!git sparse-checkout set documentation/tutorial_pact_2022\n",
+ "%cd ..\n",
+ "!mv PandA-bambu/documentation/tutorial_pact_2022/ bambu-tutorial"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "# **Productive HLS with Bambu**\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "## **Exercise 1**\n",
+ "\n",
+ "Have a look at the C code in /content/bambu-tutorial/01-introduction/Exercise1/icrc.c\n",
+ "\n",
+ "Launch bambu:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/01-introduction/Exercise1\n",
+ "!bambu icrc.c --top-fname=icrc1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Inspect the generated Verilog file in the explorer tab on the left (icrc1.v)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Take a brief look at the available Bambu options:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "!bambu --help"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Modify the command line to change the amount of debug information displayed, and generate VHDL instead of Verilog code:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "!bambu icrc.c --top-fname=icrc1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "## **Exercise 2**\n",
+ "\n",
+ "We remain on the same input C code as before, let's add co-simulation:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/01-introduction/Exercise1\n",
+ "!bambu icrc.c --top-fname=icrc1 --simulate --simulator=VERILATOR"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "We did not specify any input values. Inspect what Bambu generated automatically:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "!cat test.xml"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "You can find the actual testbench in HLS_output/simulation."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "## **Exercise 3**\n",
+ "\n",
+ "Implement and synthesize a module that returns the minimum and maximum value in an array of integers with arbitrary size.\n",
+ "\n",
+ "Write the input C code starting from this snippet:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%%writefile /content/bambu-tutorial/01-introduction/Exercise2/minmax.c\n",
+ "void min_max(int input[10], int* out_max)\n",
+ "{\n",
+ " int local_max = input[0];\n",
+ " int i = 0;\n",
+ " for(i = 0; i < 10; i++)\n",
+ " {\n",
+ " if(input[i] > local_max)\n",
+ " {\n",
+ " local_max = input[i];\n",
+ " }\n",
+ " }\n",
+ " *out_max = local_max;\n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Write a testbench to test arrays with different elements and different sizes.\n",
+ "\n",
+ "Start from the XML snippet below **(parameter names need to correspond to function arguments in your code)**:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%%writefile /content/bambu-tutorial/01-introduction/Exercise2/testbench.xml\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Synthesize with Bambu and simulate with Verilator **(double check the command line if you changed file/function names)**:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/01-introduction/Exercise2/\n",
+ "!bambu minmax.c --top-fname=min_max --generate-tb=testbench.xml --simulate --simulator=VERILATOR"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "What happens if you pass an array with a different number of elements than what is specified in num_elements? **(remember to fix the XML file afterwards, we will need it again)**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "## **Exercise 4**\n",
+ "\n",
+ "Bambu can synthesize accelerators described in an LLVM IR through the Clang frontend.\n",
+ "\n",
+ "Synthesize /content/bambu-tutorial/01-introduction/Exercise3/matmul.ll, which contains a matrix multiplication kernel generated by [soda-opt](https://gitlab.pnnl.gov/sodalite/soda-opt):"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/01-introduction/Exercise3/\n",
+ "!bambu matmul.ll --top-fname=main_kernel --generate-tb=test.xml --simulate --simulator=VERILATOR --compiler=I386_CLANG12"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Note: kernels generated by soda-opt require at least Clang 10."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "## **Exercise 5**\n",
+ "\n",
+ "Let's go back to the C code that finds minumim and maximum in an array of numbers, and compare performance across different target platforms and frequencies.\n",
+ "\n",
+ "Start from the given command and modify the options appropriately to test the following combinations:\n",
+ "\n",
+ "\n",
+ "* xc4vlx100-10ff1513 (Xilinx Virtex 4) – 66MHz\n",
+ "* 5SGXEA7N2F45C1 (Intel Stratix V) – 200MHz\n",
+ "* xc7vx690t-3ffg1930-VVD (Xilinx Virtex 7) – 100MHz\n",
+ "* xc7vx690t-3ffg1930-VVD (Xilinx Virtex 7) – 333MHz\n",
+ "* xc7vx690t-3ffg1930-VVD (Xilinx Virtex 7) – 400MHz\n",
+ "* nangate45 (45nm ASIC) – 200MHz\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/01-introduction/Exercise2\n",
+ "!bambu minmax.c --top-fname=min_max --device-name=xc4vlx100-10ff1513 --clock-period=15 --no-iob --simulate --simulator=VERILATOR --generate-tb=testbench.xml"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Look also at the different simulation and synthesis scripts generated by Bambu."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "## **Exercise 6**\n",
+ "\n",
+ "Ask Bambu to print a C verion of its internal IR and all relevant graphs:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "!bambu minmax.c --top-fname=min_max --pretty-print=out.c --print-dot"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Look at /content/bambu-tutorial/01-introduction/Exercise2/out.c and then print the FSM graph:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "from graphviz import Source\n",
+ "Source.from_file('HLS_output/dot/min_max/fsm.dot')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "## **Exercise 7**\n",
+ "\n",
+ "Bambu automatically enables the synthesis of function proxies to save area.\n",
+ "\n",
+ "Synthesize the dummy example in /content/bambu-tutorial/01-introduction/Exercise4/proxies.c, and then look for the PROXY_PREF_funcC module in the generated Verilog:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/01-introduction/Exercise4/\n",
+ "!bambu proxies.c --top-fname=funcA"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Note: floating point operations are synthesized as functions! Look at the kernels in /content/bambu-tutorial/01-introduction/Exercise5a/helm.c (adapted from the computational fluid dynamics applications in the [EVEREST](https://everest-h2020.eu/) project). Synthesize one of them:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/01-introduction/Exercise5a/\n",
+ "!bambu helm.c --top-fname=helm_naive --simulate --simulator=VERILATOR --generate-tb=test.xml --compiler=I386_CLANG6"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "Run the same synthesis disabling function proxies:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "!bambu helm.c --top-fname=helm_naive --simulate --simulator=VERILATOR --generate-tb=test.xml --compiler=I386_CLANG6 --disable-function-proxy"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "NKH7rLb8fgk7"
+ },
+ "source": [
+ "## **Exercise 8** \n",
+ "Generate an accelerator with outer loop vectorization, try different vector sizes (-fopenmp-simd) and see how performance changes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": ""
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/04-simd/Exercise1/\n",
+ "!bambu --compiler=I386_GCC49 --device-name=5SGXEA7N2F45C1 --simulate -fwhole-program -fno-delete-null-pointer-checks --clock-period=10 --experimental-setup=BAMBU-BALANCED-MP -fdisable-tree-cunroll -fdisable-tree-ivopts --param max-inline-insns-auto=1000 histogram.c -fopenmp-simd=1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": ""
+ },
+ "source": [
+ "## **Other examples**\n",
+ "\n",
+ "You can play around with a set of other examples that contain different applications and showcase different features of Bambu.\n",
+ "\n",
+ " - /content/bambu-tutorial/01-introduction/Exercise5: LU decomposition\n",
+ " - /content/bambu-tutorial/01-introduction/Exercise6: integration of IPs written in Verilog\n",
+ " - /content/bambu-tutorial/01-introduction/Exercise7: sorting algorithm\n",
+ " - /content/bambu-tutorial/01-introduction/Exercise8: cryptographic core\n",
+ " - /content/bambu-tutorial/01-introduction/Exercise9: search and insertion in a binary tree\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "IlQDB6nqHqz0"
+ },
+ "source": [
+ "# **Optimizations**\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dWWTy4TGZLfk"
+ },
+ "source": [
+ "## **Exercise 1** \n",
+ "\n",
+ "Modify Bambu options to evaluate the effect of:\n",
+ "\n",
+ "\n",
+ "* different levels of optimization (-O0, -O1, -O2, -O3, -Os)\n",
+ "* vectorization (-ftree-vectorize)\n",
+ "* inlining (-finline-limit=100000)\n",
+ "* different frontend compilers (--compiler={I386_GCC49|I386_GCC7|I386_CLANG6|I386_CLANG12})\n",
+ "\n",
+ "#### **ADPCM from CHStone benchmark suite**\n",
+ "Adaptive Diferential Pulse-Code Modulation is an algorithm used to perform audio compression (mainly in telephony). It is part of the CHStone benchmark suite for C-based HLS tools.\n",
+ "* Yuko Hara, Hiroyuki Tomiyama, Shinya Honda and Hiroaki Takada, \"Proposal and Quantitative Analysis of the CHStone Benchmark Program Suite for Practical C-based High-level Synthesis\", *Journal of Information Processing*, Vol. 17, pp.242-254, (2009)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "YOXiFqzSIDR9"
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/03-optimizations/Exercise1/\n",
+ "!bambu adpcm.c -O0 --simulate"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "mJOV50V4IiE2"
+ },
+ "source": [
+ "## **Exercise 2** \n",
+ "\n",
+ "Use the command that yielded the best result in Exercise 1 and verify if SDC scheduling can introduce further improvements.\n",
+ "\n",
+ "* -s or --speculative-sdc-scheduling"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Qi_ZpIr1IzZ7"
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/03-optimizations/Exercise1/\n",
+ "!bambu adpcm.c -O0 --simulate"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "StGBkKaJJEfr"
+ },
+ "source": [
+ "## **Exercise 3**\n",
+ "\n",
+ "Modify Bambu options to evaluate the effect of different integer division implementations.\n",
+ "\n",
+ "--hls-div=\n",
+ "* none - use a HDL based pipelined restoring division\n",
+ "* nr1 - use a C-based non-restoring division with unrolling factor equal to 1 (default)\n",
+ "* nr2 - use a C-based non-restoring division with unrolling factor equal to 2\n",
+ "* NR - use a C-based Newton-Raphson division\n",
+ "* as - use a C-based align divisor shift dividend method\n",
+ "\n",
+ "#### **FPDiv from CHStone**\n",
+ "Soft floating-point division implementation from the CHStone benchmark suite for C-based HLS.\n",
+ "* Yuko Hara, Hiroyuki Tomiyama, Shinya Honda and Hiroaki Takada, \"Proposal and Quantitative Analysis of the CHStone Benchmark Program Suite for Practical C-based High-level Synthesis\", *Journal of Information Processing*, Vol. 17, pp.242-254, (2009).\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "bnEJ4nwuJLfo"
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/03-optimizations/Exercise3/\n",
+ "!bambu dfdiv.c --simulate --clock-period=15 --hls-div=none"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "YSRwNv1o2Jqx"
+ },
+ "source": [
+ "## **Exercise 4** \n",
+ "\n",
+ "Write C implementation that compute the following function:\n",
+ "\n",
+ "# $awesome\\_math(a,b,c) = acos(\\frac{a^2+b^2-c^2}{2ab})$\n",
+ "\n",
+ "Experiment with single and double precision data types, different softfloat and libm implementations offered by bambu.\n",
+ "\n",
+ "Start by editing this code and then try different bambu options:\n",
+ "* Different floating-point arithmetic implementations (--softfloat, --soft-fp, --flopoco)\n",
+ "* Different libm implementations (--libm-std-rounding)\n",
+ "* Different square implementation (pow, simple multiplication)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "LuhiArbj6XnA"
+ },
+ "outputs": [],
+ "source": [
+ "%%writefile /content/bambu-tutorial/03-optimizations/Exercise4/module.c\n",
+ "#include \n",
+ "float awesome_math(float a, float b, float c)\n",
+ "{\n",
+ " return acosf((powf(a,2) + powf(b,2) - powf(c,2))/(2*a*b));\n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "_Rg4Gthy2vDm"
+ },
+ "outputs": [],
+ "source": [
+ "%cd /content/bambu-tutorial/03-optimizations/Exercise4/\n",
+ "!bambu module.c -O3 -lm --simulate --top-fname=awesome_math --generate-tb=\"a=3.0,b=4.0,c=5.0\" --speculative-sdc-scheduling --libm-std-rounding --hls-div=none --soft-float"
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "collapsed_sections": [],
+ "name": "bambu.ipynb",
+ "provenance": [],
+ "toc_visible": true
+ },
+ "interpreter": {
+ "hash": "c2ded5060c890e0765904e643087c411be8eeadcfb591bbeef60065a3a6a4202"
+ },
+ "kernelspec": {
+ "display_name": "Python 3.9.7 ('base')",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}