1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkThreadedSynchronizedTemplates3D.cxx
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14 =========================================================================*/
15 #include "vtkThreadedSynchronizedTemplates3D.h"
16
17 #include "vtkCellArray.h"
18 #include "vtkCellData.h"
19 #include "vtkCharArray.h"
20 #include "vtkDoubleArray.h"
21 #include "vtkFloatArray.h"
22 #include "vtkInformation.h"
23 #include "vtkInformationIntegerVectorKey.h"
24 #include "vtkInformationVector.h"
25 #include "vtkIntArray.h"
26 #include "vtkLongArray.h"
27 #include "vtkMath.h"
28 #include "vtkMultiBlockDataSet.h"
29 #include "vtkObjectFactory.h"
30 #include "vtkPointData.h"
31 #include "vtkPolyData.h"
32 #include "vtkPolygonBuilder.h"
33 #include "vtkShortArray.h"
34 #include "vtkSmartPointer.h"
35 #include "vtkStreamingDemandDrivenPipeline.h"
36 #include "vtkStructuredPoints.h"
37 #include "vtkUnsignedCharArray.h"
38 #include "vtkUnsignedIntArray.h"
39 #include "vtkUnsignedLongArray.h"
40 #include "vtkUnsignedShortArray.h"
41
42 #include <math.h>
43
44 #include "vtkSMPTools.h"
45 #include "vtkNew.h"
46 #include "vtkExtentTranslator.h"
47
48 vtkStandardNewMacro(vtkThreadedSynchronizedTemplates3D);
49
50 //----------------------------------------------------------------------------
51 // Description:
52 // Construct object with initial scalar range (0,1) and single contour value
53 // of 0.0. The ImageRange are set to extract the first k-plane.
vtkThreadedSynchronizedTemplates3D()54 vtkThreadedSynchronizedTemplates3D::vtkThreadedSynchronizedTemplates3D()
55 {
56 this->ContourValues = vtkContourValues::New();
57 this->ComputeNormals = 1;
58 this->ComputeGradients = 0;
59 this->ComputeScalars = 1;
60 this->GenerateTriangles = 1;
61
62 this->ArrayComponent = 0;
63
64 // by default process active point scalars
65 this->SetInputArrayToProcess(0,0,0,vtkDataObject::FIELD_ASSOCIATION_POINTS,
66 vtkDataSetAttributes::SCALARS);
67 }
68
69 //----------------------------------------------------------------------------
~vtkThreadedSynchronizedTemplates3D()70 vtkThreadedSynchronizedTemplates3D::~vtkThreadedSynchronizedTemplates3D()
71 {
72 this->ContourValues->Delete();
73 }
74
75 //----------------------------------------------------------------------------
76 // Overload standard modified time function. If contour values are modified,
77 // then this object is modified as well.
GetMTime()78 unsigned long vtkThreadedSynchronizedTemplates3D::GetMTime()
79 {
80 unsigned long mTime=this->Superclass::GetMTime();
81 unsigned long mTime2=this->ContourValues->GetMTime();
82
83 mTime = ( mTime2 > mTime ? mTime2 : mTime );
84 return mTime;
85 }
86
87
88 //----------------------------------------------------------------------------
vtkThreadedSynchronizedTemplates3DInitializeOutput(int * ext,vtkImageData * input,int estimatedNumberOfPieces,vtkPolyData * o,vtkFloatArray * scalars,vtkFloatArray * normals,vtkFloatArray * gradients,vtkDataArray * inScalars)89 static void vtkThreadedSynchronizedTemplates3DInitializeOutput(
90 int *ext,vtkImageData *input, int estimatedNumberOfPieces,
91 vtkPolyData *o, vtkFloatArray *scalars, vtkFloatArray *normals,
92 vtkFloatArray *gradients, vtkDataArray *inScalars)
93 {
94 vtkPoints *newPts;
95 vtkCellArray *newPolys;
96 long estimatedSize;
97
98 estimatedSize = (int) pow ((double)
99 ((ext[1]-ext[0]+1)*(ext[3]-ext[2]+1)*(ext[5]-ext[4]+1)), .75);
100 if (estimatedSize < 1024)
101 {
102 estimatedSize = 1024;
103 }
104 estimatedSize /= estimatedNumberOfPieces;
105
106 newPts = vtkPoints::New();
107 newPts->Allocate(estimatedSize,estimatedSize);
108 newPolys = vtkCellArray::New();
109 newPolys->Allocate(newPolys->EstimateSize(estimatedSize,3));
110
111 o->GetPointData()->CopyAllOn();
112 // It is more efficient to just create the scalar array
113 // rather than redundantly interpolate the scalars.
114 if (input->GetPointData()->GetScalars() == inScalars)
115 {
116 o->GetPointData()->CopyScalarsOff();
117 }
118 else
119 {
120 o->GetPointData()->CopyFieldOff(inScalars->GetName());
121 }
122
123 if (normals)
124 {
125 normals->SetNumberOfComponents(3);
126 normals->Allocate(3*estimatedSize,3*estimatedSize/2);
127 normals->SetName("Normals");
128 }
129 if (gradients)
130 {
131 gradients->SetNumberOfComponents(3);
132 gradients->Allocate(3*estimatedSize,3*estimatedSize/2);
133 gradients->SetName("Gradients");
134 }
135 if (scalars)
136 {
137 // A temporary name.
138 scalars->SetName("Scalars");
139 }
140
141 o->GetPointData()->InterpolateAllocate(input->GetPointData(),
142 estimatedSize,estimatedSize/2);
143 o->GetCellData()->CopyAllocate(input->GetCellData(),
144 estimatedSize,estimatedSize/2);
145
146 o->SetPoints(newPts);
147 newPts->Delete();
148
149 o->SetPolys(newPolys);
150 newPolys->Delete();
151 }
152
153
154 //----------------------------------------------------------------------------
155 // Calculate the gradient using central difference.
156 template <class T>
vtkSTComputePointGradient(int i,int j,int k,T * s,int * inExt,int xInc,int yInc,int zInc,double * spacing,double n[3])157 void vtkSTComputePointGradient(int i, int j, int k, T *s, int *inExt,
158 int xInc, int yInc, int zInc,
159 double *spacing, double n[3])
160 {
161 double sp, sm;
162
163 // x-direction
164 if ( i == inExt[0] )
165 {
166 sp = *(s+xInc);
167 sm = *s;
168 n[0] = (sp - sm) / spacing[0];
169 }
170 else if ( i == inExt[1] )
171 {
172 sp = *s;
173 sm = *(s-xInc);
174 n[0] = (sp - sm) / spacing[0];
175 }
176 else
177 {
178 sp = *(s+xInc);
179 sm = *(s-xInc);
180 n[0] = 0.5 * (sp - sm) / spacing[0];
181 }
182
183 // y-direction
184 if ( j == inExt[2] )
185 {
186 sp = *(s+yInc);
187 sm = *s;
188 n[1] = (sp - sm) / spacing[1];
189 }
190 else if ( j == inExt[3] )
191 {
192 sp = *s;
193 sm = *(s-yInc);
194 n[1] = (sp - sm) / spacing[1];
195 }
196 else
197 {
198 sp = *(s+yInc);
199 sm = *(s-yInc);
200 n[1] = 0.5 * (sp - sm) / spacing[1];
201 }
202
203 // z-direction
204 if ( k == inExt[4] )
205 {
206 sp = *(s+zInc);
207 sm = *s;
208 n[2] = (sp - sm) / spacing[2];
209 }
210 else if ( k == inExt[5] )
211 {
212 sp = *s;
213 sm = *(s-zInc);
214 n[2] = (sp - sm) / spacing[2];
215 }
216 else
217 {
218 sp = *(s+zInc);
219 sm = *(s-zInc);
220 n[2] = 0.5 * (sp - sm) / spacing[2];
221 }
222 }
223
224 //----------------------------------------------------------------------------
225 #define VTK_CSP3PA(i2,j2,k2,s) \
226 if (NeedGradients) \
227 { \
228 if (!g0) \
229 { \
230 vtkSTComputePointGradient(i, j, k, s0, inExt, xInc, yInc, zInc, spacing, n0); \
231 g0 = 1; \
232 } \
233 vtkSTComputePointGradient(i2, j2, k2, s, inExt, xInc, yInc, zInc, spacing, n1); \
234 for (jj=0; jj<3; jj++) \
235 { \
236 n[jj] = n0[jj] + t * (n1[jj] - n0[jj]); \
237 } \
238 if (ComputeGradients) \
239 { \
240 newGradients->InsertNextTuple(n); \
241 } \
242 if (ComputeNormals) \
243 { \
244 vtkMath::Normalize(n); \
245 n[0] = -n[0]; n[1] = -n[1]; n[2] = -n[2]; \
246 newNormals->InsertNextTuple(n); \
247 } \
248 } \
249 if (ComputeScalars) \
250 { \
251 newScalars->InsertNextTuple(&value); \
252 }
253
254 //----------------------------------------------------------------------------
255 //
256 // Contouring filter specialized for images
257 //
258 template <class T>
ContourImage(vtkThreadedSynchronizedTemplates3D * self,int * exExt,vtkImageData * data,vtkPolyData * output,vtkFloatArray * newScalars,vtkFloatArray * newNormals,vtkFloatArray * newGradients,T * ptr,vtkDataArray * inScalars,bool outputTriangles)259 void ContourImage(vtkThreadedSynchronizedTemplates3D *self, int* exExt,
260 vtkImageData *data, vtkPolyData *output,
261 vtkFloatArray *newScalars, vtkFloatArray *newNormals,
262 vtkFloatArray *newGradients, T *ptr,
263 vtkDataArray *inScalars, bool outputTriangles)
264 {
265 int *inExt = data->GetExtent();
266 int xdim = exExt[1] - exExt[0] + 1;
267 int ydim = exExt[3] - exExt[2] + 1;
268 double *values = self->GetValues();
269 int numContours = self->GetNumberOfContours();
270 T *inPtrX, *inPtrY, *inPtrZ;
271 T *s0, *s1, *s2, *s3;
272 int xMin, xMax, yMin, yMax, zMin, zMax;
273 int xInc, yInc, zInc;
274 double *origin = data->GetOrigin();
275 double *spacing = data->GetSpacing();
276 int *isect1Ptr, *isect2Ptr;
277 double y, z, t;
278 int i, j, k;
279 int zstep, yisectstep;
280 int offsets[12];
281 int ComputeNormals = self->GetComputeNormals();
282 int ComputeGradients = self->GetComputeGradients();
283 int ComputeScalars = self->GetComputeScalars();
284 int NeedGradients = ComputeGradients || ComputeNormals;
285 double n[3], n0[3], n1[3];
286 int jj, g0;
287 int *tablePtr;
288 int idx, vidx;
289 double x[3], xz[3];
290 int v0, v1, v2, v3;
291 vtkIdType ptIds[3];
292 double value;
293 // We need to know the edgePointId's for interpolating attributes.
294 int edgePtId, inCellId, outCellId;
295 vtkPointData *inPD = data->GetPointData();
296 vtkCellData *inCD = data->GetCellData();
297 vtkPointData *outPD = output->GetPointData();
298 vtkCellData *outCD = output->GetCellData();
299 // Use to be arguments
300 vtkPoints *newPts;
301 vtkCellArray *newPolys;
302
303 ptr += self->GetArrayComponent();
304 vtkPolygonBuilder polyBuilder;
305 vtkSmartPointer<vtkIdList> poly = vtkSmartPointer<vtkIdList>::New();
306
307 newPts = output->GetPoints();
308 newPolys = output->GetPolys();
309
310 // this is an exploded execute extent.
311 xMin = exExt[0];
312 xMax = exExt[1];
313 yMin = exExt[2];
314 yMax = exExt[3];
315 zMin = exExt[4];
316 zMax = exExt[5];
317
318 // increments to move through scalars. Compute these ourself because
319 // we may be contouring an array other than scalars.
320 xInc = inScalars->GetNumberOfComponents();
321 yInc = xInc*(inExt[1]-inExt[0]+1);
322 zInc = yInc*(inExt[3]-inExt[2]+1);
323
324 // Kens increments, probably to do with edge array
325 zstep = xdim*ydim;
326 yisectstep = xdim*3;
327 // compute offsets probably how to get to the edges in the edge array.
328 offsets[0] = -xdim*3;
329 offsets[1] = -xdim*3 + 1;
330 offsets[2] = -xdim*3 + 2;
331 offsets[3] = -xdim*3 + 4;
332 offsets[4] = -xdim*3 + 5;
333 offsets[5] = 0;
334 offsets[6] = 2;
335 offsets[7] = 5;
336 offsets[8] = (zstep - xdim)*3;
337 offsets[9] = (zstep - xdim)*3 + 1;
338 offsets[10] = (zstep - xdim)*3 + 4;
339 offsets[11] = zstep*3;
340
341 // allocate storage array
342 int *isect1 = new int [xdim*ydim*3*2];
343 // set impossible edges to -1
344 for (i = 0; i < ydim; i++)
345 {
346 isect1[(i+1)*xdim*3-3] = -1;
347 isect1[(i+1)*xdim*3*2-3] = -1;
348 }
349 for (i = 0; i < xdim; i++)
350 {
351 isect1[((ydim-1)*xdim + i)*3 + 1] = -1;
352 isect1[((ydim-1)*xdim + i)*3*2 + 1] = -1;
353 }
354
355 // for each contour
356 for (vidx = 0; vidx < numContours; vidx++)
357 {
358 value = values[vidx];
359 inPtrZ = ptr;
360
361 //==================================================================
362 for (k = zMin; k <= zMax; k++)
363 {
364 // self->UpdateProgress((double)vidx/numContours +
365 // (k-zMin)/((zMax - zMin+1.0)*numContours));
366 z = origin[2] + spacing[2]*k;
367 x[2] = z;
368
369 // swap the buffers
370 if (k%2)
371 {
372 offsets[8] = (zstep - xdim)*3;
373 offsets[9] = (zstep - xdim)*3 + 1;
374 offsets[10] = (zstep - xdim)*3 + 4;
375 offsets[11] = zstep*3;
376 isect1Ptr = isect1;
377 isect2Ptr = isect1 + xdim*ydim*3;
378 }
379 else
380 {
381 offsets[8] = (-zstep - xdim)*3;
382 offsets[9] = (-zstep - xdim)*3 + 1;
383 offsets[10] = (-zstep - xdim)*3 + 4;
384 offsets[11] = -zstep*3;
385 isect1Ptr = isect1 + xdim*ydim*3;
386 isect2Ptr = isect1;
387 }
388
389 inPtrY = inPtrZ;
390 for (j = yMin; j <= yMax; j++)
391 {
392 // Should not impact performance here/
393 edgePtId = (xMin-inExt[0])*xInc + (j-inExt[2])*yInc + (k-inExt[4])*zInc;
394 // Increments are different for cells. Since the cells are not
395 // contoured until the second row of templates, subtract 1 from
396 // i,j,and k. Note: first cube is formed when i=0, j=1, and k=1.
397 inCellId =
398 (xMin-inExt[0]) + (inExt[1]-inExt[0])*
399 ( (j-inExt[2]-1) + (k-inExt[4]-1)*(inExt[3]-inExt[2]) );
400
401 y = origin[1] + j*spacing[1];
402 xz[1] = y;
403 s1 = inPtrY;
404 v1 = (*s1 < value ? 0 : 1);
405
406 inPtrX = inPtrY;
407 for (i = xMin; i <= xMax; i++)
408 {
409 s0 = s1;
410 v0 = v1;
411 // this flag keeps up from computing gradient for grid point 0 twice.
412 g0 = 0;
413 *isect2Ptr = -1;
414 *(isect2Ptr + 1) = -1;
415 *(isect2Ptr + 2) = -1;
416 if (i < xMax)
417 {
418 s1 = (inPtrX + xInc);
419 v1 = (*s1 < value ? 0 : 1);
420 if (v0 ^ v1)
421 {
422 // watch for degenerate points
423 if (*s0 == value)
424 {
425 if (i > xMin && *(isect2Ptr-3) > -1)
426 {
427 *isect2Ptr = *(isect2Ptr-3);
428 }
429 else if (j > yMin && *(isect2Ptr - yisectstep + 1) > -1)
430 {
431 *isect2Ptr = *(isect2Ptr - yisectstep + 1);
432 }
433 else if (k > zMin && *(isect1Ptr+2) > -1)
434 {
435 *isect2Ptr = *(isect1Ptr+2);
436 }
437 }
438 else if (*s1 == value)
439 {
440 if (j > yMin && *(isect2Ptr - yisectstep +4) > -1)
441 {
442 *isect2Ptr = *(isect2Ptr - yisectstep + 4);
443 }
444 else if (k > zMin && i < xMax && *(isect1Ptr + 5) > -1)
445 {
446 *isect2Ptr = *(isect1Ptr + 5);
447 }
448 }
449 // if the edge has not been set yet then it is a new point
450 if (*isect2Ptr == -1)
451 {
452 t = (value - (double)(*s0)) / ((double)(*s1) - (double)(*s0));
453 x[0] = origin[0] + spacing[0]*(i+t);
454 x[1] = y;
455 *isect2Ptr = newPts->InsertNextPoint(x);
456 VTK_CSP3PA(i+1,j,k,s1);
457 outPD->InterpolateEdge(inPD, *isect2Ptr, edgePtId, edgePtId+1, t);
458 }
459 }
460 }
461 if (j < yMax)
462 {
463 s2 = (inPtrX + yInc);
464 v2 = (*s2 < value ? 0 : 1);
465 if (v0 ^ v2)
466 {
467 if (*s0 == value)
468 {
469 if (*isect2Ptr > -1)
470 {
471 *(isect2Ptr + 1) = *isect2Ptr;
472 }
473 else if (i > xMin && *(isect2Ptr-3) > -1)
474 {
475 *(isect2Ptr + 1) = *(isect2Ptr-3);
476 }
477 else if (j > yMin && *(isect2Ptr - yisectstep + 1) > -1)
478 {
479 *(isect2Ptr + 1) = *(isect2Ptr - yisectstep + 1);
480 }
481 else if (k > zMin && *(isect1Ptr+2) > -1)
482 {
483 *(isect2Ptr + 1) = *(isect1Ptr+2);
484 }
485 }
486 else if (*s2 == value && k > zMin && *(isect1Ptr + yisectstep + 2) > -1)
487 {
488 *(isect2Ptr+1) = *(isect1Ptr + yisectstep + 2);
489 }
490 // if the edge has not been set yet then it is a new point
491 if (*(isect2Ptr + 1) == -1)
492 {
493 t = (value - (double)(*s0)) / ((double)(*s2) - (double)(*s0));
494 x[0] = origin[0] + spacing[0]*i;
495 x[1] = y + spacing[1]*t;
496 *(isect2Ptr + 1) = newPts->InsertNextPoint(x);
497 VTK_CSP3PA(i,j+1,k,s2);
498 outPD->InterpolateEdge(inPD, *(isect2Ptr+1), edgePtId, edgePtId+yInc, t);
499 }
500 }
501 }
502 if (k < zMax)
503 {
504 s3 = (inPtrX + zInc);
505 v3 = (*s3 < value ? 0 : 1);
506 if (v0 ^ v3)
507 {
508 if (*s0 == value)
509 {
510 if (*isect2Ptr > -1)
511 {
512 *(isect2Ptr + 2) = *isect2Ptr;
513 }
514 else if (*(isect2Ptr+1) > -1)
515 {
516 *(isect2Ptr + 2) = *(isect2Ptr+1);
517 }
518 else if (i > xMin && *(isect2Ptr-3) > -1)
519 {
520 *(isect2Ptr + 2) = *(isect2Ptr-3);
521 }
522 else if (j > yMin && *(isect2Ptr - yisectstep + 1) > -1)
523 {
524 *(isect2Ptr + 2) = *(isect2Ptr - yisectstep + 1);
525 }
526 else if (k > zMin && *(isect1Ptr+2) > -1)
527 {
528 *(isect2Ptr + 2) = *(isect1Ptr+2);
529 }
530 }
531 if (*(isect2Ptr + 2) == -1)
532 {
533 t = (value - (double)(*s0)) / ((double)(*s3) - (double)(*s0));
534 xz[0] = origin[0] + spacing[0]*i;
535 xz[2] = z + spacing[2]*t;
536 *(isect2Ptr + 2) = newPts->InsertNextPoint(xz);
537 VTK_CSP3PA(i,j,k+1,s3);
538 outPD->InterpolateEdge(inPD, *(isect2Ptr+2), edgePtId, edgePtId+zInc, t);
539 }
540 }
541 }
542 // To keep track of ids for interpolating attributes.
543 ++edgePtId;
544
545 // now add any polys that need to be added
546 // basically look at the isect values,
547 // form an index and lookup the polys
548 if (j > yMin && i < xMax && k > zMin)
549 {
550 idx = (v0 ? 4096 : 0);
551 idx = idx + (*(isect1Ptr - yisectstep) > -1 ? 2048 : 0);
552 idx = idx + (*(isect1Ptr -yisectstep +1) > -1 ? 1024 : 0);
553 idx = idx + (*(isect1Ptr -yisectstep +2) > -1 ? 512 : 0);
554 idx = idx + (*(isect1Ptr -yisectstep +4) > -1 ? 256 : 0);
555 idx = idx + (*(isect1Ptr -yisectstep +5) > -1 ? 128 : 0);
556 idx = idx + (*(isect1Ptr) > -1 ? 64 : 0);
557 idx = idx + (*(isect1Ptr + 2) > -1 ? 32 : 0);
558 idx = idx + (*(isect1Ptr + 5) > -1 ? 16 : 0);
559 idx = idx + (*(isect2Ptr -yisectstep) > -1 ? 8 : 0);
560 idx = idx + (*(isect2Ptr -yisectstep +1) > -1 ? 4 : 0);
561 idx = idx + (*(isect2Ptr -yisectstep +4) > -1 ? 2 : 0);
562 idx = idx + (*(isect2Ptr) > -1 ? 1 : 0);
563
564 tablePtr = VTK_TSYNCHRONIZED_TEMPLATES_3D_TABLE_2
565 + VTK_TSYNCHRONIZED_TEMPLATES_3D_TABLE_1[idx];
566
567 if (!outputTriangles)
568 {
569 polyBuilder.Reset();
570 }
571 while (*tablePtr != -1)
572 {
573 ptIds[0] = *(isect1Ptr + offsets[*tablePtr]);
574 tablePtr++;
575 ptIds[1] = *(isect1Ptr + offsets[*tablePtr]);
576 tablePtr++;
577 ptIds[2] = *(isect1Ptr + offsets[*tablePtr]);
578 tablePtr++;
579 if (ptIds[0] != ptIds[1] &&
580 ptIds[0] != ptIds[2] &&
581 ptIds[1] != ptIds[2])
582 {
583 if(outputTriangles)
584 {
585 outCellId = newPolys->InsertNextCell(3,ptIds);
586 outCD->CopyData(inCD, inCellId, outCellId);
587 }
588 else
589 {
590 polyBuilder.InsertTriangle(ptIds);
591 }
592 }
593 }
594 if(!outputTriangles)
595 {
596 polyBuilder.GetPolygon(poly);
597 if(poly->GetNumberOfIds()>0)
598 {
599 outCellId = newPolys->InsertNextCell(poly);
600 outCD->CopyData(inCD, inCellId, outCellId);
601 }
602 }
603 }
604 inPtrX += xInc;
605 isect2Ptr += 3;
606 isect1Ptr += 3;
607 // To keep track of ids for copying cell attributes..
608 ++inCellId;
609 }
610 inPtrY += yInc;
611 }
612 inPtrZ += zInc;
613 }
614 }
615 delete [] isect1;
616 }
617
vtkThreadedSynchronizedTemplates3DFinalizeOutput(vtkDataArray * inScalars,vtkPolyData * piece,vtkFloatArray * scalars,vtkFloatArray * normals,vtkFloatArray * gradients)618 static void vtkThreadedSynchronizedTemplates3DFinalizeOutput(
619 vtkDataArray *inScalars, vtkPolyData *piece, vtkFloatArray *scalars,
620 vtkFloatArray *normals, vtkFloatArray *gradients)
621 {
622 if (scalars)
623 {
624 // Lets set the name of the scalars here.
625 if (inScalars)
626 {
627 scalars->SetName(inScalars->GetName());
628 }
629 int idx = piece->GetPointData()->AddArray(scalars);
630 piece->GetPointData()->SetActiveAttribute(idx,
631 vtkDataSetAttributes::SCALARS);
632 scalars->Delete();
633 }
634 if (gradients)
635 {
636 int idx = piece->GetPointData()->AddArray(gradients);
637 piece->GetPointData()->SetActiveAttribute(idx,
638 vtkDataSetAttributes::VECTORS);
639 gradients->Delete();
640 }
641 if (normals)
642 {
643 piece->GetPointData()->SetNormals(normals);
644 normals->Delete();
645 }
646 }
647
648
649 //----------------------------------------------------------------------------
SetInputMemoryLimit(unsigned long vtkNotUsed (limit))650 void vtkThreadedSynchronizedTemplates3D::SetInputMemoryLimit(
651 unsigned long vtkNotUsed(limit) )
652 {
653 vtkErrorMacro( << "This filter no longer supports a memory limit." );
654 vtkErrorMacro( << "This filter no longer initiates streaming." );
655 vtkErrorMacro( << "Please use a vtkPolyDataStreamer after this filter to achieve similar functionality." );
656 }
657
658
659 //----------------------------------------------------------------------------
GetInputMemoryLimit()660 unsigned long vtkThreadedSynchronizedTemplates3D::GetInputMemoryLimit()
661 {
662 vtkErrorMacro( << "This filter no longer supports a memory limit." );
663 vtkErrorMacro( << "This filter no longer initiates streaming." );
664 vtkErrorMacro( << "Please use a vtkPolyDataStreamer after this filter to achieve similar functionality." );
665
666 return 0;
667 }
668
669 class DoThreadedContour
670 {
671 public:
DoThreadedContour(vtkThreadedSynchronizedTemplates3D * filter,int * exExt,vtkImageData * input,vtkDataArray * scalars,int numPieces)672 DoThreadedContour(vtkThreadedSynchronizedTemplates3D* filter,
673 int* exExt, vtkImageData* input, vtkDataArray* scalars,
674 int numPieces) : Filter(filter), ExExt(exExt), Input(input), Outputs(NULL),
675 NumOutputPieces(0), Scalars(scalars),
676 NumberOfPieces(numPieces)
677 {
678 }
679
~DoThreadedContour()680 ~DoThreadedContour()
681 {
682 delete [] this->Outputs;
683 }
684
GetNumberOfOutputPieces() const685 int GetNumberOfOutputPieces() const
686 {
687 return this->NumOutputPieces;
688 }
689
GetOutputPiece(int pieceIdx)690 vtkPolyData* GetOutputPiece(int pieceIdx)
691 {
692 return this->Outputs[pieceIdx];
693 }
694
Initialize()695 void Initialize()
696 {
697 ThreadLocalWorkSpace &ws = this->tlws.Local();
698 ws.poly = vtkPolyData::New();
699 ws.scalars = ws.normals = ws.gradients = NULL;
700
701 if (Filter->GetComputeScalars())
702 {
703 ws.scalars = vtkFloatArray::New();
704 }
705 if (Filter->GetComputeNormals())
706 {
707 ws.normals = vtkFloatArray::New();
708 }
709 if (Filter->GetComputeGradients())
710 {
711 ws.gradients = vtkFloatArray::New();
712 }
713
714 vtkThreadedSynchronizedTemplates3DInitializeOutput(this->ExExt,
715 this->Input, vtkSMPTools::GetEstimatedNumberOfThreads(), ws.poly,
716 ws.scalars, ws.normals, ws.gradients, this->Scalars);
717 }
718
Reduce()719 void Reduce()
720 {
721 this->NumOutputPieces = static_cast<int>(tlws.size());
722 this->Outputs = new vtkPolyData* [this->NumOutputPieces];
723
724 int p = 0;
725 for (TLS_t::iterator i = this->tlws.begin(); i != this->tlws.end(); ++i)
726 {
727 vtkPolyData* contour = i->poly;
728 vtkThreadedSynchronizedTemplates3DFinalizeOutput(Scalars, contour,
729 i->scalars, i->normals, i->gradients);
730 Outputs[p++] = contour;
731 }
732 }
733
operator ()(vtkIdType begin,vtkIdType end)734 void operator()( vtkIdType begin, vtkIdType end )
735 {
736 vtkNew<vtkExtentTranslator> et;
737 et->SetWholeExtent(this->ExExt);
738 et->SetNumberOfPieces(this->NumberOfPieces);
739 ThreadLocalWorkSpace &ws = tlws.Local();
740 for(int i=begin; i<end; i++)
741 {
742 int exExt2[6];
743 et->SetPiece(i);
744 et->PieceToExtent();
745 et->GetExtent(exExt2);
746 void* ptr = this->Input->GetArrayPointerForExtent(this->Scalars, exExt2);
747 switch (this->Scalars->GetDataType())
748 {
749 vtkTemplateMacro(
750 ContourImage(this->Filter, exExt2, this->Input, ws.poly, ws.scalars,
751 ws.normals, ws.gradients, (VTK_TT *)ptr, this->Scalars, true));
752 }
753 }
754 }
755
756 private:
757 struct ThreadLocalWorkSpace
758 {
759 vtkPolyData *poly;
760 vtkFloatArray *scalars;
761 vtkFloatArray *normals;
762 vtkFloatArray *gradients;
763 };
764 typedef vtkSMPThreadLocal<ThreadLocalWorkSpace> TLS_t;
765 TLS_t tlws;
766
767 vtkThreadedSynchronizedTemplates3D* Filter;
768 int* ExExt;
769 vtkImageData* Input;
770 vtkPolyData **Outputs;
771 int NumOutputPieces;
772 vtkDataArray* Scalars;
773 int NumberOfPieces;
774 };
775
776
777 //----------------------------------------------------------------------------
778 //
779 // Contouring filter specialized for images (or slices from images)
780 //
ThreadedExecute(vtkImageData * data,vtkInformation * inInfo,vtkInformation * outInfo,vtkDataArray * inScalars)781 void vtkThreadedSynchronizedTemplates3D::ThreadedExecute(vtkImageData *data,
782 vtkInformation* inInfo,
783 vtkInformation *outInfo,
784 vtkDataArray *inScalars)
785 {
786 vtkMultiBlockDataSet *output;
787
788 vtkDebugMacro(<< "Executing 3D structured contour");
789
790 output = vtkMultiBlockDataSet::GetData(outInfo);
791
792 int* inExt = data->GetExtent();
793 int exExt[6];
794 inInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), exExt);
795 for (int i=0; i<3; i++)
796 {
797 if (inExt[2*i] > exExt[2*i])
798 {
799 exExt[2*i] = inExt[2*i];
800 }
801 if (inExt[2*i+1] < exExt[2*i+1])
802 {
803 exExt[2*i+1] = inExt[2*i+1];
804 }
805 }
806 if ( exExt[0] >= exExt[1] || exExt[2] >= exExt[3] || exExt[4] >= exExt[5] )
807 {
808 vtkDebugMacro(<<"3D structured contours requires 3D data");
809 return;
810 }
811
812 //
813 // Check data type and execute appropriate function
814 //
815 if (inScalars == NULL)
816 {
817 vtkDebugMacro("No scalars for contouring.");
818 return;
819 }
820 int numComps = inScalars->GetNumberOfComponents();
821
822 if (this->ArrayComponent >= numComps)
823 {
824 vtkErrorMacro("Scalars have " << numComps << " components. "
825 "ArrayComponent must be smaller than " << numComps);
826 return;
827 }
828
829 int ncells = (exExt[1] - exExt[0]) * (exExt[3] - exExt[2]) *
830 (exExt[5] - exExt[4]);
831 const int grainSize = 32 * 32 * 32;
832 int nPieces = (ncells == 0) ? 1 : (ncells + grainSize - 1)/grainSize;
833 DoThreadedContour functor(this, exExt, data, inScalars, nPieces);
834 vtkSMPTools::For( 0, nPieces, functor );
835
836 int p = 0;
837 for (int i = 0; i < functor.GetNumberOfOutputPieces(); ++i)
838 {
839 vtkPolyData* piece = functor.GetOutputPiece(i);
840 output->SetBlock(p++, piece);
841 piece->Delete();
842 }
843 }
844
845 //----------------------------------------------------------------------------
RequestData(vtkInformation * request,vtkInformationVector ** inputVector,vtkInformationVector * outputVector)846 int vtkThreadedSynchronizedTemplates3D::RequestData(
847 vtkInformation *request,
848 vtkInformationVector **inputVector,
849 vtkInformationVector *outputVector)
850 {
851 // get the info objects
852 vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
853 vtkInformation *outInfo = outputVector->GetInformationObject(0);
854
855 // get the input and output
856 vtkImageData *input = vtkImageData::SafeDownCast(
857 inInfo->Get(vtkDataObject::DATA_OBJECT()));
858
859 // to be safe recompute the
860 this->RequestUpdateExtent(request,inputVector,outputVector);
861
862 vtkDataArray *inScalars = this->GetInputArrayToProcess(0,inputVector);
863
864 // Just call the threaded execute directly.
865 this->ThreadedExecute(input, inInfo, outInfo, inScalars);
866
867 return 1;
868 }
869
870 //----------------------------------------------------------------------------
RequestUpdateExtent(vtkInformation * vtkNotUsed (request),vtkInformationVector ** inputVector,vtkInformationVector * outputVector)871 int vtkThreadedSynchronizedTemplates3D::RequestUpdateExtent(
872 vtkInformation *vtkNotUsed(request),
873 vtkInformationVector **inputVector,
874 vtkInformationVector *outputVector)
875 {
876 // These require extra ghost levels
877 if (this->ComputeGradients || this->ComputeNormals)
878 {
879 vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
880 vtkInformation *outInfo = outputVector->GetInformationObject(0);
881
882 int ghostLevels;
883 ghostLevels =
884 outInfo->Get(
885 vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS());
886 inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(),
887 ghostLevels + 1);
888 }
889
890 return 1;
891 }
892
893 //----------------------------------------------------------------------------
FillInputPortInformation(int,vtkInformation * info)894 int vtkThreadedSynchronizedTemplates3D::FillInputPortInformation(int, vtkInformation *info)
895 {
896 info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkImageData");
897 return 1;
898 }
899
900 //----------------------------------------------------------------------------
PrintSelf(ostream & os,vtkIndent indent)901 void vtkThreadedSynchronizedTemplates3D::PrintSelf(ostream& os, vtkIndent indent)
902 {
903 this->Superclass::PrintSelf(os,indent);
904
905 this->ContourValues->PrintSelf(os,indent.GetNextIndent());
906
907 os << indent << "Compute Normals: " << (this->ComputeNormals ? "On\n" : "Off\n");
908 os << indent << "Compute Gradients: " << (this->ComputeGradients ? "On\n" : "Off\n");
909 os << indent << "Compute Scalars: " << (this->ComputeScalars ? "On\n" : "Off\n");
910 os << indent << "ArrayComponent: " << this->ArrayComponent << endl;
911 }
912
913
914 // template table.
915
916 int VTK_TSYNCHRONIZED_TEMPLATES_3D_TABLE_1[] = {
917 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
918 0, 0, 0, 0, 0, 0, 0, 0, 0, 592,
919 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
920 0, 0, 0, 0, 0, 0, 0, 1312, 0, 0,
921 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
922 0, 0, 0, 0, 585, 0, 0, 0, 0, 0,
923 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
924 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
925 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
926 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
927 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
928 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
929 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
930 0, 0, 0, 0, 0, 0, 0, 0, 260, 0,
931 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
932 0, 0, 0, 948, 0, 0, 0, 0, 0, 0,
933 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
934 0, 0, 0, 0, 0, 935, 0, 0, 0, 0,
935 0, 0, 0, 0, 0, 0, 0, 0, 250, 0,
936 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
937 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
938 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
939 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
940 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
941 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
942 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
943 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
944 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
945 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
946 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
947 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
948 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
949 0, 0, 0, 620, 0, 0, 0, 0, 0, 0,
950 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
951 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
952 0, 0, 0, 0, 0, 0, 0, 0, 530, 0,
953 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
954 0, 0, 0, 1263, 0, 0, 0, 0, 0, 0,
955 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
956 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
957 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
958 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
959 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
960 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
961 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
962 0, 0, 0, 0, 0, 0, 0, 988, 0, 0,
963 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
964 0, 0, 0, 0, 288, 0, 0, 0, 0, 0,
965 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
966 0, 0, 201, 0, 0, 0, 0, 0, 0, 0,
967 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
968 0, 874, 0, 0, 0, 0, 0, 0, 0, 0,
969 0, 0, 0, 0, 106, 0, 0, 0, 0, 0,
970 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
971 0, 0, 0, 746, 0, 0, 0, 0, 0, 0,
972 0, 0, 0, 1119, 0, 0, 0, 0, 0, 0,
973 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
974 404, 0, 0, 0, 0, 0, 0, 0, 0, 0,
975 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
976 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
977 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
978 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
979 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
980 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
981 0, 0, 0, 0, 0, 0, 414, 0, 0, 0,
982 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
983 0, 1126, 0, 0, 0, 0, 0, 0, 0, 0,
984 0, 0, 0, 0, 0, 736, 0, 0, 0, 0,
985 0, 0, 0, 0, 0, 0, 0, 0, 99, 0,
986 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
987 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
988 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
989 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
990 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
991 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
992 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
993 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
994 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
995 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
996 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
997 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
998 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
999 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1000 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1001 0, 0, 0, 0, 0, 0, 0, 786, 0, 0,
1002 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1003 134, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1004 0, 0, 0, 0, 355, 0, 0, 0, 0, 0,
1005 0, 0, 0, 0, 0, 0, 0, 0, 0, 1064,
1006 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1007 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1008 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1009 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1010 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1011 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1012 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1013 0, 0, 0, 0, 0, 1172, 0, 0, 0, 0,
1014 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1015 0, 0, 448, 0, 0, 0, 0, 0, 0, 0,
1016 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
1017 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1018 0, 687, 0, 0, 0, 0, 0, 0, 0, 0,
1019 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1020 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1021 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1022 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1023 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1024 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1025 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1026 0, 0, 0, 1211, 0, 0, 0, 0, 0, 0,
1027 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1028 484, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1029 44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1030 0, 0, 0, 0, 0, 0, 0, 0, 0, 660,
1031 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1032 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1033 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1034 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1035 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1036 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1037 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1038 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1039 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1040 0, 822, 0, 0, 0, 0, 0, 0, 0, 0,
1041 0, 0, 0, 0, 161, 0, 0, 0, 0, 0,
1042 0, 0, 0, 0, 0, 0, 0, 0, 328, 0,
1043 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1044 0, 0, 0, 1028, 0, 0, 0, 0, 0, 0,
1045 0, 0, 0, 0, 0, 0, 441, 0, 0, 0,
1046 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1047 0, 1162, 0, 0, 0, 0, 0, 0, 0, 0,
1048 0, 0, 0, 0, 0, 700, 0, 0, 0, 0,
1049 0, 0, 0, 0, 0, 0, 0, 0, 72, 0,
1050 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1051 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1052 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1053 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1054 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1055 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1056 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1057 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1058 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1059 124, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1060 0, 0, 0, 0, 0, 0, 0, 0, 0, 773,
1061 0, 0, 0, 0, 0, 0, 0, 0, 0, 1080,
1062 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1063 0, 0, 0, 0, 0, 0, 368, 0, 0, 0,
1064 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1065 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1066 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1067 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1068 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1069 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1070 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1071 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1072 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1073 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1074 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1075 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1076 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1077 0, 0, 0, 0, 0, 0, 0, 0, 0, 1018,
1078 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1079 0, 0, 0, 0, 0, 0, 315, 0, 0, 0,
1080 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1081 0, 0, 0, 0, 174, 0, 0, 0, 0, 0,
1082 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1083 0, 0, 0, 838, 0, 0, 0, 0, 0, 0,
1084 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1085 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1086 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1087 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1088 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1089 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1090 0, 647, 0, 0, 0, 0, 0, 0, 0, 0,
1091 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
1092 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1093 0, 0, 0, 0, 0, 0, 494, 0, 0, 0,
1094 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1095 0, 1218, 0, 0, 0, 0, 0, 0, 0, 0,
1096 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1097 0, 0, 278, 0, 0, 0, 0, 0, 0, 0,
1098 0, 0, 0, 0, 0, 0, 0, 975, 0, 0,
1099 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1100 0, 0, 0, 0, 0, 0, 0, 0, 0, 890,
1101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1102 0, 0, 214, 0, 0, 0, 0, 0, 0, 0,
1103 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1104 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1105 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1106 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1107 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1108 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1109 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1110 0, 0, 0, 0, 0, 0, 0, 0, 0, 610,
1111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1112 0, 0, 0, 0, 0, 0, 0, 1276, 0, 0,
1113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1114 0, 0, 0, 0, 540, 0, 0, 0, 0, 0,
1115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1117 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1118 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1119 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1120 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1121 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1122 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1123 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1124 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1125 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1126 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1127 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1128 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1129 0, 1011, 0, 0, 0, 0, 0, 0, 0, 0,
1130 0, 0, 0, 0, 0, 0, 0, 0, 305, 0,
1131 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1132 0, 0, 0, 0, 0, 0, 181, 0, 0, 0,
1133 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1134 0, 0, 0, 0, 0, 848, 0, 0, 0, 0,
1135 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1136 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1137 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1138 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1139 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1140 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1141 0, 0, 0, 637, 0, 0, 0, 0, 0, 0,
1142 0, 0, 0, 0, 0, 0, 27, 0, 0, 0,
1143 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1144 0, 0, 0, 0, 0, 0, 0, 0, 504, 0,
1145 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1146 0, 0, 0, 1231, 0, 0, 0, 0, 0, 0,
1147 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1148 0, 0, 0, 0, 271, 0, 0, 0, 0, 0,
1149 0, 0, 0, 0, 0, 0, 0, 0, 0, 965,
1150 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1151 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1152 0, 903, 0, 0, 0, 0, 0, 0, 0, 0,
1153 0, 0, 0, 0, 224, 0, 0, 0, 0, 0,
1154 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1155 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1157 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1159 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1160 0, 0, 5, 0, 0, 0, 0, 0, 0, 0,
1161 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1162 0, 603, 0, 0, 0, 0, 0, 0, 0, 0,
1163 0, 0, 0, 0, 0, 0, 0, 0, 0, 1292,
1164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1165 0, 0, 0, 0, 0, 0, 553, 0, 0, 0,
1166 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1167 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1168 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1169 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1170 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1171 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1172 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1173 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1174 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1175 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1176 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1177 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1178 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1179 0, 0, 0, 0, 0, 0, 0, 0, 0, 1201,
1180 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1181 0, 0, 0, 0, 0, 0, 471, 0, 0, 0,
1182 0, 0, 0, 0, 0, 0, 48, 0, 0, 0,
1183 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1184 0, 0, 0, 0, 0, 667, 0, 0, 0, 0,
1185 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1186 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1187 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1188 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1189 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1190 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1191 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1192 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1193 0, 0, 0, 0, 0, 0, 0, 809, 0, 0,
1194 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1195 151, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1196 0, 0, 0, 0, 335, 0, 0, 0, 0, 0,
1197 0, 0, 0, 0, 0, 0, 0, 0, 0, 1038,
1198 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1199 0, 0, 431, 0, 0, 0, 0, 0, 0, 0,
1200 0, 0, 0, 0, 0, 0, 0, 1149, 0, 0,
1201 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1202 0, 710, 0, 0, 0, 0, 0, 0, 0, 0,
1203 0, 0, 0, 0, 79, 0, 0, 0, 0, 0,
1204 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1205 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1206 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1207 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1208 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1209 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1210 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1211 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1212 0, 0, 0, 0, 0, 0, 117, 0, 0, 0,
1213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1214 0, 0, 0, 0, 0, 763, 0, 0, 0, 0,
1215 0, 0, 0, 0, 0, 1093, 0, 0, 0, 0,
1216 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1217 0, 0, 378, 0, 0, 0, 0, 0, 0, 0,
1218 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1219 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1220 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1221 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1222 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1223 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1224 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1225 0, 0, 0, 0, 110, 0, 0, 0, 0, 0,
1226 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1227 0, 0, 0, 753, 0, 0, 0, 0, 0, 0,
1228 0, 0, 0, 1109, 0, 0, 0, 0, 0, 0,
1229 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1230 391, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1231 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1232 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1233 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1234 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1235 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1236 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1237 0, 0, 0, 0, 0, 0, 421, 0, 0, 0,
1238 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1239 0, 1136, 0, 0, 0, 0, 0, 0, 0, 0,
1240 0, 0, 0, 0, 0, 723, 0, 0, 0, 0,
1241 0, 0, 0, 0, 0, 0, 0, 0, 89, 0,
1242 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1243 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1244 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1245 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1246 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1247 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1248 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1249 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1250 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1251 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1252 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1253 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1254 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1255 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1256 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1257 0, 0, 0, 0, 0, 0, 0, 796, 0, 0,
1258 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1259 141, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1260 0, 0, 0, 0, 345, 0, 0, 0, 0, 0,
1261 0, 0, 0, 0, 0, 0, 0, 0, 0, 1051,
1262 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1263 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1264 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1265 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1266 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1267 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1268 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1269 0, 0, 0, 0, 0, 1185, 0, 0, 0, 0,
1270 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1271 0, 0, 458, 0, 0, 0, 0, 0, 0, 0,
1272 0, 0, 55, 0, 0, 0, 0, 0, 0, 0,
1273 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1274 0, 677, 0, 0, 0, 0, 0, 0, 0, 0,
1275 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
1276 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1277 0, 0, 0, 596, 0, 0, 0, 0, 0, 0,
1278 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1279 0, 1299, 0, 0, 0, 0, 0, 0, 0, 0,
1280 0, 0, 0, 0, 0, 0, 0, 0, 569, 0,
1281 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1282 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1283 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1284 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1285 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1286 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1287 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1288 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1289 0, 0, 264, 0, 0, 0, 0, 0, 0, 0,
1290 0, 0, 0, 0, 0, 0, 0, 955, 0, 0,
1291 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1292 0, 0, 0, 0, 0, 0, 0, 0, 0, 919,
1293 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1294 0, 0, 237, 0, 0, 0, 0, 0, 0, 0,
1295 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1296 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1297 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1298 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1299 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1300 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1301 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1302 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1303 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1304 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1305 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1306 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1307 0, 0, 0, 0, 0, 0, 0, 627, 0, 0,
1308 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1309 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1310 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1311 0, 0, 517, 0, 0, 0, 0, 0, 0, 0,
1312 0, 0, 0, 0, 0, 0, 0, 1247, 0, 0,
1313 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1314 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1315 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1316 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1317 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1318 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1319 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1320 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1321 0, 998, 0, 0, 0, 0, 0, 0, 0, 0,
1322 0, 0, 0, 0, 0, 0, 0, 0, 295, 0,
1323 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1324 0, 0, 0, 0, 0, 0, 191, 0, 0, 0,
1325 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1326 0, 0, 0, 0, 0, 861, 0, 0, 0, 0,
1327 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1328 0, 0, 0, 0, 0, 2036, 0, 0, 0, 0,
1329 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1330 0, 0, 0, 1316, 0, 0, 0, 0, 0, 0,
1331 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1332 2040, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1333 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1334 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1335 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1336 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1337 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1338 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1339 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1340 0, 0, 0, 0, 2404, 0, 0, 0, 0, 0,
1341 0, 0, 0, 0, 0, 0, 0, 0, 0, 1641,
1342 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1343 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1344 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0,
1345 0, 0, 0, 0, 2408, 0, 0, 0, 0, 0,
1346 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1347 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1348 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1349 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1350 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1351 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1352 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1353 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1354 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1355 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1356 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1357 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1358 0, 0, 0, 0, 0, 0, 0, 0, 0, 1993,
1359 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1360 0, 0, 2696, 0, 0, 0, 0, 0, 0, 0,
1361 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1362 0, 0, 0, 0, 2080, 0, 0, 0, 0, 0,
1363 0, 0, 0, 0, 0, 0, 0, 0, 0, 1344,
1364 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1365 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1366 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1367 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1368 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1369 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1370 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1371 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1372 0, 0, 0, 1592, 0, 0, 0, 0, 0, 0,
1373 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1374 2361, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1375 0, 0, 0, 0, 0, 0, 0, 0, 2460, 0,
1376 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1377 0, 0, 0, 0, 0, 0, 0, 1688, 0, 0,
1378 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1379 2594, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1380 0, 0, 0, 0, 0, 0, 0, 0, 0, 1837,
1381 0, 0, 0, 0, 0, 0, 0, 0, 0, 1470,
1382 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1383 0, 0, 0, 0, 0, 0, 2218, 0, 0, 0,
1384 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1385 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1386 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1387 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1388 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1389 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1390 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1391 0, 0, 2211, 0, 0, 0, 0, 0, 0, 0,
1392 0, 0, 0, 0, 0, 0, 0, 1460, 0, 0,
1393 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1394 0, 1850, 0, 0, 0, 0, 0, 0, 0, 0,
1395 0, 0, 0, 0, 2598, 0, 0, 0, 0, 0,
1396 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1397 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1398 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1399 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1400 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1401 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1402 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1403 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1404 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1405 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1406 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1407 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1408 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1409 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1410 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1411 0, 0, 0, 1776, 0, 0, 0, 0, 0, 0,
1412 0, 0, 0, 0, 0, 0, 2557, 0, 0, 0,
1413 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1414 2270, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1415 0, 0, 0, 0, 0, 1510, 0, 0, 0, 0,
1416 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1417 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1418 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1419 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1420 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1421 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1422 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1423 0, 1411, 0, 0, 0, 0, 0, 0, 0, 0,
1424 0, 0, 0, 0, 0, 0, 0, 0, 2168, 0,
1425 0, 0, 0, 0, 0, 0, 0, 0, 2632, 0,
1426 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1427 0, 0, 0, 0, 0, 0, 0, 1896, 0, 0,
1428 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1429 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1430 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1431 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1432 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1433 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1434 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1435 0, 0, 0, 0, 0, 0, 0, 0, 0, 1384,
1436 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1437 0, 0, 0, 0, 0, 0, 2132, 0, 0, 0,
1438 0, 0, 0, 0, 0, 0, 2662, 0, 0, 0,
1439 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1440 0, 0, 0, 0, 0, 1941, 0, 0, 0, 0,
1441 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1442 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1443 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1444 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1445 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1446 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1447 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1448 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1449 0, 0, 0, 0, 0, 0, 0, 1740, 0, 0,
1450 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1451 2512, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1452 0, 0, 0, 0, 2315, 0, 0, 0, 0, 0,
1453 0, 0, 0, 0, 0, 0, 0, 0, 0, 1546,
1454 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1455 0, 0, 2184, 0, 0, 0, 0, 0, 0, 0,
1456 0, 0, 0, 0, 0, 0, 0, 1424, 0, 0,
1457 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1458 0, 1886, 0, 0, 0, 0, 0, 0, 0, 0,
1459 0, 0, 0, 0, 2625, 0, 0, 0, 0, 0,
1460 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1461 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1462 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1463 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1464 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1465 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1466 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1467 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1468 0, 0, 0, 0, 0, 0, 2564, 0, 0, 0,
1469 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1470 0, 0, 0, 0, 0, 1792, 0, 0, 0, 0,
1471 0, 0, 0, 0, 0, 1497, 0, 0, 0, 0,
1472 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1473 0, 0, 2254, 0, 0, 0, 0, 0, 0, 0,
1474 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1475 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1476 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1477 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1478 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1479 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1480 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1481 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1482 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1483 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1484 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1485 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1486 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1487 0, 0, 0, 0, 0, 1562, 0, 0, 0, 0,
1488 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1489 0, 0, 2322, 0, 0, 0, 0, 0, 0, 0,
1490 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1491 2499, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1492 0, 0, 0, 0, 0, 0, 0, 0, 0, 1724,
1493 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1494 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1495 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1496 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1497 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1498 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1499 0, 0, 0, 0, 0, 0, 0, 1954, 0, 0,
1500 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1501 2666, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1502 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1503 0, 0, 2116, 0, 0, 0, 0, 0, 0, 0,
1504 0, 0, 0, 0, 0, 0, 0, 1371, 0, 0,
1505 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1506 0, 0, 0, 0, 0, 0, 0, 0, 2374, 0,
1507 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1508 0, 0, 0, 1602, 0, 0, 0, 0, 0, 0,
1509 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1510 0, 0, 0, 0, 0, 1675, 0, 0, 0, 0,
1511 0, 0, 0, 0, 0, 0, 0, 0, 2444, 0,
1512 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1513 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1514 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1515 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1516 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1517 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1518 0, 0, 0, 0, 0, 0, 2700, 0, 0, 0,
1519 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1520 0, 0, 0, 0, 0, 2000, 0, 0, 0, 0,
1521 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1522 0, 0, 0, 1334, 0, 0, 0, 0, 0, 0,
1523 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1524 2067, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1525 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1526 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1527 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1528 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1529 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1530 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1531 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1532 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1533 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1534 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1535 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1536 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1537 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1538 0, 0, 0, 0, 0, 0, 0, 1572, 0, 0,
1539 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1540 0, 0, 0, 0, 2335, 0, 0, 0, 0, 0,
1541 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1542 0, 0, 2489, 0, 0, 0, 0, 0, 0, 0,
1543 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1544 0, 1711, 0, 0, 0, 0, 0, 0, 0, 0,
1545 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1546 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1547 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1548 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1549 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1550 0, 0, 0, 0, 0, 0, 0, 0, 0, 1967,
1551 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1552 0, 0, 2676, 0, 0, 0, 0, 0, 0, 0,
1553 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1554 0, 0, 0, 0, 2103, 0, 0, 0, 0, 0,
1555 0, 0, 0, 0, 0, 0, 0, 0, 0, 1361,
1556 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1557 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1558 2384, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1559 0, 0, 0, 0, 0, 1615, 0, 0, 0, 0,
1560 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1561 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0,
1562 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1563 2431, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1564 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1565 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1566 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1567 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1568 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1569 0, 0, 0, 0, 0, 0, 0, 0, 2707, 0,
1570 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1571 0, 0, 0, 0, 0, 0, 0, 2016, 0, 0,
1572 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1573 0, 0, 0, 0, 0, 1327, 0, 0, 0, 0,
1574 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1575 0, 0, 2057, 0, 0, 0, 0, 0, 0, 0,
1576 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1577 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1578 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1579 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1580 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1581 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1582 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1583 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1584 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1585 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1586 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1587 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1588 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1589 0, 0, 0, 0, 0, 1391, 0, 0, 0, 0,
1590 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1591 0, 0, 2142, 0, 0, 0, 0, 0, 0, 0,
1592 0, 0, 2655, 0, 0, 0, 0, 0, 0, 0,
1593 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1594 0, 1925, 0, 0, 0, 0, 0, 0, 0, 0,
1595 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1596 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1597 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1598 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1599 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1600 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1601 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1602 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1603 0, 0, 0, 1750, 0, 0, 0, 0, 0, 0,
1604 0, 0, 0, 0, 0, 0, 2525, 0, 0, 0,
1605 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1606 2299, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1607 0, 0, 0, 0, 0, 1533, 0, 0, 0, 0,
1608 0, 0, 0, 0, 0, 0, 0, 0, 2191, 0,
1609 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1610 0, 0, 0, 1434, 0, 0, 0, 0, 0, 0,
1611 0, 0, 0, 0, 0, 0, 0, 1873, 0, 0,
1612 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1613 2615, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1614 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1615 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1616 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1617 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1618 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1619 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1620 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1621 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1622 0, 0, 2574, 0, 0, 0, 0, 0, 0, 0,
1623 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1624 0, 1805, 0, 0, 0, 0, 0, 0, 0, 0,
1625 0, 1487, 0, 0, 0, 0, 0, 0, 0, 0,
1626 0, 0, 0, 0, 0, 0, 0, 0, 2241, 0,
1627 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1628 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1629 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1630 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1631 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1632 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1633 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1634 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1635 2587, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1636 0, 0, 0, 0, 0, 0, 0, 0, 0, 1821,
1637 0, 0, 0, 0, 0, 0, 0, 0, 0, 1477,
1638 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1639 0, 0, 0, 0, 0, 0, 2228, 0, 0, 0,
1640 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1641 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1642 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1643 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1644 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1645 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1646 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1647 0, 0, 2201, 0, 0, 0, 0, 0, 0, 0,
1648 0, 0, 0, 0, 0, 0, 0, 1447, 0, 0,
1649 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1650 0, 1860, 0, 0, 0, 0, 0, 0, 0, 0,
1651 0, 0, 0, 0, 2605, 0, 0, 0, 0, 0,
1652 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1653 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1654 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1655 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1656 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1657 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1658 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1659 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1660 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1661 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1662 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1663 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1664 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1665 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1666 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1667 0, 0, 0, 1763, 0, 0, 0, 0, 0, 0,
1668 0, 0, 0, 0, 0, 0, 2541, 0, 0, 0,
1669 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1670 2283, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1671 0, 0, 0, 0, 0, 1520, 0, 0, 0, 0,
1672 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1673 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1674 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1675 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1676 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1677 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1678 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1679 0, 1401, 0, 0, 0, 0, 0, 0, 0, 0,
1680 0, 0, 0, 0, 0, 0, 0, 0, 2155, 0,
1681 0, 0, 0, 0, 0, 0, 0, 0, 2642, 0,
1682 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1683 0, 0, 0, 0, 0, 0, 0, 1909, 0, 0,
1684 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1685 2711, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1686 0, 0, 0, 0, 0, 0, 0, 0, 0, 2029,
1687 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1688 0, 0, 0, 0, 0, 0, 0, 1320, 0, 0,
1689 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1690 0, 0, 0, 0, 2047, 0, 0, 0, 0, 0,
1691 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1692 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1693 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1694 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1695 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1696 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1697 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1698 0, 0, 0, 0, 0, 0, 0, 0, 2391, 0,
1699 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1700 0, 0, 0, 1625, 0, 0, 0, 0, 0, 0,
1701 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1702 0, 0, 0, 0, 0, 1655, 0, 0, 0, 0,
1703 0, 0, 0, 0, 0, 0, 0, 0, 2418, 0,
1704 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1705 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1706 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1707 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1708 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1709 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1710 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1711 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1712 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1713 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1714 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1715 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1716 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1717 0, 0, 0, 1977, 0, 0, 0, 0, 0, 0,
1718 0, 0, 0, 0, 0, 0, 2683, 0, 0, 0,
1719 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1720 0, 0, 0, 0, 0, 0, 0, 0, 2090, 0,
1721 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1722 0, 0, 0, 1351, 0, 0, 0, 0, 0, 0,
1723 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1724 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1725 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1726 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1727 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1728 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1729 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1730 0, 0, 0, 0, 0, 0, 0, 1579, 0, 0,
1731 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1732 0, 0, 0, 0, 2345, 0, 0, 0, 0, 0,
1733 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1734 0, 0, 2473, 0, 0, 0, 0, 0, 0, 0,
1735 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1736 0, 1698 };
1737
1738
1739 int VTK_TSYNCHRONIZED_TEMPLATES_3D_TABLE_2[] = {
1740 -1, 0, 1, 2, -1, 0, 4, 3, -1, 3, 1, 2,
1741 4, 3, 2, -1, 3, 7, 5, -1, 0, 1, 2, 3,
1742 7, 5, -1, 4, 7, 5, 0, 4, 5, -1, 5, 1,
1743 2, 5, 2, 7, 7, 2, 4, -1, 1, 5, 6, -1,
1744 0, 5, 6, 2, 0, 6, -1, 3, 0, 4, 5, 6,
1745 1, -1, 3, 5, 6, 3, 6, 4, 4, 6, 2, -1,
1746 1, 3, 7, 6, 1, 7, -1, 0, 3, 7, 0, 7,
1747 2, 2, 7, 6, -1, 1, 0, 4, 1, 4, 6, 6,
1748 4, 7, -1, 4, 7, 2, 7, 6, 2, -1, 8, 2,
1749 9, -1, 8, 0, 1, 9, 8, 1, -1, 0, 4, 3,
1750 2, 9, 8, -1, 8, 4, 3, 8, 3, 9, 9, 3,
1751 1, -1, 3, 7, 5, 2, 9, 8, -1, 1, 9, 8,
1752 1, 8, 0, 3, 7, 5, -1, 4, 7, 5, 4, 5,
1753 0, 2, 9, 8, -1, 5, 4, 7, 5, 9, 4, 5,
1754 1, 9, 9, 8, 4, -1, 2, 9, 8, 1, 5, 6,
1755 -1, 6, 9, 8, 6, 8, 5, 5, 8, 0, -1, 4,
1756 3, 0, 2, 9, 8, 5, 6, 1, -1, 8, 6, 9,
1757 4, 6, 8, 4, 5, 6, 4, 3, 5, -1, 1, 3,
1758 7, 1, 7, 6, 9, 8, 2, -1, 3, 7, 6, 3,
1759 6, 8, 3, 8, 0, 9, 8, 6, -1, 8, 2, 9,
1760 4, 6, 0, 4, 7, 6, 6, 1, 0, -1, 8, 6,
1761 9, 8, 4, 6, 4, 7, 6, -1, 4, 8, 10, -1,
1762 4, 8, 10, 0, 1, 2, -1, 0, 8, 10, 3, 0,
1763 10, -1, 2, 8, 10, 2, 10, 1, 1, 10, 3, -1,
1764 3, 7, 5, 4, 8, 10, -1, 1, 2, 0, 3, 7,
1765 5, 8, 10, 4, -1, 10, 7, 5, 10, 5, 8, 8,
1766 5, 0, -1, 5, 10, 7, 1, 10, 5, 1, 8, 10,
1767 1, 2, 8, -1, 4, 8, 10, 5, 6, 1, -1, 0,
1768 5, 6, 0, 6, 2, 8, 10, 4, -1, 0, 8, 10,
1769 0, 10, 3, 5, 6, 1, -1, 5, 10, 3, 5, 2,
1770 10, 5, 6, 2, 8, 10, 2, -1, 7, 6, 1, 7,
1771 1, 3, 4, 8, 10, -1, 8, 10, 4, 0, 3, 2,
1772 2, 3, 7, 2, 7, 6, -1, 10, 0, 8, 10, 6,
1773 0, 10, 7, 6, 6, 1, 0, -1, 10, 2, 8, 10,
1774 7, 2, 7, 6, 2, -1, 4, 2, 9, 10, 4, 9,
1775 -1, 4, 0, 1, 4, 1, 10, 10, 1, 9, -1, 0,
1776 2, 9, 0, 9, 3, 3, 9, 10, -1, 3, 1, 10,
1777 1, 9, 10, -1, 4, 2, 9, 4, 9, 10, 7, 5,
1778 3, -1, 7, 5, 3, 4, 0, 10, 10, 0, 1, 10,
1779 1, 9, -1, 2, 5, 0, 2, 10, 5, 2, 9, 10,
1780 7, 5, 10, -1, 5, 10, 7, 5, 1, 10, 1, 9,
1781 10, -1, 9, 10, 4, 9, 4, 2, 1, 5, 6, -1,
1782 4, 9, 10, 4, 5, 9, 4, 0, 5, 5, 6, 9,
1783 -1, 5, 6, 1, 0, 2, 3, 3, 2, 9, 3, 9,
1784 10, -1, 6, 3, 5, 6, 9, 3, 9, 10, 3, -1,
1785 4, 2, 10, 2, 9, 10, 7, 1, 3, 7, 6, 1,
1786 -1, 10, 0, 9, 10, 4, 0, 9, 0, 6, 3, 7,
1787 0, 6, 0, 7, -1, 6, 0, 7, 6, 1, 0, 7,
1788 0, 10, 2, 9, 0, 10, 0, 9, -1, 6, 10, 7,
1789 9, 10, 6, -1, 7, 10, 11, -1, 0, 1, 2, 10,
1790 11, 7, -1, 4, 3, 0, 10, 11, 7, -1, 3, 1,
1791 2, 3, 2, 4, 10, 11, 7, -1, 3, 10, 11, 5,
1792 3, 11, -1, 3, 10, 11, 3, 11, 5, 1, 2, 0,
1793 -1, 4, 10, 11, 4, 11, 0, 0, 11, 5, -1, 10,
1794 2, 4, 10, 5, 2, 10, 11, 5, 1, 2, 5, -1,
1795 5, 6, 1, 7, 10, 11, -1, 6, 2, 0, 6, 0,
1796 5, 7, 10, 11, -1, 0, 4, 3, 5, 6, 1, 10,
1797 11, 7, -1, 10, 11, 7, 3, 5, 4, 4, 5, 6,
1798 4, 6, 2, -1, 11, 6, 1, 11, 1, 10, 10, 1,
1799 3, -1, 0, 6, 2, 0, 10, 6, 0, 3, 10, 10,
1800 11, 6, -1, 1, 11, 6, 0, 11, 1, 0, 10, 11,
1801 0, 4, 10, -1, 11, 4, 10, 11, 6, 4, 6, 2,
1802 4, -1, 10, 11, 7, 8, 2, 9, -1, 8, 0, 1,
1803 8, 1, 9, 11, 7, 10, -1, 3, 0, 4, 10, 11,
1804 7, 2, 9, 8, -1, 7, 10, 11, 3, 9, 4, 3,
1805 1, 9, 9, 8, 4, -1, 11, 5, 3, 11, 3, 10,
1806 8, 2, 9, -1, 3, 10, 5, 10, 11, 5, 1, 8,
1807 0, 1, 9, 8, -1, 2, 9, 8, 4, 10, 0, 0,
1808 10, 11, 0, 11, 5, -1, 9, 4, 1, 9, 8, 4,
1809 1, 4, 5, 10, 11, 4, 5, 4, 11, -1, 1, 5,
1810 6, 9, 8, 2, 7, 10, 11, -1, 10, 11, 7, 8,
1811 5, 9, 8, 0, 5, 5, 6, 9, -1, 0, 4, 3,
1812 8, 2, 9, 5, 6, 1, 10, 11, 7, -1, 4, 3,
1813 5, 4, 5, 6, 4, 6, 8, 9, 8, 6, 10, 11,
1814 7, -1, 2, 9, 8, 1, 10, 6, 1, 3, 10, 10,
1815 11, 6, -1, 10, 6, 3, 10, 11, 6, 3, 6, 0,
1816 9, 8, 6, 0, 6, 8, -1, 0, 4, 10, 0, 10,
1817 11, 0, 11, 1, 6, 1, 11, 2, 9, 8, -1, 11,
1818 4, 10, 11, 6, 4, 8, 4, 9, 9, 4, 6, -1,
1819 7, 4, 8, 11, 7, 8, -1, 8, 11, 7, 8, 7,
1820 4, 0, 1, 2, -1, 7, 3, 0, 7, 0, 11, 11,
1821 0, 8, -1, 2, 3, 1, 2, 11, 3, 2, 8, 11,
1822 11, 7, 3, -1, 3, 4, 8, 3, 8, 5, 5, 8,
1823 11, -1, 1, 2, 0, 3, 4, 5, 5, 4, 8, 5,
1824 8, 11, -1, 0, 8, 5, 8, 11, 5, -1, 2, 5,
1825 1, 2, 8, 5, 8, 11, 5, -1, 7, 4, 8, 7,
1826 8, 11, 6, 1, 5, -1, 0, 5, 2, 5, 6, 2,
1827 8, 7, 4, 8, 11, 7, -1, 1, 5, 6, 0, 11,
1828 3, 0, 8, 11, 11, 7, 3, -1, 11, 3, 8, 11,
1829 7, 3, 8, 3, 2, 5, 6, 3, 2, 3, 6, -1,
1830 4, 8, 11, 4, 11, 1, 4, 1, 3, 6, 1, 11,
1831 -1, 2, 3, 6, 2, 0, 3, 6, 3, 11, 4, 8,
1832 3, 11, 3, 8, -1, 1, 11, 6, 1, 0, 11, 0,
1833 8, 11, -1, 11, 2, 8, 6, 2, 11, -1, 9, 11,
1834 7, 9, 7, 2, 2, 7, 4, -1, 0, 1, 9, 0,
1835 9, 7, 0, 7, 4, 11, 7, 9, -1, 7, 9, 11,
1836 3, 9, 7, 3, 2, 9, 3, 0, 2, -1, 7, 9,
1837 11, 7, 3, 9, 3, 1, 9, -1, 3, 11, 5, 3,
1838 2, 11, 3, 4, 2, 2, 9, 11, -1, 5, 4, 11,
1839 5, 3, 4, 11, 4, 9, 0, 1, 4, 9, 4, 1,
1840 -1, 9, 0, 2, 9, 11, 0, 11, 5, 0, -1, 9,
1841 5, 1, 11, 5, 9, -1, 5, 6, 1, 7, 2, 11,
1842 7, 4, 2, 2, 9, 11, -1, 5, 9, 0, 5, 6,
1843 9, 0, 9, 4, 11, 7, 9, 4, 9, 7, -1, 3,
1844 0, 2, 3, 2, 9, 3, 9, 7, 11, 7, 9, 5,
1845 6, 1, -1, 6, 3, 5, 6, 9, 3, 7, 3, 11,
1846 11, 3, 9, -1, 2, 11, 4, 2, 9, 11, 4, 11,
1847 3, 6, 1, 11, 3, 11, 1, -1, 0, 3, 4, 6,
1848 9, 11, -1, 9, 0, 2, 9, 11, 0, 1, 0, 6,
1849 6, 0, 11, -1, 9, 11, 6, -1, 9, 6, 11, -1,
1850 1, 2, 0, 6, 11, 9, -1, 0, 4, 3, 6, 11,
1851 9, -1, 2, 4, 3, 2, 3, 1, 6, 11, 9, -1,
1852 7, 5, 3, 11, 9, 6, -1, 3, 7, 5, 1, 2,
1853 0, 11, 9, 6, -1, 5, 0, 4, 5, 4, 7, 11,
1854 9, 6, -1, 11, 9, 6, 5, 1, 7, 7, 1, 2,
1855 7, 2, 4, -1, 9, 1, 5, 11, 9, 5, -1, 9,
1856 2, 0, 9, 0, 11, 11, 0, 5, -1, 5, 11, 9,
1857 5, 9, 1, 0, 4, 3, -1, 3, 5, 11, 3, 11,
1858 2, 3, 2, 4, 2, 11, 9, -1, 7, 11, 9, 7,
1859 9, 3, 3, 9, 1, -1, 7, 11, 9, 3, 7, 9,
1860 3, 9, 2, 3, 2, 0, -1, 0, 9, 1, 0, 7,
1861 9, 0, 4, 7, 11, 9, 7, -1, 9, 7, 11, 9,
1862 2, 7, 2, 4, 7, -1, 11, 8, 2, 6, 11, 2,
1863 -1, 1, 6, 11, 1, 11, 0, 0, 11, 8, -1, 2,
1864 6, 11, 2, 11, 8, 4, 3, 0, -1, 4, 11, 8,
1865 4, 1, 11, 4, 3, 1, 6, 11, 1, -1, 11, 8,
1866 2, 11, 2, 6, 5, 3, 7, -1, 3, 7, 5, 1,
1867 6, 0, 0, 6, 11, 0, 11, 8, -1, 8, 2, 6,
1868 8, 6, 11, 0, 4, 5, 5, 4, 7, -1, 7, 1,
1869 4, 7, 5, 1, 4, 1, 8, 6, 11, 1, 8, 1,
1870 11, -1, 2, 1, 5, 2, 5, 8, 8, 5, 11, -1,
1871 0, 5, 8, 8, 5, 11, -1, 3, 0, 4, 5, 8,
1872 1, 5, 11, 8, 8, 2, 1, -1, 3, 8, 4, 3,
1873 5, 8, 5, 11, 8, -1, 2, 1, 3, 2, 3, 11,
1874 2, 11, 8, 11, 3, 7, -1, 7, 0, 3, 7, 11,
1875 0, 11, 8, 0, -1, 8, 1, 11, 8, 2, 1, 11,
1876 1, 7, 0, 4, 1, 7, 1, 4, -1, 7, 8, 4,
1877 11, 8, 7, -1, 8, 10, 4, 9, 6, 11, -1, 0,
1878 1, 2, 8, 10, 4, 6, 11, 9, -1, 10, 3, 0,
1879 10, 0, 8, 9, 6, 11, -1, 6, 11, 9, 2, 8,
1880 1, 1, 8, 10, 1, 10, 3, -1, 4, 8, 10, 7,
1881 5, 3, 9, 6, 11, -1, 11, 9, 6, 3, 7, 5,
1882 0, 1, 2, 8, 10, 4, -1, 9, 6, 11, 10, 7,
1883 8, 8, 7, 5, 8, 5, 0, -1, 1, 2, 8, 1,
1884 8, 10, 1, 10, 5, 7, 5, 10, 6, 11, 9, -1,
1885 9, 1, 5, 9, 5, 11, 10, 4, 8, -1, 4, 8,
1886 10, 0, 11, 2, 0, 5, 11, 11, 9, 2, -1, 1,
1887 5, 11, 1, 11, 9, 3, 0, 10, 10, 0, 8, -1,
1888 11, 2, 5, 11, 9, 2, 5, 2, 3, 8, 10, 2,
1889 3, 2, 10, -1, 4, 8, 10, 7, 11, 3, 3, 11,
1890 9, 3, 9, 1, -1, 3, 7, 11, 3, 11, 9, 3,
1891 9, 0, 2, 0, 9, 4, 8, 10, -1, 8, 7, 0,
1892 8, 10, 7, 0, 7, 1, 11, 9, 7, 1, 7, 9,
1893 -1, 9, 7, 11, 9, 2, 7, 10, 7, 8, 8, 7,
1894 2, -1, 11, 10, 4, 11, 4, 6, 6, 4, 2, -1,
1895 1, 6, 11, 0, 1, 11, 0, 11, 10, 0, 10, 4,
1896 -1, 0, 2, 6, 0, 6, 10, 0, 10, 3, 10, 6,
1897 11, -1, 11, 1, 6, 11, 10, 1, 10, 3, 1, -1,
1898 3, 7, 5, 4, 6, 10, 4, 2, 6, 6, 11, 10,
1899 -1, 0, 1, 6, 0, 6, 11, 0, 11, 4, 10, 4,
1900 11, 3, 7, 5, -1, 6, 10, 2, 6, 11, 10, 2,
1901 10, 0, 7, 5, 10, 0, 10, 5, -1, 11, 1, 6,
1902 11, 10, 1, 5, 1, 7, 7, 1, 10, -1, 10, 4,
1903 2, 10, 2, 5, 10, 5, 11, 1, 5, 2, -1, 4,
1904 11, 10, 4, 0, 11, 0, 5, 11, -1, 3, 2, 10,
1905 3, 0, 2, 10, 2, 11, 1, 5, 2, 11, 2, 5,
1906 -1, 3, 11, 10, 5, 11, 3, -1, 3, 11, 1, 3,
1907 7, 11, 1, 11, 2, 10, 4, 11, 2, 11, 4, -1,
1908 7, 0, 3, 7, 11, 0, 4, 0, 10, 10, 0, 11,
1909 -1, 0, 2, 1, 10, 7, 11, -1, 7, 11, 10, -1,
1910 6, 7, 10, 9, 6, 10, -1, 6, 7, 10, 6, 10,
1911 9, 2, 0, 1, -1, 10, 9, 6, 10, 6, 7, 3,
1912 0, 4, -1, 7, 10, 9, 7, 9, 6, 4, 3, 2,
1913 2, 3, 1, -1, 6, 5, 3, 6, 3, 9, 9, 3,
1914 10, -1, 0, 1, 2, 3, 9, 5, 3, 10, 9, 9,
1915 6, 5, -1, 4, 10, 9, 4, 9, 5, 4, 5, 0,
1916 5, 9, 6, -1, 9, 5, 10, 9, 6, 5, 10, 5,
1917 4, 1, 2, 5, 4, 5, 2, -1, 5, 7, 10, 5,
1918 10, 1, 1, 10, 9, -1, 2, 0, 5, 2, 5, 10,
1919 2, 10, 9, 7, 10, 5, -1, 4, 3, 0, 10, 1,
1920 7, 10, 9, 1, 1, 5, 7, -1, 4, 5, 2, 4,
1921 3, 5, 2, 5, 9, 7, 10, 5, 9, 5, 10, -1,
1922 3, 10, 1, 1, 10, 9, -1, 0, 9, 2, 0, 3,
1923 9, 3, 10, 9, -1, 4, 1, 0, 4, 10, 1, 10,
1924 9, 1, -1, 4, 9, 2, 10, 9, 4, -1, 10, 8,
1925 2, 10, 2, 7, 7, 2, 6, -1, 10, 8, 0, 10,
1926 0, 6, 10, 6, 7, 6, 0, 1, -1, 0, 4, 3,
1927 2, 7, 8, 2, 6, 7, 7, 10, 8, -1, 7, 8,
1928 6, 7, 10, 8, 6, 8, 1, 4, 3, 8, 1, 8,
1929 3, -1, 5, 3, 10, 5, 10, 2, 5, 2, 6, 8,
1930 2, 10, -1, 0, 6, 8, 0, 1, 6, 8, 6, 10,
1931 5, 3, 6, 10, 6, 3, -1, 0, 10, 5, 0, 4,
1932 10, 5, 10, 6, 8, 2, 10, 6, 10, 2, -1, 4,
1933 10, 8, 5, 1, 6, -1, 5, 7, 10, 1, 5, 10,
1934 1, 10, 8, 1, 8, 2, -1, 10, 5, 7, 10, 8,
1935 5, 8, 0, 5, -1, 1, 5, 7, 1, 7, 10, 1,
1936 10, 2, 8, 2, 10, 0, 4, 3, -1, 10, 5, 7,
1937 10, 8, 5, 3, 5, 4, 4, 5, 8, -1, 2, 10,
1938 8, 2, 1, 10, 1, 3, 10, -1, 0, 10, 8, 3,
1939 10, 0, -1, 2, 10, 8, 2, 1, 10, 4, 10, 0,
1940 0, 10, 1, -1, 4, 10, 8, -1, 8, 9, 6, 8,
1941 6, 4, 4, 6, 7, -1, 0, 1, 2, 8, 9, 4,
1942 4, 9, 6, 4, 6, 7, -1, 3, 6, 7, 3, 8,
1943 6, 3, 0, 8, 9, 6, 8, -1, 1, 8, 3, 1,
1944 2, 8, 3, 8, 7, 9, 6, 8, 7, 8, 6, -1,
1945 8, 9, 6, 4, 8, 6, 4, 6, 5, 4, 5, 3,
1946 -1, 4, 8, 9, 4, 9, 6, 4, 6, 3, 5, 3,
1947 6, 0, 1, 2, -1, 6, 8, 9, 6, 5, 8, 5,
1948 0, 8, -1, 6, 8, 9, 6, 5, 8, 2, 8, 1,
1949 1, 8, 5, -1, 5, 7, 4, 5, 4, 9, 5, 9,
1950 1, 9, 4, 8, -1, 4, 9, 7, 4, 8, 9, 7,
1951 9, 5, 2, 0, 9, 5, 9, 0, -1, 1, 7, 9,
1952 1, 5, 7, 9, 7, 8, 3, 0, 7, 8, 7, 0,
1953 -1, 3, 5, 7, 2, 8, 9, -1, 8, 3, 4, 8,
1954 9, 3, 9, 1, 3, -1, 8, 3, 4, 8, 9, 3,
1955 0, 3, 2, 2, 3, 9, -1, 8, 1, 0, 9, 1,
1956 8, -1, 8, 9, 2, -1, 4, 2, 7, 7, 2, 6,
1957 -1, 1, 4, 0, 1, 6, 4, 6, 7, 4, -1, 0,
1958 7, 3, 0, 2, 7, 2, 6, 7, -1, 1, 7, 3,
1959 6, 7, 1, -1, 3, 6, 5, 3, 4, 6, 4, 2,
1960 6, -1, 1, 4, 0, 1, 6, 4, 3, 4, 5, 5,
1961 4, 6, -1, 0, 6, 5, 2, 6, 0, -1, 1, 6,
1962 5, -1, 5, 2, 1, 5, 7, 2, 7, 4, 2, -1,
1963 4, 5, 7, 0, 5, 4, -1, 5, 2, 1, 5, 7,
1964 2, 0, 2, 3, 3, 2, 7, -1, 3, 5, 7, -1,
1965 3, 2, 1, 4, 2, 3, -1, 0, 3, 4, -1, 0,
1966 2, 1, -1 };
1967